2011-06-24 153 views
0

我无法理解相机如何在我的测试应用程序中工作。我已经能够拼凑一个工作相机 - 现在我试图确保我了解它是如何工作的。我的相机被封装在自己的课堂上。这里是会从我的Game.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通过反转_worldMatrix来计算的部分。我只是不明白这是什么。

在之前的测试中,我总是用Matrix.CreateLookAt()来创建视图矩阵,所以我有点困惑。我希望有人能够简单地解释发生了什么事。

感谢,

斯科特

+0

这个问题的答案可能会帮助你:http://stackoverflow.com/questions/6461740/xna-worldmatrix-and-viewmatrix –

+0

LOL。这是我发布的关于另一个问题的问题。我很难让头部缠绕3D空间和不同的视图/矩阵/投影...... – Scott

回答

2

一个操作视图矩阵做为图形管线在于它把来自世界空间中的3D点(X,Y,Z,大家都知道&爱)进入视野(或相机)空间,相机被认为是世界的中心(0,0,0),所有点/物体都相对于它。因此,虽然相对于世界的一点可能在1,1,1,但相对于相机位置的坐标是什么?那么,事实证明,您可以通过表示相机世界空间位置/旋转的矩阵的逆来转换该点。

如果你仔细想想,它有点道理......比方说相机位置是2,2,2。任意一点在3,3,3。我们知道点1,1,1,1远离相机,对吧?那么为了使它变成1,1,1(它相对于相机的位置),你将对点3,3,3应用什么变换?你会通过-2,-2,-2转换3,3,3来得到1,1,1。 -2,-2,-2也是相机的倒置位置。这个例子是用于翻译的,因为它比较容易进行翻译,但旋转基本上是一样的。但是,不要指望能够简单地否定所有的基本向量来反转一个矩阵......还有一点需要进行旋转。

Matrix.CreateLookAt()方法自动返回倒置矩阵,所以除非您反映其代码,否则您不会真正注意到它发生的情况。

考虑到这一步,投影矩阵然后将该点放入视图空间并将其投影到平坦表面上,并且从3d空间开始的点现在位于2d空间中。