GLM::Rotate 好像是旋转错误?
GLM::Rotate seems to cause wrong rotation?
简而言之,我正在学习 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(如果我错了请纠正我)。这应该 return 到原点,至少我是围绕奇异轴 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
简而言之,我正在学习 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(如果我错了请纠正我)。这应该 return 到原点,至少我是围绕奇异轴 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