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



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


}

}

Чтобы правильно определить положение конуса, необходимо привести локальные координаты объекта к системе мировых координат. На Рисунок 7-7 показано, как выглядит экран с конусом (кроме того, на цветной вкладке имеется изображение конуса, указывающего на выделенную сферу).

Вы можете легко убедиться в том, что усреднение координат z вершин неточно определяет положение точки попадания. Попробуйте выделить одну из боковых граней конуса. Вы увидите, что вершина конуса либо уходит внутрь грани, либо отходит на некоторое расстояние, вместо того, чтобы лежать точно на ней.

Проверка попадания на практике

Чтобы показать, как проверка попадания используется на практике, я создал приложение Blobs, в котором можно нарисовать на экране потрясающее космичес-

/b> ЦУ Глава 7. Проверка попадания

Рисунок. 7-7. Конус, показывающий положение точки попадания на объекте


кое существо, наподобие изображенного на Рисунок 7-8 (более качественная иллюстрация из приложения Blobs приведена на цветной вкладке).

Приложение Blobs


Приложение добавляет новое «пятно» к объекту, в точке где вы щелкаете мышью. Пятна на самом деле являются сферами, состоящими из четырех полос;

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

/h2>

Проверка попадания на практике

и изменил уведомляющую функцию, чтобы она добавляла к макету новые пятна. Новая функция выглядит следующим образом:

void CMainFrame::OnSelChange(C3dShape* pShape, CPoint pt,

void* pArg) {

// Получить указатель на объект класса

CMainFrame* pThis = (CMainFrame*) pArg;

ASSERT(pThis);

ASSERT(pThis-»IsKindOf (RUNTIME_CLASS(CMainFrame))) ;

if (pShape) {

// Определить, в какую грань пришлось попадание C3dViewport* pViewport =

pThis-»m_wnd3d.GetStage () -»GetViewport () ;

int iFace;

C3dVector vHit;

if (pShape-»HitTest (pt, pViewport, &iFace, &vHit) ) ( pThis-»AddBlob (pShape, vHit) ;

}

l

}

Как видно из листинга, после определения точки попадания вызывается функция AddBlob, которая присоединяет к фигуре новое пятно:




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