将3d 4x4旋转矩阵转换为2d

时间:2012-05-17 04:14:57

标签: 3d matrix 2d collada

假设我们有一个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平移,旋转和缩放数据。

2 个答案:

答案 0 :(得分: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,则它是RTS矩阵的多次乘法的结果。查看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)

答案 1 :(得分:2)

this library具有将4x4矩阵转换为5个组件的例程 - 旋转,平移,缩放,剪切和透视。你应该能够采用公式,只需删除3d矢量的第3个组成部分。