Open GL Android 3D对象旋转问题

Open GL Android 3D对象旋转问题,android,opengl-es,3d,rotation,Android,Opengl Es,3d,Rotation,在OpenGL中旋转3D对象时遇到问题。我通过加载标识(glLoadIdentity())来启动每个画框,然后根据需要(相机等)在堆栈上按下并弹出。然后我希望3D对象能够滚动、俯仰和偏航,然后正确显示它们 这是陷阱。。。我希望能够像驾驶飞机一样做增量旋转。因此,每次按下“向上”按钮时,对象都会绕其自身的x轴旋转。但如果对象向下倾斜并选择偏航,则旋转应围绕对象的上方向向量,而不是Y轴 我尝试过做以下操作: glRotatef(pitchTotal,1,0,0) glRotatef(yawTotal

在OpenGL中旋转3D对象时遇到问题。我通过加载标识(glLoadIdentity())来启动每个画框,然后根据需要(相机等)在堆栈上按下并弹出。然后我希望3D对象能够滚动、俯仰和偏航,然后正确显示它们

这是陷阱。。。我希望能够像驾驶飞机一样做增量旋转。因此,每次按下“向上”按钮时,对象都会绕其自身的x轴旋转。但如果对象向下倾斜并选择偏航,则旋转应围绕对象的上方向向量,而不是Y轴

我尝试过做以下操作:

glRotatef(pitchTotal,1,0,0)
glRotatef(yawTotal,0,1,0)
glRotate(rollTotal,0,0,1)

这些似乎不起作用。(请记住向量的计算是正确的)
我也尝试过……

glRotatef(pitchTotal,1,0,0)
glRotatef(yawTotal,0,1,0)
glRotate(rollTotal,0,0,1)

我仍然会有奇怪的旋转。


长话短说。。。在OpenGL中,使用对象的look、right和up矢量旋转3D对象的正确方法是什么?

在进行俯仰之前,需要围绕Y进行偏航旋转。否则,球场将关闭

例如,你有45度的向下俯仰和180度的偏航。通过先做俯仰,然后围绕飞机的Y矢量旋转偏航,飞机最终将指向上和向后,尽管俯仰是向下的。通过先做偏航,平面向后指向,然后围绕平面X向量的俯仰将使其正确指向下方

同样的逻辑也适用于roll,它需要最后应用

因此,您的代码应该是:

glRotatef(yawTotal, 0,1,0);
glRotatef(pitchTotal, 1,0,0);
glRotatef(rollTotal, 0,0,1);

累积旋转将受到万向节锁的影响。这样看:假设你在一架飞机上,水平飞行。逆时针应用90度的偏航。然后顺时针旋转90度。然后顺时针应用90度的偏航

你的飞机现在正朝下-总的效果是顺时针倾斜90度。但是如果你只是想把不同的旋转加起来,那么你会得到一个90度的滚动,没有任何俯仰,因为你在任何时候都没有对平面施加俯仰

尝试存储和更新旋转作为三个单独的角度不起作用

常用的解决方案是使用四元数或将对象方向直接存储为矩阵。矩阵解决方案更容易构建,因为您可以使用OpenGL内置的矩阵堆栈对其进行原型化。大多数人似乎也发现矩阵比四元数更容易理解

因此,假设您想使用matrix,您的原型可能会这样做(请原谅我缺乏良好的Java知识;我将编写C):

您可能不想在发布代码时使用OpenGL堆栈,因为它不是为这种用途而构建的,因此性能可能会有问题。但你可以建立原型和轮廓,而不是做假设。您还需要考虑浮点精度问题-实际上,您应该应用一个步骤,确保MyOrror在调整之后仍然是正交的。
这可能是检查Google最简单的方法,但简单地说,您将使用点积从两个轴到第三个轴消除错误的串扰,然后从前两个轴中的一个轴到第二个轴消除错误的串扰,然后重新规范化所有三个轴。

感谢您的回复。第一个回答为我指明了正确的方向,第二个回答也有一点帮助,但最终归结为两者的结合。最初,3D对象应具有一个成员变量,该变量为浮点数组大小16。[0-15]. 然后必须将其初始化为标识矩阵。然后,3D对象的成员方法(如“yawObject(float amount)”)只需知道,您是从“对象视点”而不是从世界来偏航对象,这将允许增量旋转。在yawObject方法(或pitch,roll-ojbect)中,您需要调用Matrix.rotateM(myfloatarray,0,angle,0,1,0)。这将存储新的旋转矩阵(如第一个响应中所述)。然后,您可以在即将绘制对象时,使用gl.glMultMatrix将模型矩阵乘以myfloatarray矩阵


祝你好运,如果你需要更多的信息,请告诉我。

对不起,我犯了一个错误,第二组glRotates应该在向上、向右和环视向量周围。我尝试重新排列矢量,但我的对象仍然没有正确旋转。它在90度角时工作得很好。换句话说,我可以通过90度的横摇、俯仰和偏航来让我的物体四处飞行,但这并不总是有效(只有一段时间),如果我尝试做一些小的增量,它就会变得疯狂。。。谢谢你的建议!
GLfloat myOrientation[16];

// to draw the object:
glMultMatrixf(myOrientation);
/* drawing here */

// to apply roll, assuming the modelview stack is active:
glPushMatrix();                    // backup what's already on the stack
    glLoadIdentity();              // start with the identity
    glRotatef(angle, 0, 0, 1);
    glMultMatrixf(myOrientation);  // premultiply the current orientation by the roll

    // update our record of orientation
    glGetFloatv(GL_MODELVIEW_MATRIX, myOrientation);
glPopMatrix();