3

私はopenglesを試していて、画面上を移動するいくつかの単純な正方形を作成しました。

    //inside my renderScreen() method, called from onDrawFrame()
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    if (gameObjects != null) {
        // iterate and draw objects
        for (GameObject obj : gameObjects) {
            if (obj != null) {
                gl.glLoadIdentity();
                gl.glTranslatef(obj.posX, obj.posY, 0.0f);
                obj.doDraw(gl);
            }

単純で、オブジェクトを画面に描画します(引き続き機能します)。ここで、タッチ入力に基づいて投影行列を変換することにより、画面をドラッグするのが好きになりました。以前のコードの上にこのコードを追加しました(オブジェクトを描画する前に)

//change projection matrix
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glTranslatef(-cameraX, -cameraY, 0.0f); //cameraX and cameraY set in updateGame()  

updateGameは、MyPanel.getDiffX()からそれらを取得します。ここで、DiffXは、指がどれだけ動いたかを示します。

// Inside MyPanel Class
public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                startingX = event.getX();
                startingY = event.getY();
                MyRenderer.addObject(new GameSquare(event.getX(), v
                        .getHeight() - event.getY())); // Y is inverted!
            }
            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                diffX = (event.getX() - startingX) / 100;
                //diffY = (event.getX() - startingY) / 1000;
                Log.d("diffX" ,Float.toString(diffX));
            }
            return true;
        }

これで、コードを使用して投影マトリックスを変換すると、画面にオブジェクトが表示されなくなります(glClearカラーのみ)。誰かが何が起こっているのか知っていますか?行列を間違って使用していますか?

4

2 に答える 2

1

cameraXとcameraYを0に設定するとどうなりますか?射影行列を変更することで、以前に設定した値を上書きしていないことを確認しますか?

それとは別に、-cameraXと-cameraYで翻訳する必要があります。考えてみてください。カメラを位置(10、10)に配置する場合、カメラで変換した後、(10、10)にあるものはすべて原点にある必要があり、論理変換は(-10、-10)になります。 。あなたは世界でカメラを翻訳しているのではなく、カメラの周りの世界を翻訳しているのです。

編集:これを行う別の方法を提案させてください。それは射影行列を変更しません。

//inside my renderScreen() method, called from onDrawFrame()
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glTranslate(-cameraX, -cameraY, 0); //Apply the camera here
if (gameObjects != null){
    // iterate and draw objects
    for (GameObject obj : gameObjects) {
        if (obj != null) {
            gl.glPushMatrix(); //Note this line here, we 'push' a matrix onto the top
            gl.glTranslatef(obj.posX, obj.posY, 0.0f);
            obj.doDraw(gl);
            gl.glPopMatrix(); //Here we remove our modified matrix to get the original one
        }
}
于 2011-10-02T16:02:00.940 に答える
0

私はいつも、カメラではなく、遠近法に投影行列を使用する必要があることを学びました(OpenGL FAQと比較してください)。そのため、 GLUを使用して投影(遠近法)を一度設定し、それ以上変更しないようにします。ドロールーチンでは、すべてのドローの前にカメラを設定(変換)するか、glPushMatrixglPopMatrixを使用してカメラを安全に復元できます。

于 2011-10-03T19:31:43.193 に答える