XNA View Matrix - Ищу объяснение - PullRequest
6 голосов
/ 21 августа 2009

У меня серьезные проблемы с пониманием матрицы представления в XNA. Я прошел довольно далеко со всеми остальными частями, и, поскольку я только что выучил необходимые математические навыки, я не хочу использовать встроенные функции Matrix, не понимая, что они делают в первую очередь.

Теперь я понимаю основы вращения, проекции и перевода, но не могу понять, как работает матрица представления в XNA.

Исходя из того, что я собрал, матрица представления должна преобразовать "мир" в его собственное пространство. Кажется разумным, но метод Matrix.CreateLookAt в библиотеке довольно озадачивает.

Я установил (проверяя, что выводит библиотечная функция), что эти два фрагмента кода дают одинаковые результаты:

Matrix view = Matrix.CreateReflection(new Plane(Vector3.UnitX, 0)) * Matrix.CreateReflection(new Plane(Vector3.UnitZ, 0)) * Matrix.CreateTranslation(Position);
// ..equals this if (Position = (0 0 -5), since LookAt "looks at" but the above just looks straight down Z)..
Matrix blah = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.UnitY);

Зачем переворачивать оси X и Z? Я думал, что вы должны повернуть мир в соответствии с вращением камер, но в противоположном направлении, а затем перевести мир на ту же величину в противоположном направлении.

Или матрица вида вообще не используется как преобразование, а просто кодирует положение и поворот камеры в мире?

Ответы [ 4 ]

22 голосов
/ 21 августа 2009

Есть три типа преобразований, которые вам нужно понять: мир, вид и проекция.

Преобразование мира изменяет координаты ваших моделей из модельного пространства в мировое пространство. Когда вы определяете вершины модели, вы определяете их относительно происхождения этой модели. Преобразование мира преобразует эти вершины так, чтобы они относились к началу координат, разделяемому всеми объектами сцены, то есть мировым пространством.

Затем преобразование вида преобразует эти вершины в пространство вида. Зритель / камера имеет положение и ориентацию в пространстве вида, и это используется для создания матрицы вида, которую вы применяете ко всем объектам в сцене. В пространстве просмотра средство просмотра / камера находится в исходной точке, поэтому матрица вида переводит и поворачивает все объекты, чтобы поместить их в пространство просмотра.

Наконец, проекционное преобразование определяет, какой тип «объектива» использует камера. До сих пор мы только переводили и вращали объекты, нет ощущения масштаба или перспективы. Проекционное преобразование создает усеченный вид и преобразует вершины в это окно просмотра.

Теперь на ваш вопрос. Вы отражаете систему координат вокруг оси x, затем по оси z и, наконец, переводите ее. Это приводит к тому же результату, что и матрица lookat, потому что позиция находится на плоскости xz и yz, но обратите внимание, что произойдет, если вы переместите позицию на одну единицу вверх по оси y. Тогда две матрицы не будут равны

5 голосов
/ 21 августа 2009

Матрица вида преобразует сцену в пространство вида. В пространстве обзора виртуальная камера находится в начале координат и смотрит в положительном направлении z. Для этого есть разные способы, но чаще всего матрица вида состоит из сдвига и трех поворотов вокруг каждой оси.

Преобразование = Перевести * Вращение Z * Вращение Y * Вращение X

4 голосов
/ 11 марта 2011

Следующая ссылка очень помогла мне понять и более эффективно использовать матрицы. Вы можете найти их интересными:

http://stevehazen.wordpress.com/2010/02/15/matrix-basics-how-to-step-away-from-storing-an-orientation-as-3-angles/

Сейчас я делаю то же самое, что и вы:)

1 голос
/ 21 августа 2009

составление двух отражений дает один поворот, если я правильно помню свою геометрию.

...