Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 12:

Рендеринг вращающихся кубов в DirectX

Аннотация: В лекции приводятся примеры рисования графических примитивов. Создание вращающегося куба. Добавление функциональности остановки вращения. Текстурирование сторон вращающегося куба.

Файлы к лабораторной работе Вы можете скачать здесь.

Вся геометрия в трехмерной сцене составляется из графических примитивов, которые называют полигонами. В качестве полигонов чаще всего применяются треугольники. В этой работе мы будем аппроксимировать кубы с помощью треугольников. Любой квадрат, прямоугольник или параллелепипед можно сложить из двух треугольников. Соответственно куб можно создать из шести квадратов. Поскольку куб имеет восемь угловых вершин, их координаты и будут определять треугольники соответствующих граней.

Создание заготовки приложения

Чтобы не создавать приложение с нуля, мы воспользуемся результатами работы №10 и некоторыми предварительными преобразованиями подготовим ее для решения поставленной задачи.

  • Создайте новый пустой проект с именем RenderCube типа C#

  • Вызовите контекстное меню для имени проекта или узла References в панели Solution Explorer (или в меню Project оболочки), чтобы открыть окно добавления ссылок на необходимые для проекта библиотеки DLL


  • Добавьте к проекту, удерживая клавишу Ctrl, ссылки на библиотеки
    • System.dll
    • System.Drawing.dll
    • System.Windows.Forms.dll
    • Microsoft.DirectX.dll
    • Microsoft.DirectX.Direct3D.dll


  • В панели 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 и закройте это окно свойств

  • Запустите приложение в режиме Debug и убедитесь, что консольное окно больше не появляется

На этом подготовительный этап к выполнению данной лабораторной работы завершен.

Александр Очеретяный
Александр Очеретяный
Украина, Киев
Анастасия Балыбердина
Анастасия Балыбердина
Украина, Киев, НТУУ КПИ