netlib.narod.ru< Назад | Оглавление | Далее >

Векторы, матрицы и трехмерные преобразования

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

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

Помимо этих методов, Vector3 предлагает ряд сокращений для специальных векторов, таких как Vector3.Zero для пустого вектора, Vector3.Up для вектора (0, 1, 0), Vector3.Right для вектора (1, 0, 0) и т.д. Vector2 и Vector4 предоставляют подобные методы и сокращения.

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

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

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

Предположим, вы хотите переместить треугольник вверх по оси Y, как показано на рис. 7.11.


Рис. 7.11. Перемещение треугольника по оси Y

Рис. 7.11. Перемещение треугольника по оси Y


Пусть координаты вершин треугольника будут следующие:



Вершина X Y Z

1 50 10 0
2 70 10 0
3 55 25 0


Для перемещения на 40 единиц вдоль положительного направления оси Y вам надо прибавить 40 к координате Y каждой точки, в результате чего получаются следующие новые координаты вершин:



Вершина X Y Z

1 50 50 0
2 70 50 0
3 55 65 0


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

Рис. 7.12 показывает такую операцию, примененную к первой вершине.


Рис. 7.12. Применение умножения матриц к трехмерной вершине

Рис. 7.12. Применение умножения матриц к трехмерной вершине


Небольшое объяснение об умножении матриц: чтобы вычислить результирующую матрицу вы должны взять каждое значение в строке первой матрицы, умножить его на каждое из значений в соответствующем столбце второй матрицы и затем сложить все результаты. Так, в предыдущем примере, вычисления будут следующие:

Мы не будем здесь значительно углубляться в детали. Достаточно сказать, что вы можете выполнить перемещение, поместив желаемые значения смещения по осям X, Y и Z в последнюю строку матрицы перемещения. Вы можете выполнить масштабирование, заменив 1 на диагонали на дробные значения (для сжатия) или на значения больше 1 (для растяжения), а для выполнения вращения вокруг какой-нибудь из осей применяется комбинация значений синусов и косинусов в определенных элементах матрицы.

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

Что еще лучше: все видеокарты имеют встроенные алгоритмы для умножения матриц, так что такое умножение отнимает совсем немного ресурсов процессора.

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

К счастью, достаточно; вам не требуется понимать все эти математические детали, чтобы использовать матрицы и выполнять трехмерные преобразования в ваших программах. Все библиотеки программирования игр (от OpenGL до DirectX) предоставляют готовые к использованию функции работы с матрицами, и XNA не является исключением. Через класс Matrix вам доступно много операций с матрицами, таких как:

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


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz