[英]Problem rotating with quaternions in OpenGL (GLM/C++)
我正在为教育目的编写游戏引擎,但我对旋转有点卡住了。 问题是我在 UI 中有 3 个方块来表示对象在欧拉角中的方向,从那里我可以更改值。
要更改它们,我调用:
void TransformComponent::SetOrientation(glm::vec3 eulerAxAngles)
{
glm::vec3 euler_inRadians = glm::radians(eulerAxAngles);
glm::quat newRot;
double cy = cos(euler_inRadians.y * 0.5);
double sy = sin(euler_inRadians.y * 0.5);
double cp = cos(euler_inRadians.x * 0.5);
double sp = sin(euler_inRadians.x * 0.5);
double cr = cos(euler_inRadians.z * 0.5);
double sr = sin(euler_inRadians.z * 0.5);
newRot.w = cy * cp * cr + sy * sp * sr;
newRot.x = cy * cp * sr - sy * sp * cr;
newRot.y = sy * cp * sr + cy * sp * cr;
newRot.z = sy * cp * cr - cy * sp * sr;
m_Orientation = newRot * m_Orientation;
UpdateTransform();
}
m_Orientation 是一个存储对象当前方向的四元数。我知道从欧拉到四元数的所有转换都可以由 glm 处理,但我改成这个来调试正在发生的事情......
然后,UpdateTransform() 执行以下操作:
void TransformComponent::UpdateTransform()
{
m_TransformationMatrix = glm::translate(glm::mat4(1.0f), m_Translation) *
glm::scale(glm::mat4(1.0f), m_Scale) * glm::mat4_cast(m_Orientation);
//Set euler angles
m_Rotation_InEulerAngles = glm::eulerAngles(m_Orientation);
}
而 m_Rotation_InEulerAngles 是可以从 UI 中看到的 vec3,用于更改对象方向的角度。
问题是当我尝试修改 3 个欧拉角之一时,3 个被修改,我的意思是,如果我修改 Roll 角(围绕 Z 轴),它也会修改 Pitch 和 Yaw(不是 Z 值,它是就像它为对象设置了另一个方向)。
在这个 gif 中,显示了平移/缩放是如何很好地执行的,但旋转(现在以弧度显示)没有很好地执行,它改变了整个方向,而不仅仅是我想要的轴上的方向:
https://gfycat.com/plushhonestargentineruddyduck
有人看到我做错了什么吗?
更改或设置方向与旋转不同:
要设置你的方向,你想这样做:
void setOrientation(glm::vec3 eular)
{
m_Orientation = glm::quat(eular); // very simple
}
void setRotation(glm::vec3 eular)
{
m_Rotation = glm::quat(eular); // very simple
}
要旋转,我们要使用 SLERP 集成旋转四元数:
void update(float deltaTimeS)
{
glm::quat ident(1.0f);
glm::quat rotation = glm::mix(ident, m_Rotation, deltaTimeS);
m_Orientation = rotation * m_Orientation;
}
并得到你的旋转矩阵:
void setTransform()
{
m_RotationMatrix = glm::gtx::quaternion::toMat4(quaternion);
}
有关四元数旋转的更多信息,请参见此处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.