Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相对于原点移动网格_Java_Android_Opengl Es_3d - Fatal编程技术网

Java 相对于原点移动网格

Java 相对于原点移动网格,java,android,opengl-es,3d,Java,Android,Opengl Es,3d,Noobie:我可以构建和绘制网格(从STL文件加载),适当缩放并在屏幕上居中显示网格,但我似乎无法相对于原点移动网格。通常一个网格的坐标,比如说,都在+ve八分之一,所以我想移动它,使它的中心在原点上,然后我可以旋转它 我做错了,因为每当我移动网格时,原点都会随之移动。谁能拯救我的大脑,告诉我我做错了什么 public void onSurfaceChanged(GL10 gl, int w, int h) { gl.glViewport(0, 0, w, h); gl.g

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。

原点移动是什么意思?原点(0,0,0)只是空间中一个永远不会移动的点。你的意思是你称之为原点的网格的某个部分吗?对不起,我需要更好地描述它。。。网格或多或少是一个立方体,从0,0,0到大约130130(因此网格在一个角接触原点)。网格在屏幕上看起来完全居中,但glRrotatef使其在接触原点的角上旋转,而不是在网格的质量中心(约65,65,65)。天哪。赞美主。不管怎样,还是要赞美iforce2d。谢谢你。我曾尝试过平移/旋转/向后平移,但仍然失败。。。事实上,我一直在做translate/drawerelements/rotate/translateback。只需在旋转前后立即放置平移,即可完全按照预期工作。我再次感谢你。重新推/弹出,在一次只显示一个网格的情况下仍然需要这样做吗?如果没有推/弹出,在此之后绘制的所有内容也将围绕65,65,65旋转。你可能正在加载身份矩阵或在某个地方设置视图,但它不在你发布的代码中,所以我只是想确认一下。你是对的,我现在不打算在视图中放置任何其他内容,但谁知道呢。现在就做,下次我就不必再依赖你的仁慈了:非常感谢你的帮助。