我无法在Open GL中旋转我的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);
我仍然得到奇怪的轮换。
长话短说... 使用对象的外观,向右和向上矢量在Open GL中旋转3D对象的正确方法是什么?
答案 0 :(得分:0)
你需要在之前围绕(Y)进行偏航旋转。否则,音高将会关闭。
E.g。你的向下倾斜45度,偏航180度。首先进行俯仰,然后围绕飞机的Y矢量旋转偏航,尽管俯仰向下,飞机最终会向上和向后指向。通过首先进行偏航,平面向后指向,然后围绕平面X向量的俯仰将使其正确向下指向。
同样的逻辑适用于roll,需要最后应用。
所以你的代码应该是:
glRotatef(yawTotal, 0,1,0);
glRotatef(pitchTotal, 1,0,0);
glRotatef(rollTotal, 0,0,1);
答案 1 :(得分: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();
您可能不希望在发货代码中使用OpenGL堆栈,因为它并非真正为此类用途而构建,因此性能可能会不高。但你可以进行原型设计和剖析,而不是做出假设。您还需要考虑浮点精度问题 - 实际上您应该应用一个步骤来确保myOrientation在调整后仍然是正交的。
最简单的方法是检查谷歌,但简单地说,你将使用点积来消除从两个轴到第三个轴的错误串扰,然后从第二个轴中的一个中移除,然后从第二个轴中移除重新正常化这三个。
答案 2 :(得分:0)
感谢您的回复。第一个响应指向了正确的方向,第二个响应也有所帮助,但最终它归结为两者的结合。最初,您的3D对象应该有一个成员变量,它是一个浮点数组大小16. [0-15]。然后,您必须将其初始化为单位矩阵。然后你的3D对象的成员方法,如“yawObject(浮动量)”只知道你从“对象的角度”而不是世界偏转对象,这将允许增量旋转。在yawObject方法(或pitch,roll ojbect)中,你需要调用Matrix.rotateM(myfloatarray,0,angle,0,1,0)。这将存储新的旋转矩阵(如第一个响应中所述)。然后,当您要绘制对象时,可以使用gl.glMultMatrix将模型矩阵乘以myfloatarray矩阵。
祝你好运,如果您需要更多信息,请告诉我。