Спонсор: Microsoft
Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1359 / 138 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 7:

Освещенность и материалы. Построения объектов

Построение стандартных объектов

Библиотека Direct3D располагает рядом встроенных функций для построения простых стандартных трехмерных примитивов (куб, цилиндр, сфера, тор):

  1. D3DXCreatePolygon // полигон
  2. D3DXCreateBox // параллелограмм
  3. D3DXCreateCylinder // цилиндр
  4. D3DXCreateSphere // сфера
  5. D3DXCreateTorus // тор
  6. D3DXCreateTeapot // чайник

При создании объектов таким способом вершины "получают" формат, в котором присутствует положение (D3DFVF_XYZ) и нормаль (D3DFVF_NORMAL). Существует возможность задавать уровень детализации при создании перечисленных выше трехмерных примитивов. Следует заметить, что нормаль к каждой вершине созданного объекта вычисляется автоматически. Рассмотрим их функции создания и визуализации. Для работы с подобными примитивами необходимо объявить переменную интерфейсного типа ID3DXMesh, в которой и будет "храниться" трехмерный объект. Визуализация созданного объекта осуществляется вызовом метода DrawSubset интерфейса ID3DXMesh.

Функция создания полигона (правильного многоугольника):

D3DXCreatePolygon(
ссылка на устройство вывода,
длина стороны полигона,
количество сторон полигона,
результат,
указатель на смежные треугольники);

Ниже приведен пример создания и визуализации трехмерного объекта – полигона.

C++
// объявление переменной
LPD3DXMESH polygon;
// создание объекта полигон
D3DXCreatePolygon( device, 0.5, 10, &polygon, NULL);
// визуализация
polygon->DrawSubset(0);
Pascal
// объявление переменной
var polygon: ID3DXMesh; 
// создание объекта полигон
D3DXCreatePolygon(device, 0.5, 10, polygon, nil);
// визуализация
polygon.DrawSubset(0);

Ниже приведены примеры построения полигонов с разными значениями второго и третьего параметра рассмотренной функции.

Длина стороны = 0.5

Количество сторон = 10

Длина стороны = 2

Количество сторон = 3

Длина стороны = 0.1

Количество сторон = 36




Функция вывода параллелепипеда

D3DXCreateBox(
ссылка на устройство вывода,
ширина,
высота,
глубина,
результат,
указатель на смежные треугольники);

Ниже приведен пример создания и визуализации трехмерного объекта – полигона.

C++
// объявление переменной
LPD3DXMESH box;
// создание объекта 
D3DXCreateBox( device, 1.0f, 0.5f, 2.0f, &box, NULL);
// визуализация
box->DrawSubset(0);
Pascal
// объявление переменной
var box: ID3DXMesh; 
// создание объекта 
D3DXCreateBox(device, 1, 0.5, 2, box, nil);
// визуализация
box.DrawSubset(0);

Примеры вывода параллелограмма с различными длинами сторон

ширина = 1

высота = 0.5

глубина = 2

ширина = 1

высота = 1

глубина = 1

ширина = 0.5

высота = 2

глубина = 1




Функция построения цилиндра

D3DXCreateCylinder(
ссылка на устройство
радиус первого основания
радиус второго основания
высота цилиндра
количество разбиений "по радиусу"
количество разбиений "по длине"
результат
указатель на смежные треугольники);

C++
LPD3DXMESH cylinder;
D3DXCreateCylinder(device, 0.2f, 0.2f, 1, 16, 3, 
&cylinder, NULL);

cylinder->DrawSubset(0);
Pascal
var cylinder: ID3DXMesh;
D3DXCreateCylinder(device, 0.2, 0.2, 1, 16, 3, cylinder, nil);            

cylinder.DrawSubset(0);
Первое основание = 0.2

Второе основание = 0.2

Разбиений по радиусу = 16

Первое основание = 0.4

Второе основание = 0.2

Разбиений по радиусу = 16

Первое основание = 0.4

Второе основание = 0

Разбиений по радиусу = 6




Функция построения сферы:

D3DXCreateSphere(
ссылка на устройство,
радиус сферы,
разбиений "по радиусу", // число апельсиновых долек
разбиений "вдоль", // 
результат,
указатель на смежные треугольники);
Разбиений по радиусу = 6, вдоль = 32 Разбиений по радиусу = 32, вдоль = 6


C++
LPD3DXMESH sphere;
D3DXCreateSphere(device, 1.0f, 16, 16, &sphere, NULL);

sphere->DrawSubset(0);
Pascal
var sphere: ID3DXMesh;
D3DXCreateSphere(device, 1, 16, 16, sphere, nil);            

sphere.DrawSubset(0);
Олег Корсак
Олег Корсак
Латвия, Рига
Ренат Файзуллин
Ренат Файзуллин
Россия, Казань