FineKernelToolKit 4.2.13
|
四元数(クォータニオン)を管理するクラス [詳解]
#include <CLI/FK_CLI/include/Quaternion_CLI.h>
公開メンバ関数 | |
fk_Quaternion () | |
コンストラクタ1 | |
fk_Quaternion (double s, double x, double y, double z) | |
コンストラクタ2 | |
fk_Quaternion (double s, fk_Vector^ v) | |
コンストラクタ3 | |
fk_Quaternion (fk_Quaternion^ Q) | |
コピーコンストラクタ | |
~fk_Quaternion () | |
デストラクタ | |
!fk_Quaternion () | |
ファイナライザ | |
bool | Equals (fk_Quaternion^ Q) |
同値比較メソッド1 | |
virtual bool | Equals (Object^ O) override |
同値比較メソッド2 | |
String ^ | ToString () override |
文字列出力メソッド | |
void | Init (void) |
初期化メソッド | |
void | Set (double s, double x, double y, double z) |
成分設定メソッド1 | |
void | Set (double s, fk_Vector^ v) |
成分設定メソッド2 | |
void | SetRotate (double theta, double x, double y, double z) |
回転変換設定メソッド1 | |
void | SetRotate (double theta, fk_Vector^ V) |
回転変換設定メソッド2 | |
bool | Normalize (void) |
正規化メソッド | |
void | Conj (void) |
共役化メソッド | |
bool | Inverse (void) |
逆元化メソッド | |
fk_Quaternion ^ | GetInverse (void) |
逆元取得メソッド | |
静的公開メンバ関数 | |
単項演算子 | |
static fk_Quaternion ^ | operator- (fk_Quaternion^ argQ) |
単項マイナス演算子 | |
static fk_Quaternion ^ | operator~ (fk_Quaternion^ argQ) |
単項共役演算子 | |
二項演算子 | |
static fk_Quaternion ^ | operator* (fk_Quaternion^ Q1, fk_Quaternion^ Q2) |
四元数積二項演算子 | |
static fk_Quaternion ^ | operator+ (fk_Quaternion^ Q1, fk_Quaternion^ Q2) |
四元数和二項演算子 | |
static fk_Quaternion ^ | operator- (fk_Quaternion^ Q1, fk_Quaternion^ Q2) |
四元数差二項演算子 | |
static fk_Quaternion ^ | operator* (fk_Quaternion^ Q, double D) |
四元数スカラー倍二項演算子1 | |
static fk_Quaternion ^ | operator* (double D, fk_Quaternion^ Q) |
四元数スカラー倍二項演算子2 | |
static fk_Quaternion ^ | operator/ (fk_Quaternion^ Q, double D) |
四元数スカラー商二項演算子 | |
static fk_Vector ^ | operator* (fk_Quaternion^ Q, fk_Vector^ V) |
四元数ベクトル変換二項演算子 | |
static double | operator^ (fk_Quaternion^ Q1, fk_Quaternion^ Q2) |
四元数内積二項演算子 | |
代入演算子 | |
static void | operator*= (fk_Quaternion^ Q1, fk_Quaternion^ Q2) |
積代入演算子 | |
static void | operator*= (fk_Quaternion^ Q1, double D) |
スカラー倍代入演算子 | |
static void | operator/= (fk_Quaternion^ Q, double D) |
スカラー商代入演算子 | |
static void | operator+= (fk_Quaternion^ Q1, fk_Quaternion^ Q2) |
単項和代入演算子 | |
static void | operator-= (fk_Quaternion^ Q1, fk_Quaternion^ Q2) |
単項差代入演算子 | |
プロパティ | |
double | s [get, set] |
四元数スカラー部成分プロパティ | |
double | x [get, set] |
四元数ベクトル部 x 成分プロパティ | |
double | y [get, set] |
四元数ベクトル部 y 成分プロパティ | |
double | z [get, set] |
四元数ベクトル部 z 成分プロパティ | |
fk_Vector^ | v [get, set] |
四元数ベクトル部プロパティ | |
fk_Angle^ | Euler [get, set] |
オイラー角プロパティ | |
double | Norm [get] |
ノルムプロパティ | |
double | Abs [get] |
絶対値プロパティ | |
fk_Matrix^ | Matrix [get] |
行列プロパティ | |
四元数(クォータニオン)を管理するクラス
このクラスは、四元数(クォータニオン)の様々な機能を提供します。 四元数とは、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」というプロパティで参照や設定を行うことができます。 また、ベクトル部の各成分 x, y, z を個別にプロパティで参照や設定を行うことも可能です。
四元数は、数学的には任意軸回転変換を表現します。 一つの四元数 \( \mathbf{q} \) は3次元ベクトル \(\mathbf{V}\) に対し、
\[ \mathbf{V}' = \mathbf{q}\mathbf{V}\mathbf{q}^{-1} \]
という演算によって回転変換したベクトル \(\mathbf{V}'\) を求めることができます。 また、四元数の積演算が合成変換を意味します。
その他の数学的性質については、各演算子やメソッドの項目で解説します。
FK_CLI::fk_Quaternion::fk_Quaternion | ( | ) |
コンストラクタ1
引数なしの場合、全ての成分が 0 である四元数を生成します。 特に、スカラー部も 0 であることに注意して下さい。
FK_CLI::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_CLI::fk_Quaternion::fk_Quaternion | ( | double | s, |
fk_Vector^ | v | ||
) |
コンストラクタ3
1個の実数と1個の fk_Vector 型変数を引数とするコンストラクタによって、 スカラー部とベクトル部をそれぞれ初期設定できます。
四元数の成分は、回転角や回転軸を直接表すものではありません。 回転角と回転軸を設定したい場合は、 SetRotate() を使用して下さい。
[in] | s | スカラー部設定値 |
[in] | v | ベクトル部設定値 |
FK_CLI::fk_Quaternion::fk_Quaternion | ( | fk_Quaternion^ | Q | ) |
コピーコンストラクタ
FK_CLI::fk_Quaternion::~fk_Quaternion | ( | ) |
デストラクタ
FK_CLI::fk_Quaternion::!fk_Quaternion | ( | ) |
ファイナライザ
bool FK_CLI::fk_Quaternion::Equals | ( | fk_Quaternion^ | Q | ) |
同値比較メソッド1
2つの四元数の値が同値かどうかを判定します。 単純に == 演算子を用いた場合はインスタンスが同一であるかどうかの判定となるため、 異なるインスタンスで同値かどうかを判定する場合はこのメソッドを利用して下さい。
[in] | Q | 同値かどうかを判定する四元数 |
|
overridevirtual |
同値比較メソッド2
2つの四元数の値が同値かどうかを判定します。 単純に == 演算子を用いた場合はインスタンスが同一であるかどうかの判定となるため、 異なるインスタンスで同値かどうかを判定する場合はこのメソッドを利用して下さい。
[in] | O | 同値かどうかを判定する四元数 |
|
static |
単項マイナス演算子
四元数 \(\mathbf{q} = s + xi + yj + zk\) に対し、
\[ -\mathbf{q} = -s-xi-yj-zk \]
として符号は定義されます。以下のコードは、q2 に -q1 を代入します。
q2 = -q1;
|
static |
単項共役演算子
四元数 \(\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}\) の逆回転を表します。
|
static |
四元数積二項演算子
2つの四元数 \(\mathbf{q}_1, \mathbf{q}_2\) に対し、 それぞれのスカラー部とベクトル部を以下のように記述するとします。
\[ \mathbf{q}_1 = s_1 + \mathbf{V}_1, \; \mathbf{q}_2 = s_2 + \mathbf{V}_2 \]
このとき、四元数の積は以下のように定義されます。
\[ \mathbf{q}_1\mathbf{q}_2 = \left(s_1s_2 - \mathbf{V}_1\cdot\mathbf{V}_2\right) + \left(s_1\mathbf{V}_2+s_2\mathbf{V}_1 + \mathbf{V}_1 \times \mathbf{V}_2\right) \]
これを得るには、以下のように記述します。 q1, q2, q はいずれも fk_Quaternion 型の変数です。
q = q1 * q2;
四元数の積は、四元数を回転変換として考えたとき、合成変換を生成することを意味します。 なお、四元数の積は交換法則は成り立ちません。
|
static |
四元数和二項演算子
四元数の和は、全ての成分同士を加算することで定義されます。 四元数 q1 と q2 の和を得るには、以下のように記述します。 q1, q2, q はいずれも fk_Quaternion 型の変数です。
q = q1 + q2;
|
static |
四元数差二項演算子
四元数の差は、全ての成分同士を減算することで定義されます。 四元数 q1 と q2 の差を得るには、以下のように記述します。 q1, q2, q はいずれも fk_Quaternion 型の変数です。
q = q1 - q2;
|
static |
四元数スカラー倍二項演算子1
四元数のスカラー倍は、全ての成分に与えられた実数を掛けることで定義されます。 これを得るには、以下のように記述します。 q1, q2 はいずれも fk_Quaternion 型の変数で、d は double 型の変数です。
q2 = q1 * d;
なお、四元数と実数の順番は逆でも構いません。
|
static |
四元数スカラー倍二項演算子2
四元数のスカラー倍は、全ての成分に与えられた実数を掛けることで定義されます。 これを得るには、以下のように記述します。 q1, q2 はいずれも fk_Quaternion 型の変数で、d は double 型の変数です。
q2 = d * q1;
なお、四元数と実数の順番は逆でも構いません。
|
static |
四元数スカラー商二項演算子
四元数のスカラー商は、全ての成分を与えられた実数で割ることで定義されます。 これを得るには、以下のように記述します。 q1, q2 はいずれも fk_Quaternion 型の変数で、d は double 型の変数です。
q2 = q1 / d;
|
static |
四元数ベクトル変換二項演算子
四元数は、数学的には任意軸回転変換を表現します。 一つの四元数 \( \mathbf{q} \) は3次元ベクトル \(\mathbf{V}\) に対し、
\[ \mathbf{V}' = \mathbf{q}\mathbf{V}\mathbf{q}^{-1} \]
という演算によって回転変換したベクトル \(\mathbf{V}'\) を求めることができます。
上記の変換ベクトルを得るには、以下のように記述します。 v1, v2 はともに fk_Vector 型の変数、q は fk_Quaternion 型の変数です。 v1 が元のベクトル、v2 が変換後のベクトルを意味します。
v2 = q * v1;
|
static |
四元数内積二項演算子
2つの四元数 \(\mathbf{q}_1 = s_1 + x_1i + y_1j + z_1k, \; \mathbf{q}_2 = s_2 + x_2i + y_2j + z_2k \) の内積(スカラー積)は、以下のように定義されます。
\[ \mathbf{q}_1\cdot\mathbf{q}_2 = s_1s_2 + x_1x_2 + y_1y_2 + z_1z_2 \]
これを得るには、以下のように記述します。 q1, q2 は fk_Quaternion 型の変数、d は double 型の変数です。
d = q1 ^ q2;
なお、四元数の内積は交換法則が成り立ちます。
|
static |
積代入演算子
以下のコードは、四元数 q1 および q2 の積を 前の q1 の値は破棄して改めて q1 に設定します。
q1 *= q2;
これは、以下のコードと同義です。
q1 = q1 * q2;
|
static |
スカラー倍代入演算子
以下のコードは、四元数 q の全ての成分を d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。
q *= d;
d は変数でなく数値でも構いません。
q *= 2.0;
|
static |
スカラー商代入演算子
以下のコードは、四元数 q の全ての成分を 1/d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。
q /= d;
d は変数でなく数値でも構いません。
q /= 2.0;
|
static |
単項和代入演算子
以下のコードは、q1 に q2 分を加算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。
q1 += q2;
上記コードは、以下のコードと同義です。
q1 = q1 + q2;
|
static |
単項差代入演算子
以下のコードは、q1 に q2 分を減算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。
q1 -= q2;
上記コードは、以下のコードと同義です。
q1 = q1 - q2;
|
override |
文字列出力メソッド
現在の四元数成分値を文字列として出力します。
void FK_CLI::fk_Quaternion::Init | ( | void | ) |
初期化メソッド
スカラー部を 1 に、ベクトル部を零ベクトルとして初期化します。
void FK_CLI::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_CLI::fk_Quaternion::Set | ( | double | s, |
fk_Vector^ | v | ||
) |
成分設定メソッド2
1個の実数と1個の fk_Vector 型変数から、 スカラー部とベクトル部をそれぞれ設定します。
ここで与えられるスカラー部とベクトル部は、 回転角や回転軸を表すわけではないことに注意して下さい。 回転変換における回転角と回転軸を設定する場合は、 SetRotate() を用います。
[in] | s | スカラー部設定値 |
[in] | v | ベクトル部設定値 |
void FK_CLI::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_CLI::fk_Quaternion::SetRotate | ( | double | theta, |
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 | 回転軸ベクトル |
bool FK_CLI::fk_Quaternion::Normalize | ( | void | ) |
正規化メソッド
四元数を正規化します。正規化とは、元の四元数の成分を絶対値で割ることで、 絶対値が 1 である四元数を求めることです。 全ての成分が 0 である場合のみ、正規化できません。
void FK_CLI::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_CLI::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_Quaternion ^ FK_CLI::fk_Quaternion::GetInverse | ( | void | ) |
|
getset |
四元数スカラー部成分プロパティ
|
getset |
四元数ベクトル部 x 成分プロパティ
|
getset |
四元数ベクトル部 y 成分プロパティ
|
getset |
四元数ベクトル部 z 成分プロパティ
|
getset |
四元数ベクトル部プロパティ
|
getset |
オイラー角プロパティ
設定の際には、原点を中心とする物体が、 オイラー角 (0, 0, 0) から 与えられたオイラー角の状態に回転する変換を表す四元数を設定します。 参照の際には、 四元数を回転変換として解釈したときに、 オイラー角 (0, 0, 0) の状態の物体が回転したときの 姿勢状態を示すオイラー角となります。 オイラー角についての解説は、 fk_Angle を参照して下さい。
|
get |
ノルムプロパティ
四元数 \(\mathbf{q}\) のノルム値 \(|\mathbf{q}|^2\) を参照します。 \(\mathbf{q} = s + xi + yj + zk\) のノルム値は、 以下のように定義されます。
\[ |\mathbf{q}|^2 = s^2 + x^2 + y^2 + z^2 \]
|
get |
絶対値プロパティ
四元数 \(\mathbf{q}\) の絶対値 \(|\mathbf{q}|\) を参照します。 \(\mathbf{q} = s + xi + yj + zk\) の絶対値は、 以下のように定義されます。
\[ |\mathbf{q}| = \sqrt{s^2 + x^2 + y^2 + z^2} \]
|
get |
行列プロパティ
四元数を回転変換と考えたときの、同じ回転変換を意味する行列を参照します。