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

问题描述 投票:0回答:1

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

android java-3d renderer glsurfaceview
1个回答
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,但这不是问题。根据您使用的方法,您将获得不同的结果。想象一下,你有一组火车轨道从你面前开始离你而去。使用正交投影,当它们在你面前时,它们在地平线上的距离仍然是相同的距离。通过透视投影,它们似乎在一些遥远的“消失点”进行传播。

如果您使用上面的代码,请尝试更改near和far平面变量以及zoom变量以查看它对程序的影响

© www.soinside.com 2019 - 2024. All rights reserved.