回答:
基本的な考え方は、クロス積を使用して、すでに持っている軸に基づいて、回転行列の追加の直交軸を生成することです。
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に負の値を掛ける必要がある場合があることに注意してください。
X
です-Y
。