OpenGL - 使用 glm 围绕 2 个轴旋转

Posted

技术标签:

【中文标题】OpenGL - 使用 glm 围绕 2 个轴旋转【英文标题】:OpenGL - rotating around 2 axes using glm 【发布时间】:2017-02-24 17:42:11 【问题描述】:

我创建了 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 矩阵传输到顶点着色器。

在任何旋转之前,这是我的圆柱体的样子: (忽略其他形状,这里的圆柱体显示为 空心 2D 圆)

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

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

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

可能是什么问题?

【问题讨论】:

除了您为d_tfms[i] 展示了两个分配之外,您没有展示这些圆柱体在世界坐标中的位置。顺便说一句,它们在世界空间中的位置不同,因此它们的 ModelView 矩阵是不同的,即使旋转相同。 【参考方案1】:

好的,回答您关于如何混合 2 个旋转的问题,只需将它们相乘即可(注意:矩阵乘法是可交换的,因此 matrixA * matrixB 与 matrixB * matrixA 不同): 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);

【讨论】:

【参考方案2】:

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);

【讨论】:

我拥有的glm 版本不需要矩阵作为第一个参数。但是,我注意到一个问题 - 我尝试启用和禁用旋转,我注意到只应用了指定的最后一个旋转,而不是两者。这是为什么呢? 好吧......在glm中旋转,翻译和缩放堆栈......我不知道如何......如果你在循环之外声明你的矩阵并将上述任何一个应用于你的矩阵它会搞砸真的很糟糕......尝试翻译,你的数字会在远处走得很远(不要:)))...... 你应该得到最新的 glm :D 在循环外部声明矩阵并在内部应用转换有什么问题? 这是一个简单的数学问题,也就是说,如果您知道矩阵乘积是如何工作的,那么纯旋转需要一个单位矩阵,并且会在循环的第一次运行中发生。但在第二次运行中,您的矩阵不再是单位矩阵。这是我的假设,因为一旦我偶然发现这种问题,可能不是您的主要问题,我只是建议您应该尝试使用 3 个参数进行旋转并在循环中声明它或使其重置它的内容然后你再次以不同的角度旋转

以上是关于OpenGL - 使用 glm 围绕 2 个轴旋转的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转

如何使用现代 OpenGL 的 GLM 或 JOML 矩阵正确转换(平移、旋转、缩放)对象

OpenGL三角形旋转错误

在OpenGL中围绕特定点旋转对象

opengl旋转的对象不居中

如何围绕任意轴旋转一个点?