В какой момент процесса трассировки лучей следует вставить тестирование экстента? Арво и Кирк (Arvo, Kirk) провели в своей работе [Arvo, 5] превосходный обзор возможных подходов, включая использование иерархических экстентов, охватывающих целые группы объектов. Сосредоточим свое внимание на усовершенствовании базового метода hit(), которым обладает каждый объект сцены.
14.9. Использование экстентов Вспомним подпрограмму getFirstHitO из листинга 14.5, которая тестирует текущий луч относительно каждого объекта, используя для каждого объекта его собственный метод hit():
for(each object, obj) // для каждого объекта {
i f(!obj->hi t(ray.i nter)) conti nue:
compare this hit time with the best so far. etc.
// сравниваем это время соударения с наилучшим на данный
// момент и т. д.
}
Для убыстрения каждого индивидуального теста мы будем использовать тестирование относительно экстента внутри метода hit(). Если мы можем до начала полного вычисления пересечений быстро определить, что данный луч не соударяется с объектом, то общая скорость трассировщика луча значительно возрастет. Еще одно преимущество заключения тестирования экстента внутрь каждого метода hit() заключается в том, что тогда это тестирование может быть лучше приспособлено к особенностям исследуемой геометрической формы.
Существует несколько способов создания и использования экстентов при трассировке лучей. Некоторые из них реализуются просто, а другие требуют больше программного кода, однако обеспечивают лучшую производительность. Мы рассмотрим несколько различных простых методов и покажем, как они вписываются в логическую схему трассировщика лучей. Другие методы описываются в упражнениях в конце следующего раздела.
14.9.1. Боксы и сферические экстенты
Для экстентов чаще всего используются две формы: сфера и «выровненный бокс».
О Сферический экстент (sphere extent). Сфера, полностью охватывающая данный объект, определяется парой чисел (С, г) - точкой центра С и радиусом г.
О Бокс (box extent). Прямоугольный параллелепипед, стороны которого выровнены по координатным осям, определяется шестью числами: (left, top, right, bottom, front, back).