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



Проверка попадания - часть 6


AppData может принимать значения трех типов: NULL, указатель на объект C3dFrame, указатель на объект C3dShape. Код проверки попадания работает лишь в том случае, если указатель ссылается на объект C3dShape и если объект класса C++, создавший визуальный элемент и фрейм, не был уничтожен. Деструктор класса C3dFrame (базового для C3dShape) присваивает AppData значение NULL, так что можно не опасаться случайного получения указателя на удаленный объект C++. Из всего сказанного следует, что функция HitTest полезна лишь при работе с теми трехмерными фигурами, с которыми связан текущий объект класса C3dShape.

Отображение выделения на экране

Если запустить приложение Select и щелкнуть на каком-нибудь объекте, вокруг последнего появляется рамка, похожая на изображенную на Рисунок 7-2.

Рамка расположена таким образом, чтобы показать граничную область объекта, то есть наименьшую кубическую область, содержащую все вершины объекта. Одна стрелка, состоящая из цилиндра и конуса, показывает вектор направления объекта, а другая стрелка (с конусом меньшей высоты) — его верхний вектор. Эти два вектора пересекаются в начале координат — точке объекта с координа-

/b>

Глава 7. Проверка попадания

тами О, О, О. В случае сферы на Рисунок 7-2, начало координат находится внутри объекта.

Рисунок. 7-2. Выделенный объект


Функция, рисующая рамку, несложна, хотя несколько длинна:

void CMainFrame::ShowSelection() {

// Определить граничную область объекта double xl, x2, yl, y2, zl, z2;

BOOL b = m_pCurShape-»GetBox (xl, yl, zl, x2, y2, z2);

ASSERT(b) ;

// Создать новую рамку вокруг фигуры m_pSelBox = new CSdShape;

double r = 0.03;

double re = r * 2;

C3dShape rl, r2, r3, r4, r5, r6, r7, r8, r9,

rIO, rll, rl2, rd, ru, cd, cu;

// Создать цилиндры, из которых состоит рамка

m_pSelBox-»AddChild(&r3) ;

r4.CreateRod(xl, y2, zl, x2, y2, zl, r) ;

m_pSelBox-»AddChild(&r4) ;

r5.CreateRod(x2, yl, zl, x2, y2, zl, r) ;

m_pSelBox-»AddChild(&r5) ;

r6.CreateRod(xl, y2, zl, xl, y2, z2, r) ;




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