2つの方向ベクトルから3x3回転行列を計算する方法は?


10

オブジェクトのX軸とY軸の2つの方向ベクトルがあります。これらを使用してオブジェクトの回転行列を計算するにはどうすればよいですか?

回答:


17

基本的な考え方は、クロス積を使用して、すでに持っている軸に基づいて、回転行列の追加の直交軸を生成することです。

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

上記はXとYのベクトルを仮定していないことに注意してください(それらが同一でないことを除けば)。状況によっては必要のない多くの追加の計算が行われます。

たとえば、次のコードでは、入力のX軸とY軸が正確に90度離れていると盲目的に信頼するのではなく、2番目の外積を行って、行列が確実に直交Y軸を取得するようにします。入力軸が実際に相互に直交していることが確かな場合は、2番目の外積をスキップして、再計算する代わりに、入力Yベクトルを直接割り当てることができます。

マトリックス表現がアクセス可能な 'X、Y、Z'ベクトルメンバーを持っていると仮定していることに注意してください。一部の実装は、代わりに9つの浮動小数点数の配列を公開するだけです。その場合、「X」ベクトルは、行列が行優先か列優先かによって、要素0、1、2、または0、3、6になります。メジャー。この(迷惑な)状況では、通常、ドキュメントを検索して特定のマトリックス実装が使用している順序を特定するよりも、両方の方法を試してどちらが機能するかを確認する方が簡単であることがわかります。:)

最後に、3D座標系の利き手によっては、3Dエンジンの有効な回転行列を生成するために、MZに負の値を掛ける必要がある場合があることに注意してください。


どうもありがとうございました!私はこれを行い、あなたに私の結果を知らせます。
TheFlash

非常に役立つ回答をありがとう!しかし、私は興味があります。行列が行優先か列優先かに関係なく、Xベクトルは常に要素0、1、および2ではありませんか?0、3、および6は、行優先マトリックスの最初の列にアクセスすること、またはその逆を意味します。
fbrereto

1
2つのベクトルが等しくないことを少なくともassert()するための+1ですが、それらがゼロのベクトルではないことも要求する必要があると思います。
hans_meine 14

1
これを考慮にケース取らないことに注意してくださいXです-Y
ラファウCieślak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.