}

В тематическом задании 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 // время соударения


⇐ Предыдущая| |Следующая ⇒