我正在编写一个在C ++中具有静态RotationX()
RotationY()
和RotationZ()
方法的Matrix类。如果我在乘以向量之前将矩阵相乘,我得到的结果与我将矩阵单独乘以向量的结果不同。
此代码
Vec4 result1 { 1, 1, 1, 1 };
result1 = Matrix::RotationX(ToRadians(-90)) * result1;
result1 = Matrix::RotationY(ToRadians(90)) * result1;
result1 = Matrix::RotationZ(ToRadians(90)) * result1;
// result1 => { -1, -1, -1, 1 }
给出与此代码不同的结果
Vec4 result2 { 1, 1, 1, 1 };
auto rotation = Matrix::RotationX(ToRadians(-90)) *
Matrix::RotationY(ToRadians(90)) *
Matrix::RotationZ(ToRadians(90));
result2 = rotation * result2;
// result2 => { 1, 1, -1, 1 }
这是什么问题?我可以提供我的旋转函数实现,但我想在发布代码之前确保这不是一个关于仿射变换的概念问题。
答案 0 :(得分:2)
您的第一个示例对应于矩阵乘法的逆序。比较:
Z * (Y * (X * V))
((X * Y) * Z) * V
但矩阵乘法不是可交换的!