我想在x,y和z方向上旋转我的模型Matix,但它会以意想不到的方式旋转。 我用Qt。
QMatrix4x4 mMatrix;
mMatrix.setToIdentity();
mMatrix.rotate(yAngle, QVector3D(0, 1, 0));
mMatrix.rotate(zAngle, QVector3D(0, 0, 1));
mMatrix.translate(cube->getPosition());
第一次旋转后,跟随的旋转围绕新模型Matrix的底部旋转,而我希望跟随的旋转围绕原点旋转。
我画了一个小草图,所以我的问题可能更清楚了(黑色显示它现在是怎样的,绿色是我想要它的方式):
绿色箭头显示了我希望它如何。
答案 0 :(得分:1)
如果您只是颠倒在QMatrix4x4
课程上拨打的电话的顺序,我认为您将获得所需的结果。要结合两个旋转:
QMatrix4x4 mMatrix;
mMatrix.setToIdentity();
mMatrix.rotate(zAngle, QVector3D(0, 0, 1));
mMatrix.rotate(yAngle, QVector3D(0, 1, 0));
文档有点缺乏,但是从查看QMatrix4x4
源代码,我得到的印象是它应用矩阵运算的方式或多或少标准化用于OpenGL的矩阵库,以及OpenGL固定管道用于工作的方式。
这意味着当您组合矩阵时,新矩阵将从右侧乘以。结果,当组合矩阵应用于矢量时,最后指定的子变换首先应用于矢量。或者换句话说,您可以按照您希望它们应用的顺序反向指定转换。
在您的示例中,您希望首先围绕y轴旋转,然后围绕z轴旋转,您需要先指定z旋转,然后指定y旋转。
答案 1 :(得分:1)
我自己想通了,每个对象都需要有自己的旋转矩阵/ Quaterunion。 围绕世界原点的新旋转是通过创建具有所需旋转的旋转矩阵并右旋乘以对象的现有旋转矩阵来完成的。
答案 2 :(得分:0)
好吧,如果你想要绿色箭头发生,那就意味着你需要围绕x轴旋转,在负方向上旋转90度(或者在正方向上旋转270度)。
为了简单起见,请按照以下方式考虑:
x
,对吧?由于x
没有改变,看起来你正在围绕x旋转,而你却是。 (1, 0, 0)
将是指向正x
的方向向量。虽然我对你正在使用的功能了解不多,但我的猜测是第二次调用应该是:
mMatrix.rotate(270, QVector3D(1, 0, 0));
相反,如果它支持负值,则可选择-90
。