Мы уже видели, что пересечение каждой из этих форм с лучом осуществляется достаточно быстро. Что касается сферы, то нам нужно составить квадратное уравнение и проверить, положителен ли его дискриминант (см. листинг 14.6). В случае выровненного бокса нам следует произвести пересечение луча с шестью плоскостями и проверить, вырождаются ли в нуль «возможные интервалы» (rin, tMt) (см. листинг 14.9.) Каждое из пересечений с плоскостью осуществляется очень быстро, поскольку не требуется вычислять ни одного скалярного произведения. Кроме того, часто происходит «досрочный выход», когда возможный интервал обращается в нуль уже после проверки нескольких плоскостей.

Существует два пространства, в которых мы можем производить тестирование относительно экстентов: мировые и базовые координаты. Напомним, что каждый объект трансформируется для сцены из некоторой базовой формы посредством аффинного преобразования. Чтобы пересечь луч с объектом, мы вначале преобразовываем луч в базовые координаты и пересекаем базовый луч с базовым объектом. Однако можно поместить на сцену экстент, охватывающий объект, и тестировать текущий луч относительно него. Если луч проходит мимо этого экстента, то базовый луч вычислять не нужно, что экономит нам одно преобразование. Можно также разместить экстент вокруг базового объекта и тестировать относительно него обратно преобразованный луч. Если луч проходит мимо этого экстента, то снимается необходимость теста на полное пересечение.

В мировых координатах экстенты могут не очень плотно охватывать свои объекты. На рис. 14.38, а показаны два конических цилиндра, окруженных сферическим и прямоугольным экстентами, на сцене, для которой производится трассировка лучей. На рис. 14.38, б приведен цилиндр (для простоты он принят двумерным). Если этот цилиндр длинный и тонкий, то сферический экстент не охватывает его достаточно плотно, поэтому его использование может привести к многочисленным «ложным тревогам».

Введение в трассировку лучей


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