【问题标题】:Convert 3d 4x4 Rotation Matrix into 2d将 3d 4x4 旋转矩阵转换为 2d
【发布时间】:2012-05-24 16:14:27
【问题描述】:

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

【问题讨论】:

    标签: 3d matrix 2d collada


    【解决方案1】:

    比例矩阵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)
    

    【讨论】:

    • 我唯一要添加的不是避免acos,因为它忽略了旋转的符号。最好使用a=atan2(sx*m22,sy*m12)a=atan2(-sy*m11,sx*m21)。 {我使用atan2(dx,dy),但有些系统将其定义为atan2(dy,dx),所以要小心}。
    • @ja72:谢谢,我修好了。在计算角度时假设比例为正也很方便。
    【解决方案2】:

    this library 具有将 4x4 矩阵转换为其 5 个组件的例程 - 旋转、平移、缩放、剪切和透视。您应该能够使用公式并删除 3d 向量的第 3 个分量。

    【讨论】:

    • 计算特征值真是一个聪明的方法。
    • 优点:看起来很有希望。缺点:依赖于 NumPy,因此看起来有点复杂。用 C++ 写过类似的东西吗?
    • 该算法和 C 语言实现发表在 (1) 将矩阵分解为简单变换。斯宾塞托马斯。在“图形宝石 II”中,第 320-323 页。 Morgan Kaufmann,1991 年。另见 (2) 从变换矩阵中恢复数据。罗纳德·戈德曼。在“图形宝石 II”中,第 324-331 页。摩根考夫曼,1991 年。
    • 我对c/c++一无所知
    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多