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);
}
答案 0 :(得分:3)
您只需按相反顺序旋转和翻译即可。 OpenGL中的矩阵乘法与我们直观地思考它们的方式相反。如果你想将你的物体移动到原点然后旋转它,你需要首先glRotate然后glTranslate - 是的... wierd呵呵。
我会把glTranslate放到onDrawFrame中,然后每帧都这样做。
编辑:啊...你希望它显示在原点的角落但是在65,65,65左右旋转?然后你需要翻译它-65,旋转,然后翻译65来取回它。这将使旋转中心围绕对象的中心。
你也应该围绕这些电话有一个glPushMatrix / glPopMatrix。