由近距离和远距离

时间:2016-09-21 13:18:20

标签: android opengl-es glfrustum

我有一个OpenGL ES 1.0纹理球体,我可以通过平移旋转:

sphere

正如你所看到的,我的视口是一个大小与屏幕最大边相同的正方形(这就是我想要的)。球体的半径为1,因此它填充了最大的一面(再次,这就是我想要的)。

现在我希望能够放大/缩小。我是通过使用gl.glScalef(x,y,z)来实现的。它可以工作,但在某些时候,球体变得太大而且被切割,我猜是默认的z近/远飞机:

enter image description here

是否可以增加这些默认值,还是需要使用glFrustumf?

使用glFrustumf时,放大/缩小时不再切割球体,但图像很奇怪:

enter image description here

缩小时:

enter image description here

有关正在发生的事情的任何想法吗?

以下是我正在使用的代码的相关部分:

@Override
public void onDrawFrame(GL10 gl) {

    if(mTextureToLoad != null) {

        mSphere.loadGLTexture(gl, mTextureToLoad);
        mTextureToLoad = null;
    }

    gl.glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    gl.glScalef(mScale, mScale, mScale);

    gl.glRotatef( (1-mRotationY) * 360, 1, 0, 0);
    gl.glRotatef( (1-mRotationX) * 360, 0, 1, 0);

    mSphere.draw(gl);
}

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

    float side = Math.max(width, height);

    int x = (int) (width - side) / 2;
    int y = (int) (height - side) / 2;

    gl.glViewport(x, y, (int) side, (int) side);

    /*
    // When using glFrustumf:
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(-1, 1, -1, 1, 0.1f, 100);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    */
}

0 个答案:

没有答案
相关问题