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 似乎会导致错误的旋转?的主要内容,如果未能解决你的问题,请参考以下文章