0

私はこのobjファイルを持っています(他のより多くの3Dモデルでも試してみました):

            Triangle                  
            v 0 0 0                 
            v 0 0.5 0               
            v 1 0 0     
            f 1 2 3        

次の頂点シェーダーを使用します。

    uniform mat4 projection;
    attribute vec4 pos;

    void main(void)
    {
        gl_Position = projection* pos;
    }

超シンプル。ユニフォーム_プロジェクション=単位行列だけで実行すると、上に0.5、右に1の三角形が表示されます。正しいようです。

さて、私がやりたいのは、カメラalagluLookAtといくつかの透視投影を使用することです。そして、これは私がとても混乱するところです。

ワールド座標では、三角形は上の頂点位置にあります。それでは、目と注視点を選びましょう。eye =(0,0,3)、lookAt =(0,0,0)。基本的には、目が原点にあるようにします。したがって、世界の原点を目の位置に移動する必要があります(単位行列であっても実行しましょう)。

   | 1 0 0 0 |   | 1 0 0 0 |   | 1 0 0 0 |
   | 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
   | 0 0 1 -3|   | 0 0 1 0 |   | 0 0 1 -3| 
   | 0 0 0 1 |   | 0 0 0 1 |   | 0 0 0 1 | 

そしてブーム、三角形は消えました。そして私がしたのは元のカメラが見ていた方向に沿って世界を動かすことだけでした。eye =(0,0,3)はまだ消えています..非常に混乱しています:SIはあらゆる形式のカリングなどをオフにしました。誰かがこれがどのように機能するかを私に説明できますか?

後で私の考えは次のとおりだったので:

       v = normalize(lookat-eye)
       r = normalize(crossProduct(v, up));
       u = crossProduct(r, v);

       viewMatrix = |r1 r2 r3 -eye1|
                    |u1 u2 u3 -eye1|
                    |v1 v2 v3 -eye1|
                    |0  0  0   1   |

そして、投影行列として、私は次のいずれかを考えていました(私の講義から):

       projMatrix = |1 0 0    0|
                    |0 1 0    0|
                    |0 0 1    0|
                    |0 0 -1/d 1|

または、このリンク: gluPerspectiveはOpenGL 3.1で削除されましたが、置き換えはありますか? 今はよくわかっているとは言えません。

私には、座標系がどのように機能するかについてのいくつかの重要な部分を理解していないようです。

4

1 に答える 1

1

このマトリックスに関するあなたの問題:

| 1 0 0 0 |   | 1 0 0 0 |   | 1 0 0 0 |
| 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
| 0 0 1 -3|   | 0 0 1 0 |   | 0 0 1 -3| 
| 0 0 0 1 |   | 0 0 0 1 |   | 0 0 0 1 | 

翻訳したのに、クリップ面をまったく調整していないということです。デフォルトのID投影マトリックスは、Z軸上で-1から1にクリップします。目をZ=3に変換したので、新しいクリップ平面は4から2になり、三角形はこの範囲外にあるため、クリップされます。

したがって、目を動かしたい場合は、新しい射影行列が必要です。パースペクティブについて話しているので、gluPerspectiveから方程式を自分で実装するか、OpenGLMathematicsのような投影行列を生成するライブラリをダウンロードすることをお勧めします

于 2012-11-13T02:32:21.240 に答える