我有一个对象,想要按照偏航角(Yaw)、俯仰角(Pitch)和横滚角(Roll)的方式旋转它,相对于该对象自己的局部坐标系而不是全局坐标系。根据这个网站上的说明,我需要按照这个顺序进行旋转。我理解为:
glRotatef(m_Rotation.y, 0.0, 1.0, 0.0);
glRotatef(m_Rotation.z, 0.0, 0.0, 1.0);
glRotatef(m_Rotation.x, 1.0, 0.0, 0.0);
然而,绕Y和Z轴的旋转不起作用。绕Y轴的旋转始终是相对于全局空间的,而绕Z轴的旋转仅在绕X轴的旋转为0时有效,否则会出现问题。
为了确保,我也尝试了反向顺序,但那也不起作用。我认为我已经尝试了所有其他顺序,所以问题肯定是其他方面引起的。可能是什么原因呢?
这是我获取旋转的方式:
///ROTATIONS
sf::Vector3<float> Rotation;
Rotation.x = 0;
Rotation.y = 0;
Rotation.z = 0;
//ROLL
if (m_pApp->GetInput().IsKeyDown(sf::Key::Up) == true)
{
Rotation.x -= TurnSpeed;
}
if (m_pApp->GetInput().IsKeyDown(sf::Key::Down) == true)
{
Rotation.x += TurnSpeed;
}
//YAW
if (m_pApp->GetInput().IsKeyDown(sf::Key::Left) == true)
{
Rotation.y -= TurnSpeed;
}
if (m_pApp->GetInput().IsKeyDown(sf::Key::Right) == true)
{
Rotation.y += TurnSpeed;
}
//PITCH
if (m_pApp->GetInput().IsKeyDown(sf::Key::Q) == true)
{
Rotation.z -= TurnSpeed;
}
if (m_pApp->GetInput().IsKeyDown(sf::Key::E) == true)
{
Rotation.z += TurnSpeed;
}
然后将它们添加到 m_Rotation 中:
//Rotation
m_Rotation.x += Angle.x;
m_Rotation.y += Angle.y;
m_Rotation.z += Angle.z;
它们被传递给正在移动的事物内部的一个函数,但没有其他操作。
您有什么想法吗?是否需要调用其他内容,以确保旋转的所有轴都是本地轴?