回答:
(この回答は基本的にはステファンのものと同じですが、行ベクトルと列ベクトル、および使用しているものを判別する方法についての詳細を追加したいと思います。)
はい、可能ですが、詳細はベクトルを行と列のどちらで表すかによって異なります。
列ベクトルを使用している場合は、通常、行列を左乗算して変換します。
vector = mRotateZ * vector;
vector = mRotateX * vector;
もちろん、これは1つの手順で行うこともできます。
vector = mRotateX * mRotateZ * vector;
しかし、行列の乗算は結合的です。つまり、最初にどの乗算が実行されるかは問題ではありません。
A * B * C = (A * B) * C = A * (B * C)
だから私たちは書くことができます
Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;
現在に相当する単一のマトリックス、作成した最初の周りを回転Z
し、第二約をX
。これは、任意の数の変換に対して簡単に一般化されます。変換は右から左に適用されることに注意してください。
一方、行ベクトルを使用している場合は、通常、行列を右乗算します。
vector = vector * mRotateZ;
vector = vector * mRotateX;
ここでも、1つのステップでそれを書いて、
vector = vector * mRotateZ * mRotateX;
これは次のように書き換えることができます
Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;
この場合、変換は左から右に適用されることに注意してください。
はい、逆の順序で乗算します。
Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);
編集。 私の答えは、列ベクトルを使用している場合にのみ当てはまります。MartinBüttnerの詳細な回答を参照してください。
数学から:
これが(本質的に)意味することは、
それについて考えてください。オブジェクト空間から始めて、1回の回転だけを使用してオブジェクトを任意の方向に回転させることができます。
四元数を取り込むことは、単なるランダムな数学ではないことを指摘しておきます。他の回答とは対照的に、グラフィックスで好まれるアプローチは、実際には回転をクォータニオンとして表すことです。なぜなら、それらはスペースをとらず、組み合わせるのが速いためです。
回転行列と四元数の間で変換する方法は、好みに応じてGoogleで簡単に設定できます。ポイントは、回転は数学的な意味での四元数であるため、それらの組み合わせも単一の回転であることです。