|
|||||
Build on 14.06.2k Простое полноэкранное приложениеВ этой статье мы наконец-то что-то нарисуем. Мало того, мы заставим это что-то еще и крутиться! Я очень надеюсь, что вы прочитали и выполнили все, о чем я говорил в прошлой статье, то есть у вас уже есть "зародыш" модуля mdlDirect3DRM, а также "бесподобная универсальная форма выбора драйвера и метода рендеринга 8-)" Если есть, то очень хорошо, ежели нет, тогда либо прочитайте сейчас, либо в моменте создания самых главных объектов в этой части вам будет несколько тяжко. Итак. Что мы будем сейчас творить. Во-первых, наше приложение будет работать в полноэкранном режиме. Оконный режим я освещу в следующих статьях, а пока будем работать в полном экране 640x480x16. Во-вторых, мы не будем пока загружать x-файлы (это не Секретные Материалы - это формат такой) и не будем возиться с текстурами, как бы вам этого не хотелось. Потерпите до следующих статей. Главное понять основы. Мы соорудим из четырех треугольников-поверхностей пирамиду. Почти египетскую, только все ее стороны будут разного цвета. Добавим в сцену освещение и камеру. Начнем же. Начнем мы с собирания нового проекта из уже существующих частей. Создайте новую папку и скопируйте туда форму frmDriver ("бесподобная универсальная форма выбора..."), а также mdlDirect3DRM, которые остались (ведь остались?) у вас от предыдущего проекта. Зайдите в Visual Basic, добавьте к проекту библиотеки DirectX7 и Win32. Главную форму назовите frmMain, а стартовой сделайте процедуру Sub Main. К проекту добавьте frmDriver и mdlDirect3DRM. Все получившееся сохраните в новом проекте. Начнем написание нового кода с модуля. К уже существующим добавьте новые определения. Все должно выглядеть теперь так:
Вы видите много новых и уже знакомых объектов. Пока не волнуйтесь, чтобы
все понять сразу. По мере протекания процесса, вы познакомитесь со всеми
ними.
Теперь, мы напишем процедуру, которая инициализирует Direct3D:RM в полноэкранном режиме. Этой процедуре надо будет передать разрешение экрана и форму, на основе которой создается Direct3D. Direct3D:RM в полноэкранном режиме создается на основе поверхности DirectDraw. Основная концепция такова: вы сперва должны создать обыкновенную цепь флиппинга, как это делаете с любым приложением DirectDraw. Единственное отличие здесь состоит в том, что во-первых, мы будем использовать объекты 4-й версии (Direct3D:RM работает только с DirectX6), а во-вторых, объект DirectDraw мы будем создавать для выбранного GUID видеокарты.
После этого, мы создаем объекты Direct3D:RM Главным объектом, является (помимо самого объекта D3DRM) устройство рендеринга. Этот объект выполняет рендеринг вашего изображения с указанными параметрами - качеством текстур, методом затенения и т.п. Мы этого пока задавать не будеи и оставим все как есть по умолчанию. Затем мы должны создать фрейм сцены. На фреймах построено все моделирование в Direct3D:RM Фрейм - это некая поверхность, на которой находятся объекты. Главный фрейм - сцена - длжен быть всегда. Также, вы обязательно должны создать фрейм камеры (иначе что вы увидите). Затем, вы создаете свои фреймы для ваших объектов. В D3D вы передвигаете не объекты по сцене, а фреймы с "укрепленными" на ними объектами. После создания главных фреймов, надо создать объект Viewport. Это как-бы ваш экран в новый 3D-мир. Viewport накладывается на сцену и определяет что вы видите в двухмерном понимании этого слова.
В параметрах при создании фрейма сцены мы указали Nothing, а у камеры - Scene. Это значит, что фрейм сцены не относится ни к чему, а камера относится к сцене. В этом "отношении" заключается иерархия фреймов в 3D-мире. Viewport мы "накладываем" на камеру и делаем его размером во весь экран. С созданием устройства рендеринга вроде все ясно: мы создаем его на основе заднего буфера, то-есть рендеринг будет производиться на него. С созданием объекта D3DRM вообще проще не придумаешь. Мы допишем сюда еще две строчки, хотя по хорошему, они не относятся к обязательным начальным установкам. Во-первых, мы создадим вещественный свет. То есть свет который издают сами поверхности. Во-вторых, мы создадим объект MeshBuilder. Это очень интересный объект. По своей сути, он представляет собой конструктор Лего :) С помощью его методов, вы создаете объединение поверхностей, то есть ваш объект. Так как объект у нас один, то и конструктор объединение то же один.
Раз создали, надо и позаботиться об уничтожении. Эта функция уничтожит все заданные объекты.
Следующую функцию я взял из mdlDirectDraw7 и переделал под DD4. Она потребуется нам для очистки заднего буфера. Ведь перед тем, как отрендерить новый кадр, нам надо будет очистить "полотно".
С модулем закончили! Переходим к форме. Напишем процедуру FormMain. Это будет управляющая процедура, то есть она будет в основном только вызывать другие, выполняющие какие-то начальные установки
Вот процедура Run, которая будет выполнять весь цикл рендеринга.
Чтобы нам не впасть в вечный цикл, надо предусмотреть выход из него. Будем выходить, когда нажмем Escape
Теперь, нам осталось написать только процедуру, которая создаст "мир".
Сначала, мы создаем объект. В виду максимального упроцения, я создавал объект путем создания поверхностей по одной и дальнейшего их "слепления" в одно объединение. Из-за этого, процесс получился довольно объемный в написании, поэтому я вынем его в отдельную процедуру. После того, как создали объект, надо его куда-то разместить. Так как мир у нас состоит из одной пирамиды, то создадим фрейм объекта World, который будет относиться к сцене. Затем, вы добавим к нему пирамиду, которую сконструировали в MeshBuilder. Придадим нашему Миру вращение (угол вращения вокруг указанных осей задается в радианах!) И напоследок, спозиционируем камеру по трем осям так, чтобы она смотрела на пирамиду. Теперь создание пирамиды. Процесс очень нудный и до безобразия понятный. По одной мы создаем поверхности, придаем и цвет и прилепляем к общему объединению.
Ну вот вроде и все! Если я (или вы) ничего не забыл, то запустите программу, выберите ваш драйвер и пирамида должна крутиться, сверкая разноцветными сторонами. Самое интересное, что я тут не добавил поверхность для нижней части пирамиды, поэтому если вы сможете поставить камеру так, чтобы она смотрела снизу на пирамиду, то вы увидите только пустоту. Это происходит потому, что поверхности прозрачны только с одной стороны. Если бы за пирамидой стояло что-то еще, вы бы увидели этот предмет сквозь пирамиду. Вот такая вот бага :) Вы можете загрузить готовый проект В следующей части мы загрузим объединение из файла .x и - радуйтесь! - натянем на него текстуру. Происходить все это будет в окне. Приятного программирования, Antiloop |
|||||
|