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 | < Назад | Оглавление | Далее > |