当前位置: 首页 > 知识库问答 >
问题:

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

禄和宜
2023-03-14

我想在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());

第一次旋转后,后续旋转围绕新模型矩阵的基础旋转,而我希望后续旋转围绕原点旋转。

共有3个答案

堵宪
2023-03-14

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

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

  • 有哪些轴保持不变<代码>x,对吗?因为x没有变化,所以看起来像是围绕着x旋转,而实际上是这样

(1,0,0)是指向正x的方向向量。虽然我对您正在使用的函数了解不多,但我猜第二次调用应该是:

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

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

步衡
2023-03-14

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

樊博雅
2023-03-14

我认为,如果您只需颠倒在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轴旋转一个位置向量(0,0,1),然后将其旋转回其原始位置(只是尝试使其工作)。我阅读了旋转矩阵,并使它工作(排序),但我现在相当卡住了。 如图和代码所示,我在起点(0,0,1)处创建了一个立方体,并将其向下旋转30度。但顺时针旋转时,它的旋转角度似乎超过30度。但是,当我逆时针(30度)旋转它时,它确实旋转了适当的量。这导致它没有在它应该(0,0,1)的起点处结束。 我想知

  • 我刚开始使用JavaFX,有一个问题。在我的项目中,我想使用旋转矩形。但矩形只围绕其中心旋转,我希望它围绕其左上角旋转。 就像这张照片(从这里开始): 下面是我的项目中的一些代码: 在这种情况下,如果按下箭头键,矩形会旋转。

  • OpenGL总是围绕(0,0,0)旋转。但是我需要绕着相机旋转。我知道在GL中,没有相机,但是如果我翻译回(0,0,-6.0),它会绕着(0,0,0)旋转,而不是绕着(0,0,-6.0)旋转 所以我的问题是:如何在opengl和c中设置旋转中心 我已经找到了这篇文章:OpenGL围绕一个点旋转相机 显示此解决方案的地方: 旋转函数通常围绕原点旋转。要围绕另一个点P旋转,必须:平移(-P)旋转平移(

  • 嗨,我正在尝试实现一个带有旋转的opengl程序 以下代码仅供参考:

  • 我有两个矩形:红色和绿色。对于它们中的每一个,我有以下信息: 中心点( 和 坐标)。 旋转角度 宽度和高度 矩形将始终以正坐标移动。编辑:没有坐标可以是负的:矩形总是位于正坐标。因此,中心永远不会是(0,0)。 问题 我有一个起始位置。为了简化示例,假设我的红色和绿色矩形的位置如下: 现在,我使用0º和90º之间的角度φ旋转红色矩形。但是,绿色矩形需要旋转并保持其相对于红色矩形的位置。绿色矩形不仅

  • 假设我使用大小为8的字符数组来表示图像的碰撞掩码。字符的每一位代表一个像素。实际上,对于64x64矩阵,我将使用长[64]阵列。 因此,框将显示为: 45度的示例输出应该是这样的,尽管旋转可以是任何角度。这个形状对于45度旋转可能不准确,因为我是用手做的。 另一个例子是向右旋转10度?这些值可能是错误的,因为从数学上讲,我不知道它将如何精确旋转,但我认为可以安全地假设,如果每个位的覆盖率超过旧形状