Рендеринг вращающихся кубов в 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 и закройте это окно свойств
На этом подготовительный этап к выполнению данной лабораторной работы завершен.