Одним из ключевых моментов при работе с трехмерной графикой является координатная система. Если в двухмерной графике используется координатная система из двух осей X и Y, то в трехмерной системе к ним добавляется еще и ось Z. При этом трехмерные координатные системы бывают двух видов: левосторонняя и правосторонняя. Направление оси Z (на нас или от нас) определяет тип координатной системы:
В MonoGame применяется правосторонняя координатная система, то есть ось Х направлена вправо, ось Y - вверх, а ось Z - на нас.
Большое значение при проектировании трехмерных систем имеет камера. От ее положения будет зависеть отображение трехмерной сцены. А положение и прочие свойства камеры определяются матрицами.
В MonoGame мы будем работать с тремя матрицами:
Матрица вида: определяет положение камеры в пространстве, ее направление и ориентацию.
Матрица проекции: преобразует трехмерные координаты сцены в двухмерные для отображения сцены на плоскости экрана.
Мировая матрица: используется для позиционирования объектов в трехмерной системе
Однако нам не придется самим создавать полностью матрицы и определять все операции между, так как в нашем распоряжении уже есть класс Matrix, который и выполняет основную работу.
Для создания матрицы вида применяется статический метод CreateLookAt класса Matrix. Он возвращает объект Matrix и принимает следующие параметры:
cameraPosition
: позиция камеры в виде объекта Vector3
cameraTarget
: координата точки, на которую направлена камера, опять же в виде объекта Vector3
cameraUpVector
: вектор вертикальной ориентации камеры, также представляет объект Vector3
Таким образом, все три параметра принимают объект Vector3 - трехмерный вектор, который состоит из трех координат - X, Y, Z:
Vector3 vec = new Vector3(10, 20, 30);
Для создания матрицы проекции мы можем использовать другой статический метод класса Matrix - CreatePerspectiveFieldOfView(). Он также возвращает объект Matrix и принимает следующие параметры:
fieldOfView
: угол обзора камеры в радианах
aspectRatio
: аспектное отношение ширины экрана к высоте
nearPlaneDistance
: расстояние от позиции камеры до ближней видимой точки
farPlaneDistance
: расстояние до самой дальней видимой точки
Все четыре значения представляют объекты float. Создаваемая ими матрица в итоге формирует видимое пространство:
Видимое пространство определяет ту часть трехмерной сцены, которая будет отрисовываться на экране. Объекты внутри этой видимой части будут выводиться на экран, пока между ними и камерой не появятся другие, закрывающие их объекты. Объекты вне видимого пространства не будут отрисовываться.
Для создания мировой матрицы используется метод Matrix.CreateWorld(), принимающий следующие параметры:
position
: позиция объекта
forward
: вектор направления вперед
up
: вектор вертикальной ориентации, обычно имеет значение [0, 1, 0]
Все три параметра представляют объект Vector3.