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



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


ASSERT(SUCCEEDED(m_hr)) ;

// Привести к локальным координатам фрейма m_hr = m_pIFrame-»InverseTransform(&lv, &wv);

ASSERT(SUCCEEDED(m_hr));

// Вернуть результат *pvHit == Iv;

Для упрощения кода я воспользовался грубой аппроксимацией значения z для точки на экране. В программе это значение определяется как среднее арифметическое координат z всех вершин, образующих грань проекции. На самом деле такой способ неверен, поскольку в нем никак не учитывается положение точки попадания в многоугольнике. Более корректный способ определения z изображен на Рисунок 7-6.

р

Рисунок. 7-6» Вычисление координаты z точки Р


Определение точки попадания ''"Щ 179

Точки А, В и С на Рисунок 7-6 — вершины грани. Соединим точку А с С, а В — с точкой попадания Р. Отношение длин отрезков АХ и ХС используется для вычисления координаты z точки Х по значениям координат z точек А и С. Отношение длин отрезков РВ и ХВ используется для вычисления координаты z точки Р по значениям координат z точек В и X. Оставляю вам завершить рассуждение в качестве домашнего задания.

В приложении Select имеется команда меню, которая показывает положение точки попадания на объекте (View ¦ Hit Point). Соответствующий фрагмент кода, расположенный в конце функции CMainFrame-:ShowSelection, создает конус и присоединяет его вершину к точке попадания, при этом ориентация конуса задается по нормали к выделенной грани:

// Получить точку попадания на фигуре

// и перейти от локальных координат к мировым

C3dVector vh = m pCurShape-»Transform(m vHitPoint);

// Определить направление нормали к грани ASSERT(m_pCurShape) ;

C3dVector vn = m_pCurShape-»GetFaceNormal (m iHitFace);

// Изменить длину нормали, прибавить нормаль к точке // попадания и преобразовать в мировые координаты C3dVector vx = vn * 0.5 + m vHitPoint;

vx = m pCurShape-»Transform (vx) ;

// Направить вершину конуса в точку попадания m_pHitPtr = new C3dShape;

m_pHitPtr-»CreateCone (vh.x, vh.y, vh.z, 0, FALSE, vx.x, vx.y, vx.z, 0.1, TRUE);

// Присоединить конус к фигуре m_pCurShape-»AddChild(m_pHitPtr) ;




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