XNA WorldMatrix и ViewMatrix - PullRequest
       3

XNA WorldMatrix и ViewMatrix

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

Я создал класс Camera, который позволяет мне перемещаться по сцене от первого лица.Камера работала очень хорошо, пока я не решил использовать ее в качестве места, чтобы добавить что-то в мир 3D.То, что я пытаюсь сделать, это добавить куб в мир, когда я нажимаю кнопку мыши.Я хочу, чтобы куб в конечном итоге ушел от камеры, но сейчас я просто хочу создать его прямо перед ним.Иногда это работает, а иногда это создает его в ту или иную сторону.Все зависит от того, на сколько я повернул и перевел камеру.

Я пытаюсь найти вектор перед камерой, используя матрицу вида, например:

Vector3 inFront = Camera.ViewMatrix.Forward;

Я планирую использовать вектор, чтобы добавить физику позади куба и заставить его уходить от камеры.Сейчас я просто хочу получить правильный вектор.

Я знаю, что вы обычно рисуете вещи в мире, используя WorldMatrix, но я не могу понять, как преобразовать мою ViewMatrix в WorldMatrix.Все еще учу: -)

Что я делаю не так?

-Скотт

Ответы [ 2 ]

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

Прежде всего, нет никакой реальной разницы между " World Matrix " и " View Matrix ", они обе являются матрицами преобразования, и различие несколько произвольно. Некоторые системы даже объединяют их (в OpenGL просто есть матрица ModelView).

Традиционно «мировая матрица» используется для перемещения отдельных моделей из «модельного пространства» в «мировое пространство». Затем «матрица просмотра» используется для перемещения всех моделей из мирового пространства в их относительные положения перед камерой (что, по сути, «перемещает камеру»). И, наконец, « Projection Matrix » преобразует 3D-позиции в их 2D-позиции на экране (обычно с перспективной проекцией). Поскольку они являются матрицами, их можно умножить вместе в одну матрицу, которая может преобразовать точки за один шаг.

Прежде всего, взгляните на свойства Matrix struct .

Вам также необходимо понять, что Matrix.Forward возвращает Vector3. Vector3 может представлять либо положение или a скаляр и направление . Вам нужно два из них, чтобы представить позицию и направление.

Теперь, моя математика в 3D матрице немного ржавая, но я почти уверен, что вы хотите Matrix.Translation как положение камеры в мировом пространстве. И Matrix.Forward как прямое направление камеры в мировом пространстве.

Если ваша камера / матрица вида не выполняет операцию масштабирования по всему миру (а на самом деле это не должно), то Vector3, который вы получите от Matrix.Forward, будет иметь длину единицы - другими словами, только направление ( без скаляров). Используйте это, чтобы указать направление перемещения вашего объекта.

1 голос
/ 24 июня 2011

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

float scalar = 10; // how far away from the camera you want to move the object
Vector3 camPos = ???; // supplied from somewhere elese
Vector3 inFront = Camera.ViewMatrix.Forward;
Vector3 newPos = camPos + inFront * scalar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...