如何调整可视区域的大小以显示所有对象/坐标?

时间:2011-11-21 12:53:49

标签: android java-3d renderer glsurfaceview

我正在GLSurfaceArea上绘制一些对象(类似于:http://www.droidnova.com/android-3d-game-tutorial-part-ii,328.html)。 一切正常,但只显示坐标在-1.0 - +1.0间隔的点。有没有办法调整可视区域的大小以显示不在此区域内的坐标(例如(-2.0,2.0,0.0))?

1 个答案:

答案 0 :(得分:0)

您想要更改view frustum。这是我在Android Renderer类中完成的方法:

int viewportWidth = -1;
int viewportHeight = -1;
int zoom = 0.5f;
float nearPlane = 3.0f;
float farPlane = 7.0f;
float FOV = 60.0f

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {

    viewportWidth = width;
    viewportHeight = height;

    gl.glViewport(0, 0, width, height);

    setProjectionMatrix(gl);

}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {

    setProjectionMatrix(gl);

}

protected void setProjectionMatrix(GL10 gl){
    if(viewportWidth <0 || viewportHeight <0){
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl, FOV*zoom, 1.0f, nearPlane, farPlane);        
    } else {
        float ratio = (float) viewportWidth / viewportHeight;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio*zoom, ratio*zoom, -1*zoom, 1*zoom, nearPlane, farPlane);

    }
}

正如你所看到的,我主要使用glFrustumf,不使用GLU.gluPerspective,我根本不使用glOrthof,但这不是问题。根据您使用的方法,您将获得不同的结果。想象一下,你有一组火车轨道从你面前开始离你而去。使用正交投影,当它们在你面前时,它们在地平线上的距离仍然是相同的距离。通过透视投影,它们似乎在一些遥远的“消失点”进行传播。

如果您使用我上面的代码,请尝试更改近和远平面变量以及缩放变量以查看它对您的程序的影响