Рендеринг вращающихся кубов в DirectX
Файлы к лабораторной работе Вы можете скачать здесь.
Вся геометрия в трехмерной сцене составляется из графических примитивов, которые называют полигонами. В качестве полигонов чаще всего применяются треугольники. В этой работе мы будем аппроксимировать кубы с помощью треугольников. Любой квадрат, прямоугольник или параллелепипед можно сложить из двух треугольников. Соответственно куб можно создать из шести квадратов. Поскольку куб имеет восемь угловых вершин, их координаты и будут определять треугольники соответствующих граней.
Создание заготовки приложения
Чтобы не создавать приложение с нуля, мы воспользуемся результатами работы №10 и некоторыми предварительными преобразованиями подготовим ее для решения поставленной задачи.
- Создайте новый пустой проект с именем RenderCube типа C#
- Вызовите контекстное меню для имени проекта или узла References в панели Solution Explorer (или в меню Project оболочки), чтобы открыть окно добавления ссылок на необходимые для проекта библиотеки DLL
- Добавьте к проекту, удерживая клавишу Ctrl, ссылки на библиотеки
- В панели Solution Explorer выделите узел проекта и с помощью команды Add Existing Item меню Project оболочки добавьте к проекту файлы Form1.cs и Program.cs из лабораторной работы №10
Файл Form1.Designer.cs является подчиненным файлу Form1.cs и скопируется оболочкой автоматически.
Оболочка скопирует эти файлы в каталог размещения нового проекта.
- Убедитесь, что на данном этапе панель Solution Explorer проекта выглядит так
- Вызовите окно Find and Replace комбинацией клавиш Ctrl-H (или командой Edit/Find and Replace/Quick Replace ), настройте его в соответствии с рисунком и щелкните на кнопке Replace All
Оболочка выполнит во всех файлах замену пространства имен SimpleMedia на RenderCube. Это действие нужно для того, чтобы классы приложения находились в одном (уже новом) пространстве имен и видели друг друга.
Для того, чтобы упростить задачу - не задавать координаты нормалей, настроим наш код на работу без источника света. Для этого вместо режима использования структуры PositionNormalColored нужно применить структуру PositionColored и отключить источник света.
- Откройте файл Form1.cs в режиме View Code, вызовите окно Find and Replace комбинацией клавиш Ctrl-H и при настройке Currend Document выполните замену PositionNormalColored на PositionColored
- Через раскрывающийся список Members редактора кода позиционируйтесь на обработчике vb_Created() и удалите из него код создания нормалей к вершинам треугольника
// Дополнить вершины параметрами нормалей verts[0].SetNormal(new Vector3(0.0F, 0.0F, -1.0F)); verts[1].SetNormal(new Vector3(0.0F, 0.0F, -1.0F)); verts[2].SetNormal(new Vector3(0.0F, 0.0F, -1.0F));Листинг 12.1. Удаляемый код создания нормалей в обработчике vb_Created()
- Удалите из функции OnPaint() код настройки источника света
// Настроить параметры света источника с номером 0 device.Lights[0].Type = LightType.Point; // Точечный источник // По умолчанию (0,0,0) - источник в начале координат device.Lights[0].Position = new Vector3(); // Свет диффузионный белый device.Lights[0].Diffuse = System.Drawing.Color.White; // Затухание света при удалении device.Lights[0].Attenuation0 = 0.2f; // Дальность освещения, поддерживаемая устройством device.Lights[0].Range = 1000.0f; // Принять настройки device.Lights[0].Commit(); // Установить активным device.Lights[0].Enabled = true;Листинг 12.2. Удаляемый код настройки источника света в функции OnPaint()
- В функции SetupCamera() отключите освещение сцены, установив флаг device.RenderState.Lighting конвейера в состояние false
- Установите режим Release работы компилятора и запустите приложение, чтобы проверить, что на данном этапе оно функционирует нормально
Мы видим, что одновременно запускаются два окна: консольное и графическое. Отключим консольное окно.
- В панели Solution Explorer для узла проекта вызовите контекстное меню и выполните команду Properties
- Для вкладки Application окна свойств проекта установите свойство Output type в значение Windows Application и закройте это окно свойств
На этом подготовительный этап к выполнению данной лабораторной работы завершен.