netlib.narod.ru< Назад | Оглавление | Далее >

15.3. Преобразование лучей

Луч выбора, который мы вычислили в предыдущем разделе, описан в пространстве вида. Чтобы выполнить проверку пересечения луча и объекта необходимо, чтобы и луч и объект находились в одной и той же системе координат. Вместо того, чтобы преобразовывать все объекты в пространстве вида, зачастую проще преобразовать луч выбора в мировое пространство или даже в локальное пространство объекта.

Мы можем преобразовать луч r(t) = p0 + tu преобразовав его начальную точку p0 и вектор направления u путем умножения на матрицу преобразования. Обратите внимание, что начальная точка преобразуется как точка, а направление обрабатывается как вектор. В рассматриваемом в данной главе примере программы для преобразования лучей реализована следующая функция:

void TransformRay(d3d::Ray* ray, D3DXMATRIX* T)
{
     // Преобразование начальной точки луча, w = 1.
     D3DXVec3TransformCoord(
          &ray->_origin,
          &ray->_origin,
          T);

     // Преобразование вектора направления луча, w = 0.
     D3DXVec3TransformNormal(
          &ray->_direction,
          &ray->_direction,
          T);

     // Нормализация вектора направления
     D3DXVec3Normalize(&ray->_direction, &ray->_direction);
}

Функции D3DXVec3TransformCoord и D3DXVec3TransformNormal получают в качестве параметра трехмерный вектор, но обратите внимание, что функция D3DXVec3TransformCoord подразумевает что четвертая компонента вектора w = 1. В противоположность ей функция D3DXVec3TransformNormal подразумевает, что четвертая компонента вектора w = 0. Следовательно, мы используем D3DXVec3TransformCoord для преобразования точек, а D3DXVec3TransformNormal — для преобразования векторов.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz