【发布时间】:2012-03-30 23:10:30
【问题描述】:
所以我有一个对象,我正在尝试根据 Yaw、Pitch 和 Roll 方案旋转,相对于对象自己的局部轴而不是全局空间的轴。根据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;
(它们被传递给正在移动的东西的内部函数,但没有对它们做任何其他事情)。
想法?还有什么我应该调用以确保所有旋转的轴都是局部轴吗?
【问题讨论】:
-
无论如何使用旋转矩阵可能更好。
-
你试过 P->R->Y 作为命令吗?您是否考虑到,一旦您旋转,应用新旋转所围绕的轴就是 新 轴,我的意思是原始轴旋转了某个角度?
-
是的,我已经尝试过 P-R-Y,但这也无济于事 - Roll 粘在全局轴上。我没有使用转换矩阵的经验——他们会完全避免这个麻烦吗?难道我还需要三个 glRotatef() 调用并将它们按某种顺序排列吗?
-
您的对象是在原点旋转之前吗..?如果不是,您必须将其转换为原点,然后旋转并转换回指定位置。否则它与您想要的旋转不同..