OpenGL-使用glm绕两个轴旋转

OpenGL-使用glm绕两个轴旋转,opengl,rotation,glm-math,Opengl,Rotation,Glm Math,我已经创建了2个圆柱体,我希望使用以下代码旋转它们: glm::vec3 randVec3 = { 1.0f, 0.0f, 0.0f }; glm::vec3 randVec4 = { 0.0f, 1.0f, 0.0f }; d_tfms[i] = glm::rotate(90.0f, randVec3 ); d_tfms[i] = glm::rotate(10.0f, randVec4); d_tfms[i]是一个4x4矩阵,然后作为ModelView矩阵传输到顶点着色器 在旋转之前,我的圆

我已经创建了2个圆柱体,我希望使用以下代码旋转它们:

glm::vec3 randVec3 = { 1.0f, 0.0f, 0.0f };
glm::vec3 randVec4 = { 0.0f, 1.0f, 0.0f };
d_tfms[i] = glm::rotate(90.0f, randVec3 );
d_tfms[i] = glm::rotate(10.0f, randVec4);
d_tfms[i]
是一个4x4矩阵,然后作为ModelView矩阵传输到顶点着色器

在旋转之前,我的圆柱体是这样的: (忽略其他形状,此处的圆柱体显示为空心二维圆)

第一次旋转后(沿x轴旋转90度):

第二次旋转后(沿y轴旋转10度):

如你所见,这些旋转没有意义。 特别是,如果你看第一张图片中的深蓝色圆柱体和第二张图片中的深蓝色圆柱体,它似乎没有围绕自己的局部x轴旋转

有什么问题吗?

d_-tfms[i]=glm::rotate(10.0f,randVec4)

这对我不起作用。。。你有最新版本的glm吗

glm::rotate函数有3个参数:

  • 4x4矩阵,可以是单位矩阵或转置矩阵(记住乘法顺序)
  • 旋转角度
  • 用于指示要旋转的轴的vec3
尝试使用(至少要确保您可以相应地旋转):


好的,回答你关于如何混合2个旋转的问题,只需将它们相乘(注意:矩阵相乘不是可交换的,因此matrixA*matrixB与matrixB*matrixA不同): d_tfms[i]=glm::rotate(10.0f,randVec4)*glm::rotate(90.0f,randVec3)

另外,您可以为这两个函数提供第一个参数,即(在本例中)单位矩阵(glm::mat4(1.0))
ie:d_tfms[i]=glm::rotate(glm::mat4(1.0)、10.0f、randVec4)*glm::rotate(glm::mat4(1.0)、90.0f、randVec3)

除了显示了
d\u-tfms[i]
的两个助手外,您没有显示这些cilynders在世界坐标中的位置。顺便说一下,它们在世界空间中不在同一位置,因此它们的ModelView矩阵是不同的,即使旋转相同。我的
glm
版本不需要矩阵作为第一个参数。然而,我注意到一个问题-我尝试启用和禁用旋转,我注意到只有指定的最后一个旋转被应用,而不是两者都应用。为什么?嗯。。。在glm旋转、平移和缩放堆栈中。。。我不知道怎么。。。如果你在你的循环之外声明你的矩阵,并将上面的任何一个应用到你的矩阵中,它会变得非常糟糕。。。尝试使用translates,你的数字会离得很远(不要:)…但是你应该得到最新的glm:D在循环外声明矩阵并在循环内应用变换有什么错?这是一个简单的数学问题,如果你知道矩阵积是如何工作的,纯旋转需要一个单位矩阵,这发生在循环的第一次运行中。在第二次运行中,您的矩阵不再是单位矩阵。这是我的假设,因为一旦我偶然发现了这种问题,可能不是你这里的主要问题,我只是建议你应该尝试使用3个参数进行旋转,并在循环中声明它,或者使它重置它的内容,然后以不同的角度再次旋转
tfms[i] = glm::rotate(tfms[i],glm::radians(90.0f),randVec4);