| netlib.narod.ru | < Назад | Оглавление | Далее > |
Луч выбора, который мы вычислили в предыдущем разделе, описан в пространстве вида. Чтобы выполнить проверку пересечения луча и объекта необходимо, чтобы и луч и объект находились в одной и той же системе координат. Вместо того, чтобы преобразовывать все объекты в пространстве вида, зачастую проще преобразовать луч выбора в мировое пространство или даже в локальное пространство объекта.
Мы можем преобразовать луч 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 | < Назад | Оглавление | Далее > |