相对于原点移动网格

时间:2011-06-16 09:42:29

标签: java android opengl-es 3d

Noobie:我可以构建并绘制一个网格(从STL文件加载),适当地缩放它并使网格在屏幕上居中,但我似乎无法相对于原点移动网格。例如,网格的坐标通常都在+ ve八分圆中,所以我想移动它以使其中心位于原点上,然后我可以旋转它。

我做错了什么,因为每当我移动网格时,原点随之移动。任何人都可以拯救我的大脑并告诉我我做错了什么吗?

public void onSurfaceChanged(GL10 gl, int w, int h) {

    gl.glViewport(0, 0, w, h); 
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity(); 

    GLU.gluPerspective(gl, 45f, (float)w / (float)h, 0.1f, 5f * fMesh_Z_Extent;

    gl.glTranslatef(0, 0, 0 - (2.5f * fMesh_Z_Extent));

    float f1, f2, f3;

    // set f1, f2, f3 to move centre of model to sit on the origin
    // this works perfectly, but the origin has moved with the mesh! Grrrr. 

    gl.glTranslatef(f1, f2, f3);

    gl.glMatrixMode(GL10.GL_MODELVIEW);     //Select The Modelview Matrix
    gl.glLoadIdentity(); 
    }

public void onDrawFrame(GL10 gl) {

    gl.glClearColor(0f, 0f, 0f, 1f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // initialise mesh here

    gl.glColor4f(8f, 255f, 128f, 1f);

    gl.glDrawElements(GL10.GL_TRIANGLES, Global.indices.length,
                  GL10.GL_UNSIGNED_SHORT, Global.indexBuffer);

    gl.glRotatef(3.0f, 0.0f, 1.0f, 0.0f);

    // Disable the vertices buffer.
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    }       

1 个答案:

答案 0 :(得分:3)

您只需按相反顺序旋转和翻译即可。 OpenGL中的矩阵乘法与我们直观地思考它们的方式相反。如果你想将你的物体移动到原点然后旋转它,你需要首先glRotate然后glTranslate - 是的... wierd呵呵。

我会把glTranslate放到onDrawFrame中,然后每帧都这样做。

编辑:啊...你希望它显示在原点的角落但是在65,65,65左右旋转?然后你需要翻译它-65,旋转,然后翻译65来取回它。这将使旋转中心围绕对象的中心。

你也应该围绕这些电话有一个glPushMatrix / glPopMatrix。