如何使用 GLM 在 OpenGL 中正确计算旋转
Posted
技术标签:
【中文标题】如何使用 GLM 在 OpenGL 中正确计算旋转【英文标题】:How to calculate rotation properly in OpenGL using GLM 【发布时间】:2016-02-17 12:42:28 【问题描述】:我有这个脚本来获取实体的 MVP,全部在 glm 中。我希望对象根据我用于移动的方向值旋转,但从视觉上看,对象的旋转速度慢了大约一百倍。这必须是准确的,才能在视觉上正确地表示方向。但是我不是专家,仍然只是在学习并试图解决它,所以再次希望聪明的人能帮助我吗? :)
void Entity::turnRight()
m_Orientation += m_TurnSpeed;
转弯速度默认为0.02
然后得到mvp:
m_Direction[0] = cos(0.0f) * sin(m_Orientation);
m_Direction[1] = sin(0.0f);
m_Direction[2] = cos(0.0f) * cos(m_Orientation);
glm::mat4 projectionMatrix = glm::perspective(90.0f, (GLfloat)640 / (GLfloat)480, 0.001f, 60.0f);
glm::mat4 translationMatrix = glm::translate(glm::mat4(), glm::vec3(m_Position[0], m_Position[1], m_Position[2]));
glm::mat4 Rotation = glm::rotate(glm::mat4(), (m_Orientation / m_TurnSpeed), glm::vec3(0, 1, 0));
m_MVP = (projectionMatrix * viewMatrix * glm::mat4() * translationMatrix * Rotation);
这就是它的全部内容......播放器正确旋转和平移,但在视觉上,它是关闭的,就像它转动的方式小于实际方向值(m_Orientation)
我没有在里面计算什么?
提前致谢!
【问题讨论】:
如果您每秒调用turnRight()
60 次,我预计完成一个完整的循环需要5 秒。这就是你得到的吗?
不,现实中的玩家在一个地方转了一百万次,当网格本身转一圈时,转一圈大约需要一分钟,所以我想我错过了一个计算
在网格转一圈之前,您调用了多少次turnRight()
?
13400 次,直到它完成一个完整的循环。刚刚测量它。我没有计算自上一帧以来经过的时间,但这仍然不是......
【参考方案1】:
我认为您使用的是旧版本的 GLM,它使用度数而不是弧度。这是旧版本 GLM 中的一个不幸的设计缺陷。
您或许可以使用预处理器宏来修复问题:
#define GLM_FORCE_RADIANS
#include <glm/...>
#include <glm/...>
不过,升级到更新版本的 GLM 可能会更好。 0.9.6 及更高版本默认使用弧度。
【讨论】:
非常感谢! :) 完美的。现在感觉就像旧的生化危机:P以上是关于如何使用 GLM 在 OpenGL 中正确计算旋转的主要内容,如果未能解决你的问题,请参考以下文章