Opengl模型矩阵在旋转一圈后不绕原点旋转
Posted
技术标签:
【中文标题】Opengl模型矩阵在旋转一圈后不绕原点旋转【英文标题】:Opengl Model Matrix doesnt rotate around the origin after one rotation 【发布时间】:2014-07-09 23:08:00 【问题描述】:我想在 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());
第一次旋转后,随后的旋转围绕新模型矩阵的底部旋转,而我希望随后的旋转围绕原点旋转。
我画了一个小草图,这样我的问题可能会更清楚(黑色显示它现在的样子,绿色是我想要的样子): 绿色箭头显示了我想要的样子。
【问题讨论】:
我需要变换旋转向量,不是吗? 【参考方案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 旋转。
【讨论】:
对不起,这个草图有点误导。我没有指定旋转的问题。我的对象有一个 x、y 和 z 度,应该描述它们如何围绕世界原点旋转。如果我应用第一次旋转,则随后的旋转基于新的旋转矩阵,并且不会围绕世界原点旋转。 完全正确,您可以通过颠倒应用转换的顺序来避免这种情况。 不,这不起作用。旋转仍然基于旋转后的矩阵旋转,而不是世界原点的基础【参考方案2】:我自己想通了,每个对象都需要有自己的旋转矩阵/四联体。 围绕世界原点的新旋转是通过使用所需旋转创建一个旋转矩阵并右乘对象的现有旋转矩阵来完成的。
【讨论】:
【参考方案3】:好吧,如果你想要绿色箭头的事情发生,那么这意味着你想要绕 x 轴旋转,在负方向上旋转 90 度(或在正方向上旋转 270 度)。
为了简单起见,可以这样想:
那里的哪些轴保持不变?x
,对吧?由于x
没有改变,看起来你正在围绕 x 旋转,而你确实在旋转。
现在,将拇指指向正 x 指向的方向,然后像圆柱体一样随意合上其余手指。其余手指卷曲的方向就是旋转的方向。
因为您想要在与您的 4 个手指卷曲的相反方向上旋转 90 度,或者在同一方向上旋转 270 度...是的。
(1, 0, 0)
将是指向正x
的方向向量。虽然我不太了解您正在使用的功能,但我的猜测是第二次调用应该是:
mMatrix.rotate(270, QVector3D(1, 0, 0));
相反,如果支持负值,也可以选择-90
。
【讨论】:
重现给定状态没有问题,我希望旋转彼此独立。使用的方法是给定类的给定 Qt 方法 哦,很抱歉,我误解了您的麻烦,抱歉。我不是专家,直到一个小时前我才完全没有关于这个 Qt 的信息;但是我刚才花了一些时间浏览了他们的项目网站,我有一个简单的猜测:你可以尝试将你的旋转更改为mMatrix.rotate( angle, mMatrix.map( QVector3D( 0, 0, 1 ) ) );
的形式,然后告诉我它是否有效?
我已经添加了它,它似乎没有按预期工作。由于我在几个小时后就陷入了这个问题,我发现四元数似乎是更好的方法,但这些也是根据更改的模型矩阵进行旋转的。我不明白这个 map 方法的作用,但我假设它返回向量的坐标,它等于世界系统中的轴。我现在尝试将四元数与 map 方法的使用结合起来,但这对我来说仍然是在黑暗中摸索。以上是关于Opengl模型矩阵在旋转一圈后不绕原点旋转的主要内容,如果未能解决你的问题,请参考以下文章