我正在使用Android上的3D场景中的相机系统。 到目前为止,我使用了这个初始化代码:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.i(LOG_TAG, "onSurfaceCreated()");
TextureLibrary.loadTextures(m_context, gl);
//Set initial perspective and viewport
gl.glMatrixMode(GL10.GL_PROJECTION);
float fov = .01f * (float) Math.tan(Math.toRadians(45.0 / 2.0));
float aspectRatio = 1.9541f;
gl.glFrustumf(-fov, fov, -fov / aspectRatio, fov / aspectRatio, 0.01f, 100.0f);
gl.glViewport(0, 0, (int) _viewportWidth, (int) _viewportHeight);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glFrontFace(GL10.GL_CW);
gl.glCullFace(GL10.GL_BACK);
initialise();
}
但是现在,我想更新渲染方法中的平截头体,以执行缩放和/或图像扭曲。但是,它似乎是 the frustum update 。
这是渲染代码(除了通常的Push和PopMatrix之外,还修剪了一些胖,不包含任何GL状态改变代码):
private void render(GL10 gl)
{
//Frustrum update code
gl.glMatrixMode(GL10.GL_PROJECTION);
float fov = .01f * (float) Math.tan(Math.toRadians(45.0 / 2.0));
float aspectRatio = 1.9541f;
gl.glFrustumf(-fov, fov, -fov / aspectRatio, fov / aspectRatio, 0.01f, 100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
gl.glLoadIdentity();
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
//Render all the things here!
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
如您所见,设置平截头体的片段几乎相同,使用的值相同。但是,当在render方法中调用glFrustum时,程序将不会显示正在绘制的内容。我发现这很奇怪,因为使用的值完全相同(当强制纵横比时)。
仍然在OnSurfaceChanged方法中设置/更新视口,该方法至少被击中一次。
public void onSurfaceChanged(GL10 gl, int width, int height) {
_viewportWidth = width;
_viewportHeight = height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glViewport(0, 0, (int) _viewportWidth, (int) _viewportHeight);
gl.glMatrixMode(GL10.GL_MODELVIEW);
}
我认为这可能与OpenGL国家有关,但我还没有找到解决方案,而是我尝试过的所有内容。
答案 0 :(得分:1)
glFrustum()
与当前矩阵连接。由于你还没有完成glLoadIdentity()
,这意味着你将成倍增加之前的平截头体。