java - 相对于原点移动网格

标签 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); 
    }       

最佳答案

您只需按相反的顺序旋转和平移即可。 OpenGL 中的矩阵乘法与我们的直觉相反。如果你想将你的对象移动到原点然后旋转它,你需要先 glRotate 然后 glTranslate - 是的......奇怪吧。

我会将 glTranslate 放入 onDrawFrame 并在每一帧都执行。

编辑:啊...你想让它在原点显示角,但围绕 65、65、65 旋转?然后你需要将它平移-65,旋转,然后平移 65 以将其取回。这将使旋转中心围绕对象的中心。

你也应该在这些调用周围有一个 glPushMatrix/glPopMatrix。

关于java - 相对于原点移动网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369893/

相关文章:

java - 关闭后重新显示对话框

java - 从命令行向 java 程序传递值,它是如何工作的?

java - 在 JVM 外部分配内存并在 JVM 内部使用它

android - ListView 标题忽略 layout_height

iphone - 射线-三角形交叉点拾取不起作用

java - 可执行 jar 文件中的 BeanDefinitionParsingException

android - ActionbarSherlock 不工作

android - SQLite匹配列名,忽略逗号

java - OpenGL2.0教程的示例代码在运行时崩溃

android - 黑屏与opengl es 1.1 android吗?还错误报告