netlib.narod.ru | < Назад | Оглавление | Далее > |
Прежде чем вы будете готовы к созданию своей первой трехмерной программы, надо изучить еще несколько важных концепций. Понимание важности трехмерных векторов и матриц, возможно, самая главная из них.
Важно понимать, что векторы (vector), помимо хранения значений местоположения, предоставляют множество вспомогательных методов, которые пригодятся при создании ваших игр. Vector3 — это наиболее часто используемый в трехмерных играх вектор, и вот некоторые из его наиболее важных методов:
Vector3.Distance: берет две точки, возвращает число с плавающей точкой, представляющее расстояние между ними.
Vector3.Add и Vector3.Substract: сложение и вычитание двух векторов.
Vector3.Multiply и Vector3.Divide: умножение и деление двух векторов или вектора на число с плавающей точкой.
Vector3.Clamp: ограничивает компоненты вектора в заданном диапазоне — полезно при определении источников света или матричных значений, поддерживающих только определенный диапазон величин.
Vector3.Lerp: вычисляет линейную интерполяцию между двумя векторами.
Vector3.SmoothStep: интерполирует два вектора, согласно значению с плавающей точкой, используемому как весовой коэффициент.
Помимо этих методов, Vector3 предлагает ряд сокращений для специальных векторов, таких как Vector3.Zero для пустого вектора, Vector3.Up для вектора (0, 1, 0), Vector3.Right для вектора (1, 0, 0) и т.д. Vector2 и Vector4 предоставляют подобные методы и сокращения.
Многие из этих методов и сокращений, как вы увидите в этой и следующих главах, используются при определении матриц и выполнении трехмерных операций.
Матрицы (matrix) — это основа для описания вращения, масштабирования и перемещения объектов в трехмерном мире. Поскольку матрицы используются для определения любых трехмерных преобразований, они также применяются для описания операций, необходимых для моделирования проекции (мы говорили о проекции чуть раньше) и для преобразования трехмерной сцены в соответствии с местоположением камеры и направлением взгляда.
Вы увидите примеры каждого из этих применений, когда будете создавать ваш пример программы. А сейчас давайте посмотрим на использование матрицы преобразования для выполнения простого перемещения, и затем экстраполируем идею на более сложные операции. Это поможет вам понять важность использования матриц в трехмерных программах.
Предположим, вы хотите переместить треугольник вверх по оси Y, как показано на рис. 7.11.
Рис. 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. Применение умножения матриц к трехмерной вершине
Небольшое объяснение об умножении матриц: чтобы вычислить результирующую матрицу вы должны взять каждое значение в строке первой матрицы, умножить его на каждое из значений в соответствующем столбце второй матрицы и затем сложить все результаты. Так, в предыдущем примере, вычисления будут следующие:
x' = (50 × 1) + (10 × 0) + (0 × 0) + (1 × 0) = 50
y' = (50 × 0) + (10 × 1) + (0 × 0) + (1 × 40) = 50
z' = (50 × 0) + (10 × 0) + (0 × 1) + (1 × 0) = 0
Мы не будем здесь значительно углубляться в детали. Достаточно сказать, что вы можете выполнить перемещение, поместив желаемые значения смещения по осям X, Y и Z в последнюю строку матрицы перемещения. Вы можете выполнить масштабирование, заменив 1 на диагонали на дробные значения (для сжатия) или на значения больше 1 (для растяжения), а для выполнения вращения вокруг какой-нибудь из осей применяется комбинация значений синусов и косинусов в определенных элементах матрицы.
Почему же использованию матриц уделяется такое внимание? Величайшее преимущество заключается в том, что вы можете выполнять сложные операции, перемножив соответствующие им матрицы преобразований. Затем вы применяете результирующую матрицу к каждой вершине трехмерной модели и производите все операции над моделью, умножая ее вершины только на одну матрицу, вместо того, чтобы вычислять каждое преобразование для каждой вершины.
Что еще лучше: все видеокарты имеют встроенные алгоритмы для умножения матриц, так что такое умножение отнимает совсем немного ресурсов процессора.
Учтите, что сложные трехмерные объекты могут иметь тысячи вершин, что делает необходимостью преобразования с максимально низкой стоимостью обработки, и матрицы предоставляют способ добиться этого.
К счастью, достаточно; вам не требуется понимать все эти математические детали, чтобы использовать матрицы и выполнять трехмерные преобразования в ваших программах. Все библиотеки программирования игр (от OpenGL до DirectX) предоставляют готовые к использованию функции работы с матрицами, и XNA не является исключением. Через класс Matrix вам доступно много операций с матрицами, таких как:
Matrix.CreateRotationX, Matrix.CreateRotationY и Matrix.CreateRotationZ: создание матриц вращения для каждой из осей.
Matrix.Translation: создание матрицы перемещения (по одной или нескольким осям).
Matrix.Scale: создание матрицы масштабирования (по одной или нескольким осям).
Matrix.CreateLookAt: создание матрицы вида, применяемой для позиционирования камеры, путем задания местоположения камеры в трехмерном пространстве, точки трехмерного пространства, на которую направлена камера, и направления, указывающего, где для камеры будет «верх».
Matrix.CreatePerspectiveFieldOfView: создание матрицы проекции, использующей перспективное представление, путем задания угла поля зрения, форматного соотношения (см. примечание ниже), ближней и дальней плоскостей отсечения, ограничивающих рисуемую часть трехмерной сцены. Чтобы лучше понять эти концепции, посмотрите на рис. 7.13. У вас есть два похожих дополнительных метода, CreatePerspectiveOffCenter и CreatePerspective, которые также создают матрицу для перспективной проекции, но используют другие параметры.
Рис. 7.13. Определение перспективной проекции
Matrix.CreateOrthographics: создание матрицы, используемой в ортогональной, или ортографической, проекции. Метод получает ширину, высоту, ближнюю и дальнюю плоскости отсечения, описывающую ортографическую проекцию, и имеет подобный метод — CreateOrthographicsOffCenter — создающий матрицу ортогональной проекции, где центр трехмерной сцены не отображается на центр экрана.
Вы увидите использование некоторых из этих функций в примерах кода к этой главе, а других — в последующих главах, когда будете создавать законченную трехмерную игру.
netlib.narod.ru | < Назад | Оглавление | Далее > |