GLM::旋转似乎会导致错误的旋转

GLM::Rotate seems to cause wrong rotation?

本文关键字:旋转 错误 GLM      更新时间:2023-10-16

简单地说,我正在学习OpenGL,并开始学习变换矩阵。以下是我当前的代码:

glm::vec4 myPosition(1.0f, 1.0f, 1.0f, 1.0f);
glm::vec3 rotationAxis(0.0f, 1.0f, 0.0f);
glm::mat4 scalar = glm::scale(glm::vec3(1.0f, 1.0f, 1.0f));
glm::mat4 rotator = glm::rotate(360.0f, rotationAxis);
glm::mat4 translator = glm::translate(glm::vec3(1.0f, 1.0f, 1.0f));
glm::mat4 transform = translator * rotator * scalar;
myPosition = transform * myPosition;

据我所知,我是按正确的顺序执行的:缩放->旋转->平移。所以,我把缩放设置为什么都不做,因为我实际上不希望它在任何地方缩放(为了简单起见)。

接下来,我将Y轴上的旋转设置为360.0f(如果我错了,请更正)。这应该回到原点,至少我认为这是围绕奇异轴360度旋转的结果。

然后,我将其设置为在每个方向上平移1个单位,以确保它移动。

在完成这一切之后,我已经评论掉了旋转器的线条,即使我改变了比例,它也非常棒。然而,每当我添加旋转线时,最终位置不是正常的360度旋转?

我已将程序配置为在变换之前和之后输出位置矢量。

之前的位置是(1,1,1)

后位置为(1.67522,2,-0.242607)。

我一整天都在努力寻找我的错误,所以如果有人能帮我发现我做错了什么,我将不胜感激!!

根据http://glm.g-truc.net/0.9.7/api/a00236.html(对于目前最新发布的版本),glm::rotate(..)采用以度表示的角度。

然而,改变你的旋转矩阵线

glm::mat4 rotator = glm::rotate(360.0f, rotationAxis);

glm::mat4 rotator = glm::rotate(3.141592f * 2.0f, rotationAxis);

这只是2*PI修复了这个问题。

这意味着角度应该以弧度为单位,而不是以度为单位。在我的机器上用GLM 0.9.7.1-1进行了测试。这要么是文档中的错误,要么是GLM代码本身的错误。

根据我使用GLM的经验(一段时间前,可能是早期版本),这些类型的函数默认情况下应该采用度角,#define GLM_FORCE_RADIANS宏使它们以弧度计算。可能是作者将此作为默认行为,而忘记了更新文档。

附带说明一下,您可能不应该使用scalar作为glm::mat4值的名称,因为数学中的标量只是一个实数,而不是矩阵:https://en.wikipedia.org/wiki/Scalar_%28mathematics%29