XNA 4.0 Camera Вопрос - PullRequest
       3

XNA 4.0 Camera Вопрос

0 голосов
/ 24 июня 2011

Мне трудно понять, как работает камера в моем тестовом приложении. Я смог собрать рабочую камеру - теперь я пытаюсь убедиться, что понимаю, как все это работает. Моя камера инкапсулирована в своем собственном классе. Вот метод обновления, который вызывается из моего метода Game.Update ():

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() для создания матрицы представления, поэтому я немного запутался. Я надеюсь, что кто-то сможет объяснить простыми словами, что происходит.

Спасибо

-Скотт

1 Ответ

2 голосов
/ 25 июня 2011

Одна операция, которую матрица вида выполняет для графического конвейера, заключается в том, что она преобразует трехмерную точку из мирового пространства (x, y, z, мы все знаем и любим) в пространство просмотра (или камеры), пространство, в котором камера считается центром мира (0,0,0) и все точки / объекты относительно него. Таким образом, хотя точка может быть на 1,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 также инвертированное положение камеры. Этот пример был для перевода, потому что это относительно легко найти, но в основном то же самое происходит для вращения. Но не надейтесь, что сможете просто свести на нет все базисные векторы, чтобы инвертировать матрицу ... с вращением происходит немного больше.

Метод Matrix.CreateLookAt () автоматически возвращает инвертированную матрицу, поэтому вы не заметите, что это происходит, если не отразите ее код.

Сделав еще один шаг вперед, матрица проекции затем берет эту точку зрения в пространстве и проецирует ее на плоскую поверхность, а та точка, которая начиналась в трехмерном пространстве, теперь находится в 2d пространстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...