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

Posted

技术标签:

【中文标题】GLM::Rotate 似乎会导致错误的旋转?【英文标题】:GLM::Rotate seems to cause wrong rotation? 【发布时间】:2015-12-08 21:21:45 【问题描述】:

简单地说,我正在学习 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)。

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

【问题讨论】:

此外,rotationAxis 向量是在此处创建的,以便于查找和正确读取。最终产品只会在旋转的参数中初始化该向量。 【参考方案1】:

根据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

【讨论】:

谢谢,我假设你是对的。而且我知道命名约定不正确,这只是在玩矩阵,看看我是否得到了正确的结果,所以我没有描述我的名字。我现在就试试! 是的,这行得通。他们应该在文档中真正改变它,但它是什么。非常感谢 我在这个错误上浪费了令人尴尬的时间。现在我们知道它需要弧度,在 GLM 9.7.1 中有一个函数 glm::radians 可以为您计算弧度。

以上是关于GLM::Rotate 似乎会导致错误的旋转?的主要内容,如果未能解决你的问题,请参考以下文章

使用 `glm::rotate` 和四元数向上旋转 3D 方向向量

在 GLM 旋转对象不再居中之后

GLSL 中的正常旋转

glm 旋转和平移

GLM 旋转矩阵与预期结果不同

旋转矩阵的问题(openGL/glm)[关闭]