回転行列 | クォータニオン | |
---|---|---|
単位行列 | dRSetIdentity | dQSetIdentity |
軸まわりに回転 | dRFromAxisAndAngle | dQFromAxisAndAngle |
相互変換 | dRfromQ | dQfromR |
ベクトルと行列の型は、次のようにdReal型の配列として定義されています。
typedef dReal dVector3[ 4 ]; typedef dReal dVector4[ 4 ];
typedef dReal dMatrix3[ 4 * 3 ]; typedef dReal dMatrix4[ 4 * 4 ]; typedef dReal dMatrix6[ 8 * 6 ];
すべての要素に指定値を設定します。
void dSetValue ( dReal *a, int n, dReal value );
すべての要素に0を設定します。
void dSetZero ( dReal *a, int n );
2つのn×1ベクトルの内積を求めます。
dReal dDot ( const dReal *a, const dReal *b, int n );
式 | 行列の大きさ | 関数 | ||
---|---|---|---|---|
A | B | C | ||
A = B * C |
p * r | p * q | q * r |
void dMultiply0 ( dReal *A, // 行列A const dReal *B, // 行列B const dReal *C, // 行列C int p, int q, int r // 行列の大きさ ); |
A = tB * C |
p * r | q * p | q * r |
void dMultiply1 ( dReal *A, // 行列A const dReal *B, // 行列B const dReal *C, // 行列C int p, int q, int r // 行列の大きさ ); |
A = B * tC |
p * r | p * q | r * q |
void dMultiply2 ( dReal *A, // 行列A const dReal *B, // 行列B const dReal *C, // 行列C int p, int q, int r // 行列の大きさ ); |
ベクトルを正規化し、単位ベクトルに変換します。
void dNormalize3 ( dVector3 a ); void dNormalize4 ( dVector4 a );
回転行列の型はdMatrix3であり、これは
typedef dReal dMatrix3[ 4 * 3 ];
のように定義されるdReal型の配列です。
単位行列 (回転していない状態) に設定します。
void dRSetIdentity ( dMatrix3 R );
軸ベクトル (ax、ay、az) まわりに角度angle[rad]回転したときの、回転行列Rを求めます。
void dRFromAxisAndAngle ( dMatrix3 R, dReal ax, dReal ay, dReal az, // 軸ベクトル dReal angle // 回転角[rad] );
オイラー角 (Euler angle) から回転行列Rを作成します。
void dRFromEulerAngles (
dMatrix3 R,
dReal phi, dReal theta, dReal psi // オイラー角
);
2つのベクトルから回転行列Rを作成します。それぞれのベクトルが作成された回転行列のx軸、y軸となります。よってベクトルは単位ベクトルで、互いに直交している必要があります。
void dRFrom2Axes ( dMatrix3 R, dReal ax, dReal ay, dReal az, // ベクトルa dReal bx, dReal by, dReal bz // ベクトルb );
?
void dRFromZAxis (
dMatrix3 R,
dReal ax, dReal ay, dReal az // ?
);
クォータニオンの型dQuaternionは、
typedef dReal dQuaternion[ 4 ];
のようにdReal型の配列として定義されています。
void dQSetIdentity ( dQuaternion q );
軸ベクトル (ax、ay、az) まわりに角度angle[rad]回転したときの、クォータニオンqを求めます。
void dQFromAxisAndAngle ( dQuaternion q, dReal ax, dReal ay, dReal az, // 軸ベクトル dReal angle // 回転角[rad] );
クォータニオンの乗算を行います。これによりクォータニオンqaを、qb回転した後にqc回転させられます。
式 | 関数 |
---|---|
qa = qb * qc |
void dQMultiply0 ( dQuaternion qa, const dQuaternion qb, const dQuaternion qc ); |
qa = qb⁻¹ * qc |
void dQMultiply1 ( dQuaternion qa, const dQuaternion qb, const dQuaternion qc ); |
qa = qb * qc⁻¹ |
void dQMultiply2 ( dQuaternion qa, const dQuaternion qb, const dQuaternion qc ); |
qa = qb⁻¹ * qc⁻¹ |
void dQMultiply3 ( dQuaternion qa, const dQuaternion qb, const dQuaternion qc ); |
dDQfromW()で、クォータニオンを時間微分した値dq/dtを求められます。
void dDQfromW ( dReal dq[ 4 ], // 結果を格納する4元ベクトル const dVector3 w, // ベクトル const dQuaternion q // クォータニオン );
または、
#define dWtoDQ(w,q,dq) dDQfromW((dq),(w),(q))
のようなマクロが定義されているため、dWtoDQ()でも同様に求められます。
クォータニオンを回転行列に変換します。
void dRfromQ ( dMatrix3 R, const dQuaternion q );
回転行列をクォータニオンに変換します。
void dQfromR ( dQuaternion q, const dMatrix3 R );
dQtoR()、dRtoQ()は互換性のために残されている関数で、それぞれ
#define dQtoR(q,R) dRfromQ((R),(q)) #define dRtoQ(R,q) dQfromR((q),(R))
のように定義されていることからわかるように、上記の関数に置き換えられます。