FineKernelToolKit 4.2.13
読み取り中…
検索中…
一致する文字列を見つけられません
公開メンバ関数 | プロパティ | 全メンバ一覧
FK_CLI::fk_Quaternion クラス

四元数(クォータニオン)を管理するクラス [詳解]

#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_QuaternionGetInverse (void)
 逆元取得メソッド
 

静的公開メンバ関数

単項演算子
static fk_Quaternionoperator- (fk_Quaternion^ argQ)
 単項マイナス演算子
 
static fk_Quaternionoperator~ (fk_Quaternion^ argQ)
 単項共役演算子
 
二項演算子
static fk_Quaternionoperator* (fk_Quaternion^ Q1, fk_Quaternion^ Q2)
 四元数積二項演算子
 
static fk_Quaternionoperator+ (fk_Quaternion^ Q1, fk_Quaternion^ Q2)
 四元数和二項演算子
 
static fk_Quaternionoperator- (fk_Quaternion^ Q1, fk_Quaternion^ Q2)
 四元数差二項演算子
 
static fk_Quaternionoperator* (fk_Quaternion^ Q, double D)
 四元数スカラー倍二項演算子1
 
static fk_Quaternionoperator* (double D, fk_Quaternion^ Q)
 四元数スカラー倍二項演算子2
 
static fk_Quaternionoperator/ (fk_Quaternion^ Q, double D)
 四元数スカラー商二項演算子
 
static fk_Vectoroperator* (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_Vectorv [get, set]
 四元数ベクトル部プロパティ
 
fk_AngleEuler [get, set]
 オイラー角プロパティ
 
double Norm [get]
 ノルムプロパティ
 
double Abs [get]
 絶対値プロパティ
 
fk_MatrixMatrix [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_Vector, fk_Angle, fk_Matrix, fk_Math

構築子と解体子

◆ fk_Quaternion() [1/4]

FK_CLI::fk_Quaternion::fk_Quaternion ( )

コンストラクタ1

引数なしの場合、全ての成分が 0 である四元数を生成します。 特に、スカラー部も 0 であることに注意して下さい。

◆ fk_Quaternion() [2/4]

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 成分設定値
参照
Set(), SetRotate()

◆ fk_Quaternion() [3/4]

FK_CLI::fk_Quaternion::fk_Quaternion ( double  s,
fk_Vector v 
)

コンストラクタ3

1個の実数と1個の fk_Vector 型変数を引数とするコンストラクタによって、 スカラー部とベクトル部をそれぞれ初期設定できます。

四元数の成分は、回転角や回転軸を直接表すものではありません。 回転角と回転軸を設定したい場合は、 SetRotate() を使用して下さい。

引数
[in]sスカラー部設定値
[in]vベクトル部設定値
参照
Set(), SetRotate()

◆ fk_Quaternion() [4/4]

FK_CLI::fk_Quaternion::fk_Quaternion ( fk_Quaternion Q)

コピーコンストラクタ

◆ ~fk_Quaternion()

FK_CLI::fk_Quaternion::~fk_Quaternion ( )

デストラクタ

◆ !fk_Quaternion()

FK_CLI::fk_Quaternion::!fk_Quaternion ( )

ファイナライザ

関数詳解

◆ Equals() [1/2]

bool FK_CLI::fk_Quaternion::Equals ( fk_Quaternion Q)

同値比較メソッド1

2つの四元数の値が同値かどうかを判定します。 単純に == 演算子を用いた場合はインスタンスが同一であるかどうかの判定となるため、 異なるインスタンスで同値かどうかを判定する場合はこのメソッドを利用して下さい。

引数
[in]Q同値かどうかを判定する四元数
戻り値
同値であれば true を、そうでなければ false を返します。

◆ Equals() [2/2]

virtual bool FK_CLI::fk_Quaternion::Equals ( Object^  O)
overridevirtual

同値比較メソッド2

2つの四元数の値が同値かどうかを判定します。 単純に == 演算子を用いた場合はインスタンスが同一であるかどうかの判定となるため、 異なるインスタンスで同値かどうかを判定する場合はこのメソッドを利用して下さい。

引数
[in]O同値かどうかを判定する四元数
戻り値
同値であれば true を、そうでなければ false を返します。

◆ operator-() [1/2]

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator- ( fk_Quaternion argQ)
static

単項マイナス演算子

四元数 \(\mathbf{q} = s + xi + yj + zk\) に対し、

\[ -\mathbf{q} = -s-xi-yj-zk \]

として符号は定義されます。以下のコードは、q2 に -q1 を代入します。

q2 = -q1;
覚え書き
回転変換を表す四元数 \(\mathbf{q}\) において、 \(-\mathbf{q}\) による変換もまったく同じ回転となります。 逆回転変換を行う四元数を求めたい場合は、共役を利用して下さい。

◆ operator~()

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator~ ( fk_Quaternion argQ)
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}\) の逆回転を表します。

