我正在使用这个非常简单的代码来围绕自己的原点旋转对象
void Entity::rotate(unsigned short axis, float speed, float delta)
{
m_Orientation[axis] += delta * speed;
glm::quat quaternion = glm::quat(glm::vec3(m_Orientation[0], m_Orientation[1], m_Orientation[2]));
m_RotationMatrix = glm::mat4_cast(quaternion);
}
我面临的问题是旋转仅相对于 X 轴上物体的方向。这意味着无论物体面向哪个方向(它的方向是什么),如果我围绕 X 旋转它,它将始终围绕它自己的 X 轴旋转。这就是我想要做的,但也在另外两个轴上。
但Y和Z总是围绕世界X和Y轴旋转,无论我的物体面向哪个方向。
我的代码太小而且简单我没有真正看到问题? X旋转总是纠正事故,还是其他两个错误?
答案 0 :(得分:0)
我建议你试试这个:
#include <glm/gtx/euler_angles.hpp>
/**
If you change speed to a vec3,
it do all the calculations at once
(you won't have to do it for each angle)
**/
void Entity::rotate(glm::vec3 speed, float delta)
{
rotation = speed * data
m_modelMatrix *= glm::eulerAngleXYZ(rotation.x, rotation.y, rotation.z);
}
glm :: eulerAngleXYZ函数将获取角度并从中创建旋转矩阵。
但要注意gimbal lock。
如果从右到左进行矩阵的乘法运算,它将围绕全局轴旋转。如果以另一种方式执行,它将围绕局部轴旋转。