我有一个可以通过平移旋转的 OpenGL ES 1.0 纹理球体:
如您所见,我的视口是屏幕最大边大小的正方形(这是我想要的)。球体的半径为 1,因此它填充了最大的一侧(同样,这就是我想要的)。
现在我希望能够放大/缩小。我通过使用 gl.glScalef(x, y, z) 来做到这一点。它可以工作,但在某些时候,球体变得太大并且正在被切割,我猜默认的 z 近/远平面:
是否可以增加这些默认值,还是需要使用 glFrustumf?
使用 glFrustumf 时,球体在放大/缩小时不再被切割,但图像很奇怪:
缩小时:
知道发生了什么吗?
以下是我正在使用的代码的相关部分:
@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();
*/
}