GLM::旋转似乎会导致错误的旋转
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(如果我错了,请更正)。这应该回到原点,至少我认为这是围绕奇异轴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
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的旋转数组代码给出了大数组大小的错误
- D3DXMatrix旋转轴旋转错误的轴
- 四元数旋转错误
- 旋转数组 - 错误
- 直接相机旋转的错误控制
- AVL树双重旋转错误
- GLM::旋转似乎会导致错误的旋转
- 有人能在我的代码中找到矩阵旋转的错误
- 旋转实现错误
- boost::几何多边形的 outer() 在多边形旋转后有错误的坐标