1

タイル張りの平面の上を移動するカメラを作成したいと考えています。カメラは XY 平面内でのみ移動し、常に真下を向いている必要があります。正射影では、疑似 2D レンダラーが期待されます。私の問題は、カメラを移動する方法がわからないことです。いくつかの調査の後、OpenGL には「カメラ」のようなものはなく、全世界を翻訳する必要があるようです。-関数で目の位置とビューの中心座標を変更すると、Matrix.setLookAtM結果が歪むだけです。MVP-Matrix 全体を翻訳しても機能しません。

私は今、アイデアを使い果たしています。頂点バッファ内でフレームごとにすべての頂点を直接変換する必要がありますか? それは私にはもっともらしく思えません。

GLSurfaceViewシーンをセットアップおよび更新するために、次の関数を派生させて実装しました。

public void onSurfaceChanged(GL10 unused, int width, int height) {

    GLES20.glViewport(0, 0, width, height);
    float ratio = (float) width / height;

    // Setup the projection Matrix for an orthogonal view
    Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

}

public void onDrawFrame(GL10 unused) {

    // Draw background color
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    //Setup the camera
    float[] camPos = {  0.0f,  0.0f, -3.0f }; //no matter what else I put in here the camera seems to point
    float[] lookAt = {  0.0f,  0.0f,  0.0f }; //  to the coordinate center and distorts the square

    // Set the camera position (View matrix)
    Matrix.setLookAtM( vMatrix, 0, camPos[0], camPos[1], camPos[2], lookAt[0], lookAt[1], lookAt[2], 0f, 1f, 0f);

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

    //rotate the viewport
    Matrix.setRotateM(mRotationMatrix, 0, getRotationAngle(), 0, 0, -1.0f);
    Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0);

    //I also tried to translate the viewport here
    //  (and several other places), but I could not find any solution

    //draw the plane (actually a simple square right now)
    mPlane.draw(mMVPMatrix);

}
4

1 に答える 1

3

「LookAt」関数で目の位置とビューの中心座標を変更すると、結果が歪むだけです。

Androidチュートリアルからこれを入手した場合、コードにバグがあると思います. (ここにコメントしました)

次の修正を試してください。

  1. setLookatM を使用して、カメラを配置する場所を指定します。
  2. シェーダーで、gl_Position線を変更します

    から: " gl_Position = vPosition * uMVPMatrix;"
    から: " gl_Position = uMVPMatrix * vPosition;"

  3. //rotate the viewportこれはカメラを適切に回転させていないため、セクションも削除する必要があると思います。setlookat 関数でカメラの向きを変更できます。

于 2012-08-15T15:44:49.503 に答える