3D回転行列(4x4)を構成要素(回転、スケールなど)に変換することは可能ですか?


11

より具体的に言うと、私はiOSアプリに取り組んでおり、CATransform3D構造体(基本的には4x4変換配列)を持っています。

このマトリックスが意味するすべての異なる「操作」を推測することは可能ですか?回転、スケールなどの意味は?

回答:


10

行列M=TRSを基本的な変換、つまり、並進、スケーリング、回転に分解できます。この行列を考えると:

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

t=(a03,a13,a23)

s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

これでスケールが得られました。対応するサブマトリックスを使用して、マトリックスにスケールの逆数を掛けてすることで、これを取り除くことができます取得3×3RSS1R

(RS)S1=[a00a01a02a10a11a12a20a21a22][s0000s1000s2]1=[a00a01a02a10a11a12a20a21a22][1/s00001/s10001/s2]

したがって、():(RS)S1=RI=R

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/s2]

これが最終的な回転行列です。さらに、さまざまな方法で分解できます。かなり長くなりますが、回転行列の分解を検索できます。


このメソッドは、平行移動、スケーリング、および回転の形式で同等の値のみを提供します(元のマトリックスはおそらく他のタイプの変換の結果です)。さらに分解角度を使用すると、回転角度の浮動小数点精度に問題が生じる可能性があり、計算で丸め誤差が蓄積する可能性があります。マトリックスを自分で作成しなかった場合を除き、使用しないでください。

あなたがマトリックスを構築していて、平行移動、スケール、回転を個別に独立して編集および表示できるようにするために分解が必要だった場合は、おそらく最も明確な理由は、コンポーネントを格納することです変換クラスのとは、ベクトルとして個別に(おそらく回転の四元数)。変換行列が必要な場合のみ、これらのコンポーネントから行列を作成します(一部のコンポーネントが変更されるまで行列をキャッシュできます)。tsrTRS


2
浮動小数点精度の問題は何ですか?スケールが本当に極端でない限り、この方法では精度の問題を引き起こすものは何もありません。また、マトリックスが不均一なスケールと回転の両方を含むマトリックスのシーケンスから構成されている場合、このメソッドは失敗する可能性があることにも注意してください。その場合、行列は回転ではなく、シアーを含みます。R
Nathan Reed、

2
すべての浮動小数点数には固有の(有界)エラーがあります。操作、特に加算または減算を実行するときはいつでも、エラーを複合させて、境界の大きさを増やします。分解アルゴリズムには、多くの加算演算(行列の乗算とスケールの大きさの計算の両方)と平方根(スケール)が隠されています。さらに分解すると、さらにエラーが発生します。
Timbo 2016年

1
@Timboただし、行列の完全な乗算はありません。行列の列に逆スケールを乗算するだけです。また、ベクトルの大きさにはすべての正の量が加算されるため、壊滅的なキャンセルはありません。AFAICT、相対的なエラーはあまり発生しません。とにかく、著者は回転行列をオイラー角などにさらに分解することについて話していることを明確にしました。
Nathan Reed

ありがとう–すばらしい答えです。フォローアップ:元のマトリックスに戻すために、単位マトリックスから始めて、特定の順序の操作を実行する必要があると想定しています。この注文はTRSですか?
elsurudo 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.