我正在使用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调用。此外,我认为值得一提的是,在我添加了我的推送和弹出后,我忘记了堆栈是按先后顺序处理的(对于任何有相同问题的人)。 - 再次感谢。
答案 0 :(得分:0)
如果您旋转一个对象然后进行平移,那么平移也会被旋转,因此渲染网格移动的方向将不会是您想要的,除非您将反向旋转应用于平移向量。
此外,按顺序按顺序进行旋转不太可能产生预期的结果。您应该将正在使用的欧拉角转换为4x4矩阵,并使用glMultMatrix
将其应用为单个旋转操作。另外,存储您的对象会单独转换为旋转(以欧拉角度),并且平移将使您的工作变得比它需要的更加困难。每个对象可以将平移和旋转存储为单个4x4变换矩阵。
如果要遍历场景图,其中对象从其父变换继承,则应使用(或实现)矩阵堆栈。 glRotatef
和glTranslatef
的使用清楚地表明您正在使用旧的GL 1.x矩阵功能,因此您应该查看glPushMatrix
和glPopMatrix
。
由于肢体应该相对于身体/躯干,因此应用躯干变换,进行平移然后旋转开始。完成此操作后,使用glPushMatrix
推送模型视图矩阵。所有进一步的操作都将使用新的转换作为基础,直到您致电glPopMatrix
。
这个伪代码版本看起来像这样:
applyTransformation(body.transform);
renderMesh(body);
pushMatrix();
applyTransformation(limb.transform);
renderMesh(limb);
popMatrix();