通过向量旋转/乘以旋转矩阵

时间:2017-05-21 06:09:47

标签: c++ opengl matrix eigen

您如何尽可能安全地用向量旋转现有的3x3旋转矩阵?

数学看起来像这样:

[X] * [1, 0, 0]
[Y] * [0, 1, 0] = New Rotation Matrix
[Z] * [0, 0, 1]

我在没有帮助的情况下浏览了GLMEigenThey only seem to reference 4x4 matrices.

意图:

我基本上试图将现有的3x3 rotation matrix轮换为rotation vector

我很感激任何意见。

2 个答案:

答案 0 :(得分:2)

假设您正在处理缩放的轴旋转向量,可以使用AngleAxis

Matrix3f R1 = ...;
Matrix3f R2 = AngleAxisf(vec.norm(), vec.normalized()) * R1;

当然,您可能希望自己规范化vec,以便只计算一次规范:

float a = vec.norm();
Matrix3f R2 = AngleAxisf(a, vec/a) * R1;

答案 1 :(得分:1)

你不能将向量和矩阵相乘并期望矩阵结果。要将3x3矩阵M围绕(0,0,0)和向量W旋转为旋转轴,您需要执行以下操作:

  1. 构造表示旋转坐标系的3x3矩阵

    所以你需要3个基础向量U,V,W,它们彼此垂直。我们已经获得W所以利用交叉产品来获取其他产品:

    // normalize
    W = W / |W| 
    // U is any non-zero non-parallel vector to W
    U = (1,0,0)
    if (|dot(U,W)|>0.7) U = (0,1,0)
    // V is perpendicular to U,W
    V = cross(W,U)
    // U is perpendicular to V,W
    U = cross(V,W)
    

    现在从3x3构建U,V,W矩阵,具体取决于您使用的矩阵的布局,它将是其中之一

         | Ux Uy Uz |        | Ux Vx Wx |
    A =  | Vx Vy Vz | or B = | Uy Vy Wy |
         | Wx Wy Wz |        | Uz Vz Wz |
    

    了解更多信息,请参阅:

  2. M转换为A/B

    我习惯 OpenGL ,其数学运算使用B布局,因此我将从现在开始使用它(AB之间的唯一区别是矩阵是反转的,正交 3D 3x3 旋转矩阵与转置相同)所以从M取每个矢量将它转换为B,就像这样......假设您的M有3个基础向量X,Y,Z,那么

    X' = inverse(B)*X
    Y' = inverse(B)*Y
    Z' = inverse(B)*Z
    

    M'

  3. 构建X',Y',Z'
  4. 围绕M'

    旋转z

    所以只需将M'乘以R轴周围的简单旋转矩阵z,即可。{/ p>

        | cos(angle) -sin(angle) 0 |
    R = | sin(angle)  cos(angle) 0 |
        |     0           0      1 |
    
    M''= M' * R(angle)
    
  5. M''转换回原始坐标系

    这样:

    X''' = B*X''
    Y''' = B*Y''
    Z''' = B*Z''
    

    并从M构建新的X''',Y''',Z'''。这就是全部。