Подпрограмма getFirstHitO находит объект, с которым луч соударяется первым, и возвращает информацию об этом в запись пересечений best. Мы реализуем записи пересечений с применением класса Intersection:

class Intersection{ public:
int numHits:

14.5. Организация трассировщика луча в приложении

// # of hits at positive hit times

// число соударений для положительных значений времени

Hitlnfo hit[8]: // list of hits - may need more than 8 later // список соударений - позднее их понадобится больше 8 ... various methods ... // различные методы }: Этот класс имеет два поля: число соударений луча с объектом и массив, содержащий данные о каждом соударении. Мы будем считать легитимными только такие соударения, которые происходят при положительных значениях времени соударения (перед исходной точкой луча); соударения «позади глаза» не представляют для нас интереса. Особенно нас интересует первое соударение луча с объектом. Если inter - запись пересечений, a inter.numHits больше нуля, то информация о первом соударении хранится в inter.hit[0].

Зачем же хранить информацию обо всех соударениях луча с объектами (в положительные моменты времени), а не только о первом из них? Одним из главных преимуществ метода трассировки луча является его способность визуализации логических (Boolean) объектов (см. раздел «Пересечения лучей с Булевыми объектами» данной главы). Для обработки таких объектов нам необходимо хранить запись данных обо всех соударениях луча с объектом, поэтому мы предпринимаем усилия для этого уже сен-час. Обычно глаз находится позади всех объектов и луч соударяется с объектом дважды - один раз при входе в объект, и один раз при выходе из него. Для таких случаев inter.numHits равно 2, a inter.hit[0] описывает, где луч входит в объект, а в inter.hit[l] - где луч выходит из него. Однако некоторые объекты, например тор или логические объекты, показанные на рис. 14.9, могут иметь более двух соударений. На рис. 14.9, а имеется четыре соударения с положительными значениями времени соударения, поэтому inter.numHits равно 4, а информация об этих соударениях хранится в inter.hit[0],..., inter.hit[3]. На рис. 14.9, б луч соударяется с объектом восемь раз, однако глаз находится внутри этого объекта (который предполагается прозрачным), поэтому всего трем соударениям соответствуют положительные значения времени (inter.numHits равно3).


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