您如何尽可能安全地用向量旋转现有的3x3旋转矩阵?
数学看起来像这样:
[X] * [1, 0, 0]
[Y] * [0, 1, 0] = New Rotation Matrix
[Z] * [0, 0, 1]
我在没有帮助的情况下浏览了GLM和Eigen。 They only seem to reference 4x4 matrices.
意图:
我基本上试图将现有的3x3 rotation matrix轮换为rotation vector。
我很感激任何意见。
答案 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
旋转为旋转轴,您需要执行以下操作:
构造表示旋转坐标系的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 |
了解更多信息,请参阅:
将M
转换为A/B
我习惯 OpenGL ,其数学运算使用B
布局,因此我将从现在开始使用它(A
和B
之间的唯一区别是矩阵是反转的,正交 3D 3x3 旋转矩阵与转置相同)所以从M
取每个矢量将它转换为B
,就像这样......假设您的M
有3个基础向量X,Y,Z
,那么
X' = inverse(B)*X
Y' = inverse(B)*Y
Z' = inverse(B)*Z
从M'
X',Y',Z'
围绕M'
z
所以只需将M'
乘以R
轴周围的简单旋转矩阵z
,即可。{/ p>
| cos(angle) -sin(angle) 0 |
R = | sin(angle) cos(angle) 0 |
| 0 0 1 |
M''= M' * R(angle)
M''
转换回原始坐标系
这样:
X''' = B*X''
Y''' = B*Y''
Z''' = B*Z''
并从M
构建新的X''',Y''',Z'''
。这就是全部。