14.11.2. Обработка преломления методом shade()

При трассировке лучей для сцен, содержащих прозрачные объекты, нам необходимо отслеживать среду, через которую проходит луч, поэтому мы можем определить значение с2/с, для очередного пересечения, где луч или выходит из текущего объекта, или входит в другой объект. Такое отслеживание проще всего осуществить путем добавления к записи луча поля, содержащего указатель на объект, внутри которого движется луч.

Как метод shade() работает с лучами, находящимися внутри объектов? Ответ зависит от того, сколько свободы дается разработчику модели при описании сцен. Рассмотрим несколько «конструкторских установок», которых должен придерживаться разработчик.

1-я конструкторская установка: не допускается взаимопроникновение двух прозрачных объектов Предположим для начала, что разработчик обещает никогда не допускать взаимопроникновения двух прозрачных объектов. Так, нельзя помещать один стеклянный шарик внутрь другого или водяной куб внутрь стеклянной коробки. В таком случае каждый луч или находится только в воздухе, или внутри только одного объекта.

1. Пусть текущий луч в методе shadeO находится вне всех объектов и при соударении этого луча, скажем, с объектом А мы находим этот объект А «достаточно прозрачным». Тогда метод shadeO вычисляет направление t преломленного луча согласно уравнению (14.46), причем принимается с, = 1 (для воздуха), а значение с2 берется из свойств объекта А. Соответственно создается новый луч, его уровень рекурсии recurseLevel должным образом увеличивается на единицу, причем этот луч содержит указатель на объект А. Затем подпрограмма shadeO вызывается рекурсивно и в конечном счете возвращает цвет, который затем умножается на прозрачность объекта А transparency и добавляется к цветам, накопленным до этого момента.

2. Предположим, с другой стороны, что текущий луч находится внутри некоторого объекта А и соударяется с другой поверхностью. Поскольку это обязательно должна быть поверхность объекта А (почему?), то луч выходит на воздух. (Подпрограмма может проверить, что луч соударяется с тем же объектом, внутри которого он находится в текущий момент.) В силу того, что луч находится внутри объекта, нормаль в точке соударения должна изменить знак: мы хотим, чтобы она указывала внутрь той среды, куда движется луч. Когда луч находится внутри объекта, обычно считается, что там объект не освещен и поэтому нет необходимости вычислять локальные интенсивности фонового, диффузного и зеркального света. (Достаточно ли обоснованно такое приближение?) Внутренняя стенка объекта Л может считаться «достаточно блестящей», чтобы обеспечить путь отраженного луча обратно в объект А. (Будет ли разумно использовать одно и то же значение «блеска» как для наружной, так и для внутренней поверхности объекта?) В таком случае отраженный луч создается и испускается обычным способом. Что касается преломленного луча, то очевидно, что объект А является достаточно прозрачным (почему?), поэтому значение скорости с( берется из свойств объекта А, а скорости с2 присваивается единица (для воздуха). Если угол падения меньше критического, то испускается новый луч (его указатель устанавливается в NULL, поскольку он теперь не находится внутри какого-либо объекта) и посылается по своему маршруту накапливать другие компоненты света.


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