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();
}
しかし今、render メソッドでフラスタムを更新して、ズームや画像の歪みを実行したいと考えています。ただし、視錐台の更新のようです。
レンダリング コードは次のとおりです (通常の 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);
}
ご覧のとおり、フラスタムが設定されているスニペットはほぼ同じで、使用される値も同じです。ただし、glFrustum が render メソッドで呼び出されると、プログラムは何も描画されません。使用される値がまったく同じであるため(アスペクト比を強制する場合)、これは奇妙だと思います。
ビューポートは、少なくとも 1 回ヒットする 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の状態と関係があると思いますが、私が試したすべての解決策をまだ見つけていません.