1

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の状態と関係があると思いますが、私が試したすべての解決策をまだ見つけていません.

4

1 に答える 1

1

glFrustum()現在の行列と連結します。を行っていないのでglLoadIdentity()、これは前のフラスタムで乗算することを意味します。

于 2013-01-21T12:08:45.593 に答える