仿射旋转矩阵

时间:2016-12-28 06:05:22

标签: c++ math matrix affinetransform

我正在编写一个在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 }

这是什么问题?我可以提供我的旋转函数实现,但我想在发布代码之前确保这不是一个关于仿射变换的概念问题。

1 个答案:

答案 0 :(得分:2)

您的第一个示例对应于矩阵乘法的逆序。比较:

Z * (Y * (X * V))
((X * Y) * Z) * V

但矩阵乘法不是可交换的!