简单地说,我正在学习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;
据我所知,我正在以正确的顺序执行此操作:缩放 - >旋转 - >翻译。因此,我将比例设置为什么都不做,因为我实际上并不希望它在任何地方扩展(为简单起见)。
接下来,我将旋转设置为360.0f(如果我错了,请更正我)Y轴。这应该回到原点,至少这是我想到的围绕一个单轴的360度旋转。
然后,我将其设置为在每个方向上翻译1个单位以确保它移动。
完成所有这些之后,我已经注释掉了旋转线,即使我改变了比例,它也很有效。但是,每当我添加旋转线时,最终位置不是正常的360度旋转?
我已将程序配置为在变换之前和之后输出位置向量。
前一个位置是(1,1,1)
后位是(1.67522,2,-0.242607)。
我一直在努力找到我的错误,几乎整天如此,如果有人能帮助我找到我做错了什么,我将不胜感激!!
答案 0 :(得分: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值的名称,因为数学中的标量只是一个实数而不是矩阵:{{3} }