4

次のようなインデックスを持つ 4x4 行列があるとします。

00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33

この行列に含まれる回転データ (それが役立つ場合は z 軸を無視します) を単一の 2d 回転角度 (ラジアン単位) に変換するにはどうすればよいですか?

背景: Blender から Collada 形式にエクスポートされた 3D .dae アニメーションがあります。アニメーションは技術的には 2D であり、z 軸の値はすべて 0 です。4x4 行列を 2D の平行移動、回転、およびスケール データに変換しようとしています。

4

2 に答える 2

11

スケール マトリックスSは次のようになります。

sx 0  0  0
0  sy 0  0
0  0  sz 0
0  0  0  1

翻訳マトリックスTは次のようになります。

1  0  0  0
0  1  0  0
0  0  1  0
tx ty tz 1

Z 軸回転行列Rは次のようになります。

 cos(a) sin(a)  0  0
-sin(a) cos(a)  0  0
   0      0     1  0
   0      0     0  1

変換行列 がある場合、それはと行列をM何度も乗算した結果です。を見ると、これらの乗算の順序と数は不明です。ただし、それを別々の行列に分解できると仮定すると。まず計算しましょう:RTSMM=S*R*TS*R*T

        ( sx*cos(a) sx*sin(a) 0  0)       (m11 m12 m13 m14)
S*R*T = (-sy*sin(a) sy*cos(a) 0  0) = M = (m21 m22 m23 m24)
        (     0         0     sz 0)       (m31 m32 m33 m34)
        (     tx        ty    tz 1)       (m41 m42 m43 m44)

2D 変換であることがわかっているので、変換を取得するのは簡単です。

translation = vector2D(tx, ty) = vector2D(m41, m42)

回転とスケールを計算するには、次を使用できますsin(a)^2+cos(a)^2=1

(m11 / sx)^2 + (m12 / sx)^2 = 1
(m21 / sy)^2 + (m22 / sy)^2 = 1

m11^2 + m12^2 = sx^2
m21^2 + m22^2 = sy^2

sx = sqrt(m11^2 + m12^2)
sy = sqrt(m21^2 + m22^2)

scale = vector2D(sx, sy)

rotation_angle = atan2(sx*m22, sy*m12)
于 2012-05-17T12:35:21.287 に答える
2

このライブラリには、4x4 マトリックスを 5 つのコンポーネント (回転、平行移動、スケール、せん断、遠近法) に変換するためのルーチンがあります。数式を取得して、3d ベクトルの 3 番目のコンポーネントをドロップするだけでよいはずです。

于 2012-05-17T04:26:54.133 に答える