参照
Conj()

◆ operator*() [1/4]

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator* ( fk_Quaternion Q1,
fk_Quaternion Q2 
)
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;

四元数の積は、四元数を回転変換として考えたとき、合成変換を生成することを意味します。 なお、四元数の積は交換法則は成り立ちません。

◆ operator+()

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator+ ( fk_Quaternion Q1,
fk_Quaternion Q2 
)
static

四元数和二項演算子

四元数の和は、全ての成分同士を加算することで定義されます。 四元数 q1 と q2 の和を得るには、以下のように記述します。 q1, q2, q はいずれも fk_Quaternion 型の変数です。

q = q1 + q2;

◆ operator-() [2/2]

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator- ( fk_Quaternion Q1,
fk_Quaternion Q2 
)
static

四元数差二項演算子

四元数の差は、全ての成分同士を減算することで定義されます。 四元数 q1 と q2 の差を得るには、以下のように記述します。 q1, q2, q はいずれも fk_Quaternion 型の変数です。

q = q1 - q2;

◆ operator*() [2/4]

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator* ( fk_Quaternion Q,
double  D 
)
static

四元数スカラー倍二項演算子1

四元数のスカラー倍は、全ての成分に与えられた実数を掛けることで定義されます。 これを得るには、以下のように記述します。 q1, q2 はいずれも fk_Quaternion 型の変数で、d は double 型の変数です。

q2 = q1 * d;

なお、四元数と実数の順番は逆でも構いません。

◆ operator*() [3/4]

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator* ( double  D,
fk_Quaternion Q 
)
static

四元数スカラー倍二項演算子2

四元数のスカラー倍は、全ての成分に与えられた実数を掛けることで定義されます。 これを得るには、以下のように記述します。 q1, q2 はいずれも fk_Quaternion 型の変数で、d は double 型の変数です。

q2 = d * q1;

なお、四元数と実数の順番は逆でも構いません。

◆ operator/()

static fk_Quaternion ^ FK_CLI::fk_Quaternion::operator/ ( fk_Quaternion Q,
double  D 
)
static

四元数スカラー商二項演算子

四元数のスカラー商は、全ての成分を与えられた実数で割ることで定義されます。 これを得るには、以下のように記述します。 q1, q2 はいずれも fk_Quaternion 型の変数で、d は double 型の変数です。

q2 = q1 / d;

◆ operator*() [4/4]

static fk_Vector ^ FK_CLI::fk_Quaternion::operator* ( fk_Quaternion Q,
fk_Vector V 
)
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;

◆ operator^()

static double FK_CLI::fk_Quaternion::operator^ ( fk_Quaternion Q1,
fk_Quaternion Q2 
)
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;

なお、四元数の内積は交換法則が成り立ちます。

覚え書き
ここで演算子として採用されている「^」は、 言語仕様上あまり演算子としての優先度が高くありません。 そのため、括弧を適切に使用しないと本来の意図と異なる結果を生じるおそれがあります。

◆ operator*=() [1/2]

static void FK_CLI::fk_Quaternion::operator*= ( fk_Quaternion Q1,
fk_Quaternion Q2 
)
static

積代入演算子

以下のコードは、四元数 q1 および q2 の積を 前の q1 の値は破棄して改めて q1 に設定します。

q1 *= q2;

これは、以下のコードと同義です。

q1 = q1 * q2;
覚え書き
四元数の積は交換法則が成り立たないため、 \( \mathbf{q}_2\mathbf{q}_1 \) を \( \mathbf{q}_1 \) に代入したいときは、この演算子は利用できません。

◆ operator*=() [2/2]

static void FK_CLI::fk_Quaternion::operator*= ( fk_Quaternion Q1,
double  D 
)
static

スカラー倍代入演算子

以下のコードは、四元数 q の全ての成分を d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。

q *= d;

d は変数でなく数値でも構いません。

q *= 2.0;

◆ operator/=()

static void FK_CLI::fk_Quaternion::operator/= ( fk_Quaternion Q,
double  D 
)
static

スカラー商代入演算子

以下のコードは、四元数 q の全ての成分を 1/d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。

q /= d;

d は変数でなく数値でも構いません。

q /= 2.0;

◆ operator+=()

static void FK_CLI::fk_Quaternion::operator+= ( fk_Quaternion Q1,
fk_Quaternion Q2 
)
static

単項和代入演算子

以下のコードは、q1 に q2 分を加算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。

q1 += q2;

上記コードは、以下のコードと同義です。

q1 = q1 + q2;

◆ operator-=()

static void FK_CLI::fk_Quaternion::operator-= ( fk_Quaternion Q1,
fk_Quaternion Q2 
)
static

単項差代入演算子

以下のコードは、q1 に q2 分を減算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。

q1 -= q2;

