行列M=TRSを基本的な変換、つまり、並進、スケーリング、回転に分解できます。この行列を考えると:
M=⎡⎣⎢⎢⎢a00a10a200a01a11a210a02a12a220a03a13a231⎤⎦⎥⎥⎥
t=(a03,a13,a23)
s=(s0,s1,s2)
s0=∥(a00,a10,a20)∥s1=∥(a01,a11,a21)∥s2=∥(a02,a12,a22)∥
これでスケールが得られました。対応するサブマトリックスを使用して、マトリックスにスケールの逆数を掛けてすることで、これを取り除くことができます取得3×3RSS−1R
(RS)S−1=⎡⎣⎢a00a10a20a01a11a21a02a12a22⎤⎦⎥⎡⎣⎢s0000s1000s2⎤⎦⎥−1=⎡⎣⎢a00a10a20a01a11a21a02a12a22⎤⎦⎥⎡⎣⎢1/s00001/s10001/s2⎤⎦⎥
したがって、():(RS)S−1=RI=R
R=⎡⎣⎢a00/s0a10/s0a20/s0a01/s1a11/s1a21/s1a02/s2a12/s2a22/s2⎤⎦⎥
これが最終的な回転行列です。さらに、さまざまな方法で分解できます。かなり長くなりますが、回転行列の分解を検索できます。
このメソッドは、平行移動、スケーリング、および回転の形式で同等の値のみを提供します(元のマトリックスはおそらく他のタイプの変換の結果です)。さらに分解角度を使用すると、回転角度の浮動小数点精度に問題が生じる可能性があり、計算で丸め誤差が蓄積する可能性があります。マトリックスを自分で作成しなかった場合を除き、使用しないでください。
あなたがマトリックスを構築していて、平行移動、スケール、回転を個別に独立して編集および表示できるようにするために分解が必要だった場合は、おそらく最も明確な理由は、コンポーネントを格納することです変換クラスのとは、ベクトルとして個別に(おそらく回転の四元数)。変換行列が必要な場合のみ、これらのコンポーネントから行列を作成します(一部のコンポーネントが変更されるまで行列をキャッシュできます)。tsrTRS