}
В тематическом задании 14.1 реализация простого трассировщика лучей для сцен со сферами рассматривается более детально.
14.6. Пересечение лучей с другими примитивами Разработаем метод h1t() для других классов форм. Все эти методы hit() похожи друг на друга: вначале луч преобразуется в базовые координаты рассматриваемого объекта, затем вычисляются различные пересечения луча с базовым объектом. Нам остается только разработать специфические детали пересечения для каждой базовой формы.
14.6.1. Пересечение с квадратом Квадрат является полезной базовой формой. Базовый квадрат лежит в плоскости z - О и простирается от -1 до 1 по х и по у. (Неявная форма уравнения квадрата имеет вид: F(P) - Рг, где |Рх| < 1 и \Ру\ < 1.) Квадрат может быть преобразован в параллелограмм произвольного вида, расположенный в простран1 Отметим, что вычисление некоторых из этих переменных для эффективности может быть выведено за пределы внутреннего цикла. (Каких именно?)
14.6. Пересечение лучей с другими примитивами стве, так что его часто используют в сценах для получения тонких плоских поверхностей, таких как стены и окна. Функция hit() вначале определяет, где луч соударяется с базовой плоскостью, а затем проверяет, находится ли эта точка соударения внутри квадрата, как показано в листинге 14.7.
Листинг 14.7. Метод hit() для класса Square
// ««««««««< hit for Square »»»»»»»». //««««««««« соударение с квадратом »»»». bool Square:: hitCRay &r. Intersections inter)
Ray genRay: // need to make the generic ray // требуется создать базовый луч
inter.numHits - 0: // initial assumption // начальное предположение
xfrmRay(genRay. invTransf. r):
double denom - genRay.dir.z; // denominator // знаменатель
if(fabs(denom) < 0.0001) return false: // ray parallel to plane: miss // луч параллелен плоскости: пропускаем
double time - -genRay.start.z/denom: // hit time // время соударения