C++ 旋转一次后,Opengl模型矩阵不会围绕原点旋转

C++ 旋转一次后,Opengl模型矩阵不会围绕原点旋转,c++,qt,opengl,c++11,rotation,C++,Qt,Opengl,C++11,Rotation,我想在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()); 第一次旋转后,后续旋转围绕新模型矩阵的基础旋转,而我希望后续旋转围绕

我想在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());
第一次旋转后,后续旋转围绕新模型矩阵的基础旋转,而我希望后续旋转围绕原点旋转

我画了一个小草图,这样我的问题可能会更清楚(黑色显示它现在的样子,绿色是我想要的样子):
绿色箭头显示了我希望它是什么样子。

如果你想让绿色箭头出现,那么它意味着你想绕x轴旋转,在负方向旋转90度(或在正方向旋转270度)

要使事情变得简单,可以这样想:

  • 有哪些轴保持不变<代码>x,对吗?因为
    x
    没有变化,所以看起来像是围绕着x旋转,而实际上是这样
  • 现在,将拇指指向正x所指向的方向,然后像圆柱体一样随意闭合其余手指。其他手指弯曲的方向就是旋转的方向
  • 因为你想要一个90度的旋转方向,与你的4个手指的旋转方向相反,或者270度的旋转方向相同。。。嗯
(1,0,0)
将是指向正
x
的方向向量。虽然我对您使用的函数不太了解,但我猜第二个调用应该是:

mMatrix.rotate(270, QVector3D(1, 0, 0));

相反,如果支持负值,则可以选择
-90

我认为,如果您只需颠倒在
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轴旋转。

我自己解决了这个问题,每个对象都需要有自己的旋转矩阵/四元数。
通过创建具有所需旋转的旋转矩阵并将对象的现有旋转矩阵右乘,可以围绕世界原点进行新的旋转。

我可以复制给定状态,我希望旋转彼此独立。使用的方法是给定类的给定Qt方法。哦,很抱歉,我误解了您的问题,抱歉。我不是专家,直到一个小时前我才知道这件事的相关信息;但是我刚才花了一些时间浏览了他们的项目网站,我有一个简单的猜测:你能试着把你的旋转改成
mMatrix.rotate(angle,mMatrix.map(QVector3D(0,0,1))然后告诉我它是否有效?我已经添加了它,但它似乎没有按预期工作。自从几个小时以来我就一直被这个问题困扰着,我发现四元数似乎是更好的方法,但它们也是基于更改的模型矩阵进行旋转的。我不明白这个映射方法是做什么的,但我假设它返回向量的坐标,这个坐标等于世界系统中的一个轴。我现在尝试将四元数与贴图方法结合起来,但这对我来说仍然是一种摸索。我需要变换旋转向量,不是吗?对不起,这个草图有点误导。我没有指定旋转的问题。我的对象具有x、y和z度,这应该描述它们如何围绕世界原点旋转。如果我应用第一个旋转,接下来的旋转是基于新的旋转矩阵的,不会绕世界原点旋转。没错,你可以通过颠倒应用变换的顺序来避免这种情况。不,这不起作用。旋转仍然基于旋转的矩阵旋转,而不是基于世界原点