ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX




Создание фигур - часть 20


Помните, что мы говорили о фреймах и визуальных элементах в главе З? Объект C3dShape содержит фрейм, определяющий его положение, размер, ориентацию и т. д., а также визуальный элемент, который по сути дела описывает набор вершин, граней и т. д. для объекта, который мы хотим увидеть на экране. Функция C3dShape::Clone позволяет включить один и тот же визуальный элемент в несколько разных фреймов. Она создает новый объект C3dShape по существующему объекту, но вместо того, чтобы строить для него новый визуальный элемент, она присоединяет к объекту визуальный элемент исходной фигуры. Таким образом, чтобы изобразить лес, можно создать одно дерево и продублировать его 99 раз. Результат изображен на Рисунок 4-26 (команда Edit ¦ A Forest).

Создание леса

/h2>

Рисунок. 4-26. Лес


Давайте рассмотрим функцию, в которой строится лес, поскольку некоторые аспекты процесса дублирования оказываются неочевидными.

void CMainFrame::OnEditForest() {

NewScene();

// Создать первое дерево вместе со стволом m_pShape = new C3dShape;

m_pShape-»CreateCone (0, О, О, 1, TRUE, 0, 4, О, О, FALSE) ;

C3dShape trunk;

trunk.CreateRod(0, -2, О, О, О, О, 0.2);

m_pShape-»AddChild(&trunk) ;

// Присоединить дерево к макету m_pScene-»AddChild(m_pShape) ;

// Получить позицию и ориентацию ствола // по отношению к родителю (дереву) C3dVector p, d, u;

trunk.GetPosition(p) ;

trunk.GetDirection(d, и);

// Дублировать дерево 99 раз for (int i = 0; i « 99; i++) {

// Дублировать крону и ствол

/h2>

Глава 4. Создание фигур

C3dShape* pTree == m_pShape-»Clone () ;

C3dShape* pTrunk = trunk.Clone();

pTree-»AddChild(pTrunk) ;

// Задать относительную позицию ствола //по отношению к кроне pTrunk-»SetPosition (p) ;

pTrunk-»SetDirection(d, u) ;

// Присоединить дубли как потомков первого дерева, // чтобы можно было вращать весь лес m_pShape-»AddChild(pTree) ;

// Задать положение нового дерева в макете

pTree-»SetPosition( ( (double) (rand () % 100) / 5)

- 10.0,

0,

(double)(rand() % 100) / 5,




Содержание  Назад  Вперед