OpenGL - 使用glm绕2个轴旋转

OpenGL - rotating around 2 axes using glm

我使用以下代码创建了 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,用来告诉你要旋转哪个轴;

尝试使用(至少要确定你是否相应地旋转):

tfms[i] = glm::rotate(tfms[i],glm::radians(90.0f),randVec4);

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

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