1

私は最初の opengl es 2.0 アプリを書いていますが、Matrix.setLookAt の目的について混乱しています。

ビューの中心を 0,0 に設定していくつかのオブジェクトを描画するコードを実行していますが、ビューをパンして、中心がワールド座標 (5,5 など) の別の位置になるようにしたいと考えています。

これを達成するには、glOrtho と setLookAt で何を渡す必要がありますか? ビューの中心を 0,0 に設定し、ビューポート全体に線を引くと、問題なく動作します。中心を 0.25, 0 に設定すると、下のスクリーンダンプのように線が左側に表示されます。これらの線は、ビューポート全体に拡張する必要があります。

私は何を間違っていますか?

私のコード: シェーダー コード:

private static final String vertexShader =
        "uniform mat4 uMVPMatrix;\n"
        + "attribute vec4 aPosition;\n"
        + "attribute vec4 aColor;\n"
        + "varying vec4 vColor;\n"
        + "vec4 temp;"
        + "void main() {\n"
        + "  temp = aPosition;\n"
        + "  gl_Position = uMVPMatrix * temp;\n"
        + "  vColor = aColor;\n"
        + "}\n";

private static final String fragmentShader =
        "precision mediump float;\n"
        + "varying vec4 vColor;\n"
        + "void main() {\n"
        + "  gl_FragColor = vColor;\n"
        + "}\n";

効果的な onDraw コード (これは実際には複数の場所に分散されています)

    // center of view should be at 0.25, 0. Height of view 1.0, width determined by ratio of viewport

    Matrix.orthoM(mProjMatrix, 0, -0.126471, 0.626471, -0.5, 0.5, -1, 7);
    Matrix.setLookAtM(mVMatrix, 0, 0.25, 0.0, -5, 0.25, 0.0, 0f, 0f, 1.0f, 0.0f);
    Matrix.setIdentityM(mMMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
    GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, MVPMatrix, 0);
    GLES20.glVertexAttrib4f(aColorHandle, 0f, 0f, 0f, 1f);      // constant color
    lineVertices.position(0);
    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, 0, lineVertices);
    GLES20.glEnableVertexAttribArray(aPositionHandle);
    GLES20.glDrawArrays(GLES20.GL_LINES, 0, lineCount*2);

LineVertices は x:y 座標で線を描画しています:

-0.126474:-0.250000 から 0.626474:-0.250000 までの行

-0.126471:0.000000 から 0.626471:0.000000 までの行

-0.126474:0.250000 から 0.626474:0.250000 までの行

ここに画像の説明を入力

4

2 に答える 2

2

それは予想される動作です。

  1. 射影行列は空間の一部を取り、それを NDC キューブにマップします。正射投影の場合、これは単なるブロックです (錐台はありません)。コードが定義するブロックは spans[-0.126471, 0.626471][-0.5, 0.5][-1, 7]です。ソース スペースを変更しない場合、線は左から右に正確に描画されます。

  2. setLookAtM慣例により、モデルビューが適用された後、視聴者は[0,0,0]方向にあり、それを見ます[0,0,-1]。ビューアーは x 方向に脇に寄ります (これを想像してみてください。これは、すべての行を左に0.25移動するのと同じです)。以前のように線を描画したい場合は、コードで x 座標も移動する必要があります ( )。+0.25

の技術的な説明については、こちらをお読みくださいgluLookat。事実上、平行移動の後に回転が続きます。必ずソンホまたは他の場所で OpenGL のスペースをチェックアウトしてください。

于 2013-02-15T03:51:41.963 に答える
0

orthor 行列には look-at を使用しません。パースペクティブマトリックス用です

Matrix.orthoM を呼び出すことさえできません。その場合、opengl の世界は (-1, 1) 幅と (-1, 1) 高さです。(-0.25, 0) から (0.25, 0) に線を引くと、画面の中央で画面の半分の幅になります。(ビューポートが 0,0,screenWidth,screenHeight であると仮定)

変換、回転、スケーリングしてシェーダーに渡すために必要なマトリックスは 1 つだけです。

于 2013-02-19T14:11:35.340 に答える