2012-02-22 127 views
-1

我在Open GL中旋转3D对象时遇到了问题。我通过加载标识(glLoadIdentity())开始每个绘制帧,然后根据我需要的内容(对于相机等)在栈上按压和弹出。然后,我希望3D物体能够滚动,俯仰和偏航,然后让它们正确显示。Open GL Android 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);

我仍然有怪异的旋转。

长话短说... 在Open GL中使用对象的外观,正确向上矢量旋转3D对象的正确方法是什么?

回答

0

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

祝你好运,让我知道你是否需要更多的信息。

0

您需要在之前围绕(Y左右)做偏航旋转。否则,音调将关闭。

E.g.你有45度的向下俯仰和180度的偏航。通过首先进行俯仰,然后围绕飞机的Y向量旋转偏航,尽管俯仰向下,但飞机最终会向上和向后移动。通过首先进行偏航,平面向后指向,然后围绕平面X向量的俯仰将使其正确地向下指向。

同样的逻辑适用于滚动,这需要最后应用。

所以,你的代码应该是:

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

对不起,我犯了一个错误,第二组glRotates本来应该是围绕着向上,向右看的。我尝试重新排列向量,并且我的对象仍然没有正确旋转。它工作在90度的角度相当不错。换句话说,我可以用90度的角度滚动,俯仰和偏航飞行我的物体,但这并不总是有效(只有一段时间),然后如果我尝试做小增量,它会变得疯狂......尽管谢谢你的建议! – Matthew 2012-02-22 22:01:38

0

累积旋转将万向节锁定苦。这样看:假设你在飞机上飞行。逆时针旋转90度。然后,您顺时针应用90度卷。然后,您顺时针施加90度的偏航。

您的飞机现在指向正下方 - 总效果是顺时针旋转90度。但是,如果你只是试图加入不同的旋转角度,那么你最终会得到一个90度的角度,并且没有任何音高,因为你没有把音高应用到飞机上。

试图存储和更新旋转,因为三个不同的角度不起作用。

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

因此,假设你想要去的矩阵,你的原型可能会做这样的事情(请原谅我缺乏像样的Java知识;我要去写实质上C):

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(); 

你可能穿上”因为它不是真的为这种使用而构建,所以性能可能会很差。但是你可以制作原型并进行配置而不是做出一个假设。您还需要考虑浮点精度问题 - 实际上,您应该采用确保myOrientation在调整后仍然正常的步骤。

检查Google可能是最容易的,但简单地说,您将使用点积从两个轴向第三个轴移除错误的串扰,然后从第二个轴中的一个轴移除,然后将所有三个归一化。