2011-06-24 13 views
0

テストアプリケーションでのカメラの動作を理解できません。私は働いているカメラをまとめることができました - 今、私はそれがすべてどのように機能するのかを理解しようとしています。私のカメラは、独自のクラスにカプセル化されています。ここに私のGame.Update()メソッドから呼び出されるupdateメソッドである:すべてのXNA 4.0カメラの質問

public void Update(float dt) 
    { 
     Yaw += (200 - Game.MouseState.X) * dt * .12f; 
     Pitch += (200 - Game.MouseState.Y) * dt * .12f; 

     Mouse.SetPosition(200, 200); 

     _worldMatrix = Matrix.CreateFromAxisAngle(Vector3.Right, Pitch) * Matrix.CreateFromAxisAngle(Vector3.Up, Yaw); 

     float distance = _speed * dt; 

     if (_game.KeyboardState.IsKeyDown(Keys.E)) 
     MoveForward(distance); 
     if (_game.KeyboardState.IsKeyDown(Keys.D)) 
     MoveForward(-distance); 
     if (_game.KeyboardState.IsKeyDown(Keys.S)) 
     MoveRight(-distance); 
     if (_game.KeyboardState.IsKeyDown(Keys.F)) 
     MoveRight(distance); 
     if (_game.KeyboardState.IsKeyDown(Keys.A)) 
     MoveUp(distance); 
     if (_game.KeyboardState.IsKeyDown(Keys.Z)) 
     MoveUp(-distance); 

     _worldMatrix *= Matrix.CreateTranslation(_position); 
     _viewMatrix = Matrix.Invert(_worldMatrix);  // What's gong on here??? 
    } 

まず、私は行列が操作されている非常に最後の部分以外に、この方法では、すべてを理解しています。私は用語が私のやり方にもなっていると思う。たとえば、私の_worldMatrixは実際に回転行列です。実際に私を困惑させるのは、を逆にして_viewMatrixを計算する部分です。私はちょうどこれが何であるかを理解していない。

以前のテストでは、私は常にMatrix.CreateLookAt()を使用してビューマトリックスを作成していましたので、少し混乱します。私は、誰かが何が起こっているのかを簡単に説明できることを願っています。

おかげで、ビュー行列は、グラフィックス・パイプラインの場合と

-Scott

+0

この質問に対する回答は、次のような場合に役立ちます。http://stackoverflow.com/questions/6461740/xna-worldmatrix-and-viewmatrix –

+0

LOL。それは別の問題について投稿された私の質問でした。私は3D空間と異なるビュー/行列/投影の周りに私の頭を包んで苦労している... – Scott

答えて

2

一つの操作は、それが世界空間から3Dの点に変換することをある(X、Y、Zを、我々はすべての&愛を知っています) (またはカメラ)空間に、カメラが世界の中心(0,0,0)とみなされる空間とすべての点/オブジェクトが相対的な空間になります。だから、ポイントは世界に比して1,1倍になるかもしれませんが、カメラの位置に関係する座標は何ですか?さて、カメラの世界空間位置/回転を表す行列の逆数で、その点を変換することができます。

カメラの位置を2,2,2としましょう。任意のポイントは3,3,3です。私たちはポイントがカメラから1,1,1離れていることを知っていますよね?どのような変換をポイント3,3,3に適用して1,1,1(カメラに相対的な位置)にするのですか? 3,3,3を-2、-2、-2に変換して1,1,1とします。 -2、-2、-2もカメラの反転位置です。この例は翻訳のためのもので、grocでは比較的簡単ですが、基本的には同じことが起こります。しかし、単純に基底ベクトルをすべて無効にして行列を逆転させることはできないと考えてください...回転についてもう少し進んでいます。

Matrix.CreateLookAt()メソッドは自動的に逆行列を返します。そのため、コードを反映しない限り、実際にはそれが起こっていることに気付かないようにします。

これをさらに進めると、投影行列は視点空間のその点をとり、平面上に投影し、3d空間から開始した点は2次元空間にあります。

関連する問題