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




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


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

В приложении Select грани, в которые происходит попадание, окрашиваются в красный цвет. Кроме того, в строке состояния выводится имя выделенного объекта, номер грани и координаты точки попадания в объекте (в следующем разделе мы узнаем, как определить координаты точки попадания). Все это происходит в приведенной ниже функции MakeCurrent:

void CMainFrame::MakeCurrent(C3dShape* pShape) f

HideSelection() ;

m pCurShape = pShape;

Выделение отдельной грани ''до 177

ShowSelectionf) ;

if (m_pCurShape != NULL) { if (m_iHitFace »= 0) {

Status("Selected: %s (%d @ %3.1f,%3.1f,%3 if)"

ni_pCurShape-»GetName () , m_iHitFace, ni_vHitPoint.x, m_vHitPoint.y, m_vHitPoint.z) ;

"PCurShape-»SetFaceColor(m_iHitFace, 1, О, О).

J Q -L SG { '

^ Status ("Selected: %s", m_pCurShape-»GetMame () ) ;

) else {

Status("No selection");

Определение точки попадания

Рисунок. 7-5. Проектирование точки попадания на объект


/h2>

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

Для этого необходимо взять экранные координаты точки попадания и последовательно преобразовать их в однородный вектор, затем в мировые координаты и снова в локальные координаты объекта. Ниже приведен завершающий фрагмент функции C3dShape::HitTest:

// Вычислить положение точки попадания на грани // Подготовить вектор, описывающий точку экрана // В качестве z используется среднее значение. sv.x = pt.x;

sv.y = pt.y;

sv.z = dHitZ;

sv.w = 1.0;

// Привести к мировым координатам m hr = pIViewport-»InverseTransform ( &wv, &sv) ;




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