5

Android と openGL 2.0 es の初心者として、簡単なことをテストして、それがどうなるかを確認しています。

http://developer.android.com/training/graphics/opengl/touch.htmlでサンプルをダウンロードしました。

正方形の中心である (0,0,0) ポイントを中心にカメラの回転をアニメートできるかどうかを確認するようにコードを変更しました。

だから私はこれをしました:

public void onDrawFrame(GL10 unused) {
    // Draw background color
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    // Set the camera position (View matrix)
    long time = SystemClock.uptimeMillis() % 4000L;
    float angle = ((float) (2*Math.PI)/ (float) 4000) * ((int) time);
    Matrix.setLookAtM(mVMatrix, 0, (float) (3*Math.sin(angle)), 0, (float) (3.0f*Math.cos(angle)),     0 ,0, 0,     0f, 1.0f, 0.0f);

    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);

    // Draw square
    mSquare.draw(mMVPMatrix);
}

カメラは常に正方形の中心 ((0,0,0) 点) を向いていると思っていましたが、そうではありません。カメラは確かに正方形の周りを回転していますが、正方形は画面の中心に留まらず、代わりに X 軸に沿って移動しています...: ここに画像の説明を入力 ここに画像の説明を入力

また、次のように、eyeX と eyeY に centerX と centerY と同じ値を指定すると、次のようになると予想しました。

Matrix.setLookAtM(mVMatrix, 0, 1, 1, -3,     1 ,1, 0,     0f, 1.0f, 0.0f);

正方形はその形状を維持します (つまり、視野はドラッグされますが、正方形に平行な平面に沿って移動します)、それも起こりません:

ここに画像の説明を入力

これは私の射影行列です:

float ratio = (float) width / height;

// this projection matrix is applied to object coordinates
// in the onDrawFrame() method
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 7);

ここで何が起こっているのですか?

4

1 に答える 1

10

ダウンロードした例のソースコードを見ると、なぜその問題が発生しているのかがわかります。これは、行列の乗算の順序に関係しています。

通常、OpenGLソースでは、次のように設定されたマトリックスが表示されます。

transformed vertex = projMatrix * viewMatrix * modelMatrix * input vertex

ただし、ダウンロードしたソースサンプルプログラムでは、シェーダーは次のように設定されています。

" gl_Position = vPosition * uMVPMatrix;"

マトリックスの反対側の位置で。この方法でOpenGLを操作できますが、行列の乗算のlhs/rhsを逆にする必要があります。

簡単に言うと、あなたの場合、シェーダーを次のように変更する必要があります。

" gl_Position = uMVPMatrix * vPosition;"

そうすれば、期待どおりの動作が得られると思います。

于 2012-08-12T20:11:48.657 に答える