14.10. Добавление теней для большей реалистичности Практические упражнения 14.9.8. Нахождение проекции точки Докажите правильность равенств (14.41) и (14.42). Для этого «инвертируйте» уравнение (14.3), которое задает направление луча, проходящего через /с-пиксел: по заданному направлению выведите значения г и с. Луч, идущий из глаза через точку р, имеет направление К(р - eye), где К - некоторый масштабный коэффициент. Это направление должно совпадать с вектором dir из уравнения (14.3). Для выделения некоторых членов умножим скалярно обе части выражений на вектор и:
K(p-eye)-u = W
( 2с ^
nCols
-1
При последующем скалярном умножении на векторы V и п можно получить еще два уравнения, одно из которых определяет значение К через известные величины. Покажите, что из этого равенства следует, что т =1_ 2с
WP„ nCols
откуда можно выразить с и получить один из результатов уравнения (14.41). Аналогично выведите второй результат.
14.9.9. Объединенные экстенты для дальнейшей экономии времени Некоторые сцены содержаг-оольшие области, на которых виден только фон и отсутствуют какие-либо объекты. С целью дополнительной экономии времени во время трассировки лучей можно создать объединенный экстент (union extent), то есть наименьший выровненный прямоугольник, охватывающий все индивидуальные экстенты объектов на сцене. Каждый луч в первую очередь тестируется с этим экстентом. Если луч лежит вне экстента, то ему незамедлительно присваивается цвет фона. В противном случае, как обычно, будет просматриваться весь список объектов. Покажите, как сформировать объединенный экстент и как применять его в вашем трассировщике лучей.
14.9.10. Списки для кластеров объектов Значительно сократить вычисления может еще одно усовершенствование - в тех случаях, когда оно применимо. Когда объекты на сцене образуют в достаточной степени изолированные группы - «кластеры», то каждый такой кластер объектов можно поместить в отдельный список объектов - назовем его кластерным списком (cluster list). Для каждого кластера вычисляется объединенный экстент. В этом случае список объектов превращается в список кластерных списков. Во время трассировки лучей каждый луч тестируется относительно объединенного экстента каждого кластерного списка, и только в случае прохождения этоТо теста луч тестируется относительно отдельных объектов кластера. Покажите, как следует организовать типы данных и сам алгоритм трассировки лучей, чтобы реализовать этот подход.