OpenGL - 旋转立方体然后将其放置在距另一个立方体的偏移处的操作顺序是什么

时间:2014-01-07 04:45:46

标签: opengl

我正在使用OpenGL,为多个网格加载网格数据,这就是我想要做的。

我想旋转和对象,然后将它放置在距另一个对象的偏移处(这将模拟围绕'body'网格移动的手臂)。我怎样才能做到这一点。

目前,由于一些误算,我的'肢体'网格在主要物体周围飞行。任何人都可以帮忙。也许给出glTranslate和glRotation如何工作以及按什么顺序的一些例子。

这是在ModelView模式下

根据我的理解,1,0,0和-1,0,0的转换应该把我放在0,0,0。 此外,旋转1,0,0,然后-1,0,0,也应该让我回到0,0,0

这是来自Translate Rotation部分的代码

            // Remove Limb Offset
            gl.glTranslatef(
                    -object.get(id).Limb.get(i).offset.x,
                    -object.get(id).Limb.get(i).offset.y,
                    -object.get(id).Limb.get(i).offset.z
                );

            // Rotate Limb
            gmv = object.get(id).Limb.get(i).angle;
            gl.glRotatef( -gmv.x, 1, 0, 0 );
            gl.glRotatef( -gmv.y, 0, 1, 0 );
            gl.glRotatef( -gmv.z, 0, 0, 1 );

            // Restore Limb Offset
            gl.glTranslatef(
                    object.get(id).Limb.get(i).offset.x,
                    object.get(id).Limb.get(i).offset.y,
                    object.get(id).Limb.get(i).offset.z
                );

            // Camera Rotation
            gl.glRotatef( gm.gm3D.gmCamera.ang.x, 1, 0, 0 );
            gl.glRotatef( gm.gm3D.gmCamera.ang.y, 0, 1, 0 );
            gl.glRotatef( gm.gm3D.gmCamera.ang.z, 0, 0, 1 );

            // Main 'Body' mesh rotation
            gl.glTranslatef(
                    object.get( id ).Limb.get( 0 ).position.x - gm.gm3D.gmCamera.pos.x,
                    object.get( id ).Limb.get( 0 ).position.y - gm.gm3D.gmCamera.pos.y,
                    object.get( id ).Limb.get( 0 ).position.z - gm.gm3D.gmCamera.pos.z
                );

            gl.glDrawElements(GL10.GL_TRIANGLES,
                    object.get(id).Limb.get(i).Buffer.panelSize,
                    GL10.GL_UNSIGNED_SHORT,
                    object.get(id).Limb.get(i).Buffer.panelBuffer );

我的网状物画出但是肢体高速旋转离开身体,并且永远不会停留在“身体”网状物附近。

老实说,我觉得我对翻译和轮换的操作顺序的理解缺失了。有人可以帮忙吗?


感谢您的回复。你是对的。我忘了在每组翻译和旋转集之间添加Push和Pop Matrix调用。此外,我认为值得一提的是,在我添加了我的推送和弹出后,我忘记了堆栈是按先后顺序处理的(对于任何有相同问题的人)。 - 再次感谢。

1 个答案:

答案 0 :(得分:0)

如果您旋转一个对象然后进行平移,那么平移也会被旋转,因此渲染网格移动的方向将不会是您想要的,除非您将反向旋转应用于平移向量。

此外,按顺序按顺序进行旋转不太可能产生预期的结果。您应该将正在使用的欧拉角转换为4x4矩阵,并使用glMultMatrix将其应用为单个旋转操作。另外,存储您的对象会单独转换为旋转(以欧拉角度),并且平移将使您的工作变得比它需要的更加困难。每个对象可以将平移和旋转存储为单个4x4变换矩阵。

如果要遍历场景图,其中对象从其父变换继承,则应使用(或实现)矩阵堆栈。 glRotatefglTranslatef的使用清楚地表明您正在使用旧的GL 1.x矩阵功能,因此您应该查看glPushMatrixglPopMatrix

由于肢体应该相对于身体/躯干,因此应用躯干变换,进行平移然后旋转开始。完成此操作后,使用glPushMatrix推送模型视图矩阵。所有进一步的操作都将使用新的转换作为基础,直到您致电glPopMatrix

这个伪代码版本看起来像这样:

applyTransformation(body.transform);
renderMesh(body);
pushMatrix();
  applyTransformation(limb.transform);
  renderMesh(limb);
popMatrix();