因此,我尝试根据偏航、俯仰和滚动方案旋转一个对象,相对于该对象自己的局部轴而不是全局空间的轴。根据this,我需要按该顺序执行轮换。我将其解释为:
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;
(它们被传递给正在移动的物体内部的函数,但没有对它们进行任何其他操作)。
想法?我还应该调用其他方法来确保所有旋转的轴都是局部轴吗?