Читайте также:
|
|
Начнем с того, что в области глобальных переменных класса Game1 объявим три матрицы:
Matrix world;
Matrix view;
Matrix proj;
Как видно из названий матриц, это те самые три матрицы (мировая, видовая и проекционная), используемые для представления объектов в трехмерном пространстве. Дополнительно структура Matrix в XNA Framework имеет большой набор встроенных методов, с помощью которых можно выполнить любые матричные преобразования.
Далее в области глобальных переменных класса Game1 создаются четыре новые переменные.
static float aspectRatio;
static float FOV = MathHelper.PiOver4;
static float nearClip = 1.0f;
static float farClip = 1000.0f;
Все четыре переменные принимают участие в матричных расчетах, и это часть давно отлаженного механизма, передающегося по наследству от старых версий DirectX. Первая переменная aspectRatio в исходном коде представляет так называемый коэффициент сжатия, на базе которого ведется расчет перспективы модели для правильного соотношения геометрических размеров в пространстве.
Следующая переменная FOV призвана определять поле зрения. Здесь типичное значение равно MathHelper.PiOver4. Две оставшиеся переменные nearClip и farClip позволяют задать соответственно переднюю и заднюю области отсечения и участвуют в проекционных расчетах.
Затем в исходном коде у нас следует объявление объекта model класса Model.
private Model model;
private Vector3 positionModel
Переменная positionModel необходима для выбора позиции модели на экране. В конструкторе класса Game мы задаем позицию модели в пространстве нулевыми значениями.
positionModel = new Vector3(0, 0, 0);
Нулевые значения для позиции модели при нахождении камеры в центре экрана устанавливают модель четко в центр экрана.
Используя в исходном коде три ранее созданные матрицы (мировую, видовую и проекционную), мы создадим для объекта свою локальную систему координат.
После этих действий все свои установки объектов на позиции в трехмерном мире вам придется вести относительно локальной системы координат объекта и позиции камеры. Если камера стоит в центре экрана (X = 0 и Y = 0, по оси Z камера либо приближается, либо удаляется от центра экрана) и у объекта нулевые координаты, то местоположение объекта всегда будет точно в центре монитора.
Переходим в тело метода Initialize(). Здесь появляется новая запись, которая инициализирует переменную aspectRatio значением, равным делению половины ширины экрана на половину высоты экрана.
aspectRatio = (float)screenWidth / (float)screenHeight;
Эта стандартная запись, но ранее до метода Initialize() мы не могли использовать такую запись, поскольку лишь в этом методе несколькими строками выше определили свойства видеоадаптера, установленного в системе. Если использовать эту запись прежде, до определения настроек адаптера, то переменная aspectRatio получит системное значение, равное по умолчанию размеру 800/600 пикселей, и тогда ваш коэффициент сжатия будет некорректным.
Значение этой переменной можно также определять и числовыми значениями (например, 1024/768), но тогда вы «привяжете» себя к конкретному размеру дисплея.
Дата добавления: 2015-11-14; просмотров: 57 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Создание логики ИИ | | | Загрузка модели в игру |