上記コードは、以下のコードと同義です。

q1 = q1 - q2;

◆ ToString()

String ^ FK_CLI::fk_Quaternion::ToString ( )
override

文字列出力メソッド

現在の四元数成分値を文字列として出力します。

戻り値
成分値の文字列

◆ Init()

void FK_CLI::fk_Quaternion::Init ( void  )

初期化メソッド

スカラー部を 1 に、ベクトル部を零ベクトルとして初期化します。

◆ Set() [1/2]

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 成分設定値
参照
SetRotate()

◆ Set() [2/2]

void FK_CLI::fk_Quaternion::Set ( double  s,
fk_Vector v 
)

成分設定メソッド2

1個の実数と1個の fk_Vector 型変数から、 スカラー部とベクトル部をそれぞれ設定します。

ここで与えられるスカラー部とベクトル部は、 回転角や回転軸を表すわけではないことに注意して下さい。 回転変換における回転角と回転軸を設定する場合は、 SetRotate() を用います。

引数
[in]sスカラー部設定値
[in]vベクトル部設定値
参照
SetRotate()

◆ SetRotate() [1/2]

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 成分
参照
Set()

◆ SetRotate() [2/2]

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回転軸ベクトル
参照
Set()

◆ Normalize()

bool FK_CLI::fk_Quaternion::Normalize ( void  )

正規化メソッド

四元数を正規化します。正規化とは、元の四元数の成分を絶対値で割ることで、 絶対値が 1 である四元数を求めることです。 全ての成分が 0 である場合のみ、正規化できません。

戻り値
成功すれば true を、失敗すれば false を返します。

◆ Conj()

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}\) の逆回転を表します。

◆ Inverse()

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である)場合、 四元数の逆元と共役は等しくなります。 また、四元数によるベクトル変換を考えたとき、逆元は逆変換を表します。

戻り値
成功すれば true を返し、失敗すれば false を返します。 失敗は、全ての成分が 0 である場合に起こります。
参照
Norm, Conj(), GetInverse()

◆ GetInverse()

fk_Quaternion ^ FK_CLI::fk_Quaternion::GetInverse ( void  )

逆元取得メソッド

逆元となる四元数を返します。 四元数 \(\mathbf{q} = s + xi + yj + zk\) に対し、

\[ \mathbf{q}^{-1} = \frac{\overline{\mathbf{q}}}{|\mathbf{q}|^2} \]

として逆元 \(\mathbf{q}^{-1}\) は定義されます。

四元数が正規である(つまり、ノルムが1である)場合、 四元数の逆元と共役は等しくなります。 また、四元数によるベクトル変換を考えたとき、逆元は逆変換を表します。

参照
Norm, Inverse()

プロパティ詳解

◆ s

double FK_CLI::fk_Quaternion::s
getset

四元数スカラー部成分プロパティ

◆ x

double FK_CLI::fk_Quaternion::x
getset

四元数ベクトル部 x 成分プロパティ

◆ y

double FK_CLI::fk_Quaternion::y
getset

四元数ベクトル部 y 成分プロパティ

◆ z

double FK_CLI::fk_Quaternion::z
getset

四元数ベクトル部 z 成分プロパティ

◆ v

fk_Vector^ FK_CLI::fk_Quaternion::v
getset

四元数ベクトル部プロパティ

◆ Euler

fk_Angle^ FK_CLI::fk_Quaternion::Euler
getset

オイラー角プロパティ

設定の際には、原点を中心とする物体が、 オイラー角 (0, 0, 0) から 与えられたオイラー角の状態に回転する変換を表す四元数を設定します。 参照の際には、 四元数を回転変換として解釈したときに、 オイラー角 (0, 0, 0) の状態の物体が回転したときの 姿勢状態を示すオイラー角となります。 オイラー角についての解説は、 fk_Angle を参照して下さい。

◆ Norm

double FK_CLI::fk_Quaternion::Norm
get

ノルムプロパティ

四元数 \(\mathbf{q}\) のノルム値 \(|\mathbf{q}|^2\) を参照します。 \(\mathbf{q} = s + xi + yj + zk\) のノルム値は、 以下のように定義されます。

\[ |\mathbf{q}|^2 = s^2 + x^2 + y^2 + z^2 \]

◆ Abs

double FK_CLI::fk_Quaternion::Abs
get

絶対値プロパティ

四元数 \(\mathbf{q}\) の絶対値 \(|\mathbf{q}|\) を参照します。 \(\mathbf{q} = s + xi + yj + zk\) の絶対値は、 以下のように定義されます。

\[ |\mathbf{q}| = \sqrt{s^2 + x^2 + y^2 + z^2} \]

◆ Matrix

fk_Matrix^ FK_CLI::fk_Quaternion::Matrix
get

行列プロパティ

四元数を回転変換と考えたときの、同じ回転変換を意味する行列を参照します。