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);
}
最佳答案
您只需按相反的顺序旋转和平移即可。 OpenGL 中的矩阵乘法与我们的直觉相反。如果你想将你的对象移动到原点然后旋转它,你需要先 glRotate 然后 glTranslate - 是的......奇怪吧。
我会将 glTranslate 放入 onDrawFrame 并在每一帧都执行。
编辑:啊...你想让它在原点显示角,但围绕 65、65、65 旋转?然后你需要将它平移-65,旋转,然后平移 65 以将其取回。这将使旋转中心围绕对象的中心。
你也应该在这些调用周围有一个 glPushMatrix/glPopMatrix。
关于java - 相对于原点移动网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369893/