スケール マトリックス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
何度も乗算した結果です。を見ると、これらの乗算の順序と数は不明です。ただし、それを別々の行列に分解できると仮定すると。まず計算しましょう:R
T
S
M
M=S*R*T
S*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)