FineKernelToolKit 4.2.13
|
四元数(クォータニオン)を管理するクラス [詳解]
#include <FK/Quaternion.h>
公開メンバ関数 | |
fk_Quaternion (void) | |
コンストラクタ1 | |
fk_Quaternion (double s, double x, double y, double z) | |
コンストラクタ2 | |
fk_Quaternion (const double s, const fk_Vector &v) | |
コンストラクタ3 | |
fk_Quaternion (const fk_Quaternion &) | |
コピーコンストラクタ | |
単項演算子 | |
fk_Quaternion & | operator- (void) const |
単項マイナス演算子 | |
fk_Quaternion & | operator~ (void) const |
単項共役演算子 | |
fk_Quaternion & | operator! (void) const |
単項逆元演算子 | |
比較演算子 | |
bool | operator== (const fk_Quaternion &) const |
同値比較演算子 | |
bool | operator!= (const fk_Quaternion &) const |
異値比較演算子 | |
代入演算子 | |
fk_Quaternion & | operator= (const fk_Quaternion &) |
単純代入演算子 | |
fk_Quaternion & | operator*= (const fk_Quaternion &) |
積代入演算子 | |
fk_Quaternion & | operator*= (double) |
スカラー倍代入演算子 | |
fk_Quaternion & | operator/= (double) |
スカラー商代入演算子 | |
fk_Quaternion & | operator+= (const fk_Quaternion &) |
単項和代入演算子 | |
fk_Quaternion & | operator-= (const fk_Quaternion &) |
単項差代入演算子 | |
メンバ関数 | |
void | init (void) |
初期化関数 | |
void | set (double s, double x, double y, double z) |
成分設定関数1 | |
void | set (double s, const fk_Vector &v) |
成分設定関数2 | |
void | setRotate (double theta, double x, double y, double z) |
回転変換設定関数1 | |
void | setRotate (double theta, const fk_Vector &V) |
回転変換設定関数2 | |
void | makeEuler (double h, double p, double b) |
オイラー角変換設定関数1 | |
void | makeEuler (const fk_Angle &angle) |
オイラー角変換設定関数1 | |
fk_Angle & | getEuler (void) const |
オイラー角取得関数 | |
double | norm (void) const |
ノルム取得関数 | |
double | abs (void) const |
絶対値取得関数 | |
bool | normalize (void) |
正規化関数 | |
void | conj (void) |
共役化関数 | |
bool | inverse (void) |
逆元化関数 | |
fk_Matrix & | conv (void) const |
行列変換関数 | |
公開変数類 | |
double | s |
スカラー部 | |
fk_Vector | v |
ベクトル部 | |
四元数(クォータニオン)を管理するクラス
このクラスは、四元数(クォータニオン)の様々な機能を提供します。 四元数とは、3種類の虚数単位 \( i, j, k \) と 4 個の実数 \( s, x, y, z \) を用いて
\[ \mathbf{q} = s + xi + yj + zk \]
という形式で表現される数のことで、「ハミルトン数」とも呼ばれます。 3Dグラフィックス分野での主な利用用途は、3次元の姿勢補間です。 四元数の補間については fk_Math を参照して下さい。
上記定義式のうち、s を「スカラー部」、(x, y, z) を「ベクトル部」と呼びます。 fk_Quaternion クラスでは、スカラー部を double 型の「s」というメンバ、 ベクトル部を fk_Vector 型の「v」というメンバで保持します。 従って、変数名を q としたときの各成分は q.s, q.v.x, q.v.y, q.v.z となります。これらは、全て public メンバとなっているため、 直接代入や参照を行うことが可能です。
四元数は、数学的には任意軸回転変換を表現します。 一つの四元数 \( \mathbf{q} \) は3次元ベクトル \(\mathbf{V}\) に対し、
\[ \mathbf{V}' = \mathbf{q}\mathbf{V}\mathbf{q}^{-1} \]
という演算によって回転変換したベクトル \(\mathbf{V}'\) を求めることができます。 また、四元数の積演算が合成変換を意味します。
その他の数学的性質については、各演算子やメンバ関数の項目で解説します。
FK::fk_Quaternion::fk_Quaternion | ( | void | ) |
コンストラクタ1
引数なしの場合、全ての成分が 0 である四元数を生成します。 特に、スカラー部も 0 であることに注意して下さい。
FK::fk_Quaternion::fk_Quaternion | ( | double | s, |
double | x, | ||
double | y, | ||
double | z | ||
) |
コンストラクタ2
4個の実数を引数とするコンストラクタによって、 各成分を個別に初期設定できます。
四元数の成分は、回転角や回転軸を直接表すものではありません。 回転角と回転軸を設定したい場合は、 setRotate() を使用して下さい。
[in] | s | スカラー部設定値 |
[in] | x | ベクトル部 x 成分設定値 |
[in] | y | ベクトル部 y 成分設定値 |
[in] | z | ベクトル部 z 成分設定値 |
FK::fk_Quaternion::fk_Quaternion | ( | const double | s, |
const fk_Vector & | v | ||
) |
コンストラクタ3
1個の実数と1個の fk_Vector 型変数を引数とするコンストラクタによって、 スカラー部とベクトル部をそれぞれ初期設定できます。
四元数の成分は、回転角や回転軸を直接表すものではありません。 回転角と回転軸を設定したい場合は、 setRotate() を使用して下さい。
[in] | s | スカラー部設定値 |
[in] | v | ベクトル部設定値 |
FK::fk_Quaternion::fk_Quaternion | ( | const fk_Quaternion & | ) |
コピーコンストラクタ
fk_Quaternion & FK::fk_Quaternion::operator- | ( | void | ) | const |
単項マイナス演算子
四元数 \(\mathbf{q} = s + xi + yj + zk\) に対し、
\[ -\mathbf{q} = -s-xi-yj-zk \]
として符号は定義されます。以下のコードは、q2 に -q1 を代入します。
q2 = -q1;
fk_Quaternion & FK::fk_Quaternion::operator~ | ( | void | ) | const |
単項共役演算子
四元数 \(\mathbf{q} = s + xi + yj + zk\) に対し、
\[ \overline{\mathbf{q}} = s-xi-yj-zk \]
として共役 \(\overline{\mathbf{q}}\)は定義されます。 以下のコードは、q2 に q1 の共役を代入します。
q2 = ~q1;
正規化された四元数 \(\mathbf{q}\) が回転を現すとき、 共役四元数 \(\overline{\mathbf{q}}\) は \(\mathbf{q}\) の逆回転を表します。
fk_Quaternion & FK::fk_Quaternion::operator! | ( | void | ) | const |
bool FK::fk_Quaternion::operator== | ( | const fk_Quaternion & | ) | const |
同値比較演算子
fk_Quaternion では、以下のように記述することで、 q1 と q2 が等しいかどうかを判断できます。
if(q1 == q2) { : : }
ここでの比較は、ある程度の計算誤差を許容します。
bool FK::fk_Quaternion::operator!= | ( | const fk_Quaternion & | ) | const |
異値比較演算子
fk_Quaternion では、以下のように記述することで、 q1 と q2 が等しくないかどうかを判断できます。
if(q1 != q2) { : : }
ここでの比較は、ある程度の計算誤差を許容します。
fk_Quaternion & FK::fk_Quaternion::operator= | ( | const fk_Quaternion & | ) |
単純代入演算子
fk_Quaternion & FK::fk_Quaternion::operator*= | ( | const fk_Quaternion & | ) |
積代入演算子
以下のコードは、四元数 q1 および q2 の積を 前の q1 の値は破棄して改めて q1 に設定します。
q1 *= q2;
これは、以下のコードと同義です。
q1 = q1 * q2;
fk_Quaternion & FK::fk_Quaternion::operator*= | ( | double | ) |
スカラー倍代入演算子
以下のコードは、四元数 q の全ての成分を d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。
q *= d;
d は変数でなく数値でも構いません。
q *= 2.0;
fk_Quaternion & FK::fk_Quaternion::operator/= | ( | double | ) |
スカラー商代入演算子
以下のコードは、四元数 q の全ての成分を 1/d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。
q /= d;
d は変数でなく数値でも構いません。
q /= 2.0;
fk_Quaternion & FK::fk_Quaternion::operator+= | ( | const fk_Quaternion & | ) |
単項和代入演算子
以下のコードは、q1 に q2 分を加算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。
q1 += q2;
上記コードは、以下のコードと同義です。
q1 = q1 + q2;
fk_Quaternion & FK::fk_Quaternion::operator-= | ( | const fk_Quaternion & | ) |
単項差代入演算子
以下のコードは、q1 に q2 分を減算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。
q1 -= q2;
上記コードは、以下のコードと同義です。
q1 = q1 - q2;
void FK::fk_Quaternion::init | ( | void | ) |
初期化関数
スカラー部を 1 に、ベクトル部を零ベクトルとして初期化します。
void FK::fk_Quaternion::set | ( | double | s, |
double | x, | ||
double | y, | ||
double | z | ||
) |
成分設定関数1
各成分を個別に設定します。
ここで与えられるスカラー部とベクトル部は、 回転角や回転軸を表すわけではないことに注意して下さい。 回転変換における回転角と回転軸を設定する場合は、 setRotate() を用います。
[in] | s | スカラー部設定値 |
[in] | x | ベクトル部 x 成分設定値 |
[in] | y | ベクトル部 y 成分設定値 |
[in] | z | ベクトル部 z 成分設定値 |
void FK::fk_Quaternion::set | ( | double | s, |
const fk_Vector & | v | ||
) |
成分設定関数2
1個の実数と1個の fk_Vector 型変数から、 スカラー部とベクトル部をそれぞれ設定します。
ここで与えられるスカラー部とベクトル部は、 回転角や回転軸を表すわけではないことに注意して下さい。 回転変換における回転角と回転軸を設定する場合は、 setRotate() を用います。
[in] | s | スカラー部設定値 |
[in] | v | ベクトル部設定値 |
void FK::fk_Quaternion::setRotate | ( | double | theta, |
double | x, | ||
double | y, | ||
double | z | ||
) |
回転変換設定関数1
回転角を theta、回転軸を (x, y, z) とする回転変換を表す四元数を設定します。 回転軸は正規化されている必要はありません。
具体的に設定される成分値は、回転角を \(\theta\) とし、 回転軸を表すベクトルを \(\mathbf{V}\) としたとき、 スカラー部は \(\cos\frac{\theta}{2}\) が、 ベクトル部は \(\frac{\mathbf{V}}{|\mathbf{V}|}\sin\frac{\theta}{2}\) が設定されます。
ここで与えられた値と、設定される成分値は異なることに注意してください。 成分値を直接代入するには set() を用います。
[in] | theta | 回転角 |
[in] | x | 回転軸の x 成分 |
[in] | y | 回転軸の y 成分 |
[in] | z | 回転軸の z 成分 |
void FK::fk_Quaternion::setRotate | ( | double | theta, |
const fk_Vector & | V | ||
) |
回転変換設定関数2
回転角を theta、回転軸を V とする回転変換を表す四元数を設定します。 回転軸は正規化されている必要はありません。
具体的に設定される成分値は、回転角を \(\theta\) とし、 回転軸を表すベクトルを \(\mathbf{V}\) としたとき、 スカラー部は \(\cos\frac{\theta}{2}\) が、 ベクトル部は \(\frac{\mathbf{V}}{|\mathbf{V}|}\sin\frac{\theta}{2}\) が設定されます。
ここで与えられた値と、設定される成分値は異なることに注意してください。 成分値を直接代入するには set() を用います。
[in] | theta | 回転角 |
[in] | V | 回転軸ベクトル |
void FK::fk_Quaternion::makeEuler | ( | double | h, |
double | p, | ||
double | b | ||
) |
オイラー角変換設定関数1
原点を中心とする物体が、 オイラー角 (0, 0, 0) から (h, p, b) の状態に回転する変換を表す四元数を設定します。 オイラー角についての解説は、 fk_Angle を参照して下さい。
[in] | h | ヘディング角 |
[in] | p | ピッチ角 |
[in] | b | バンク角 |
void FK::fk_Quaternion::makeEuler | ( | const fk_Angle & | angle | ) |
オイラー角変換設定関数1
原点を中心とする物体が、 オイラー角 (0, 0, 0) から angle が表すオイラー角の状態に回転する変換を表す四元数を設定します。 オイラー角についての解説は、 fk_Angle を参照して下さい。
[in] | angle | オイラー角 |
fk_Angle & FK::fk_Quaternion::getEuler | ( | void | ) | const |
オイラー角取得関数
四元数を回転変換として解釈したときに、 オイラー角 (0, 0, 0) の状態の物体が回転したときの 姿勢状態を示すオイラー角を返します。 オイラー角についての解説は、 fk_Angle を参照して下さい。
double FK::fk_Quaternion::norm | ( | void | ) | const |
ノルム取得関数
四元数 \(\mathbf{q}\) のノルム値 \(|\mathbf{q}|^2\) を返します。 \(\mathbf{q} = s + xi + yj + zk\) のノルム値は、 以下のように定義されます。
\[ |\mathbf{q}|^2 = s^2 + x^2 + y^2 + z^2 \]
double FK::fk_Quaternion::abs | ( | void | ) | const |
絶対値取得関数
四元数 \(\mathbf{q}\) の絶対値 \(|\mathbf{q}|\) を返します。 \(\mathbf{q} = s + xi + yj + zk\) の絶対値は、 以下のように定義されます。
\[ |\mathbf{q}| = \sqrt{s^2 + x^2 + y^2 + z^2} \]
bool FK::fk_Quaternion::normalize | ( | void | ) |
正規化関数
四元数を正規化します。正規化とは、元の四元数の成分を絶対値で割ることで、 絶対値が 1 である四元数を求めることです。 全ての成分が 0 である場合のみ、正規化できません。
void FK::fk_Quaternion::conj | ( | void | ) |
共役化関数
現在設定されている四元数に対し、自身を共役化します。
四元数 \(\mathbf{q} = s + xi + yj + zk\) に対し、
\[ \overline{\mathbf{q}} = s-xi-yj-zk \]
として共役 \(\overline{\mathbf{q}}\)は定義されます。 正規化された四元数 \(\mathbf{q}\) が回転を現すとき、 共役四元数 \(\overline{\mathbf{q}}\) は \(\mathbf{q}\) の逆回転を表します。
bool FK::fk_Quaternion::inverse | ( | void | ) |
逆元化関数
現在設定されている四元数に対し、自身を逆元化します。
四元数 \(\mathbf{q} = s + xi + yj + zk\) に対し、
\[ \mathbf{q}^{-1} = \frac{\overline{\mathbf{q}}}{|\mathbf{q}|^2} \]
として逆元 \(\mathbf{q}^{-1}\) は定義されます。
四元数が正規である(つまり、ノルムが1である)場合、 四元数の逆元と共役は等しくなります。 また、四元数によるベクトル変換を考えたとき、逆元は逆変換を表します。
fk_Matrix & FK::fk_Quaternion::conv | ( | void | ) | const |
行列変換関数
四元数を回転変換と考えたときの、同じ回転変換を意味する行列を返します。
double FK::fk_Quaternion::s |
スカラー部
fk_Vector FK::fk_Quaternion::v |
ベクトル部