Листинг 14.16. Усовершенствование типа Ray class Ray{ public:

Point3 start:
Vector3 dir;
int recurseLevel:

int row, col: // to assist with screen extents // для облегчения работы с экранными экстентами

int numlnside:

продолжение^

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

Листинг 14.16 (продолжение)

// number of objects on the list // число объектов в списке

GeomObj* inside[8]; // array of object pointers // массив указателей объекта

Ray(){recurseLeve1 = numlnside = 0;} // constructor // конструктор

... other methods ... II другие методы }: Как такой «внутренний список» используется в методе shadeO? В любой момент времени луч находится внутри некоторой совокупности объектов, определяемой этим списком. Когда луч соударяется с поверхностью очередного объекта В, мы предпринимаем различные действия - в зависимости от того, входит луч в объект В или выходит из него (это определяется состоянием поля isEntering в записи соударений).

1. Предположим, что луч входит в объект В. Если В не является достаточно прозрачным, то мы: прекращаем испускание преломленных лучей, зато испускаем отраженный луч, если объект В достаточно блестящ. Если же объект В достаточно прозрачен, то в качестве скорости с, мы принимаем скорость света в объекте, обладающем наивысшим приоритетом в текущем списке. Если высший приоритет имеет объект В, то в качестве с2 принимается его скорость света; в противном случае с2 принимается равной с,. После этого объект В добавляется в список. Затем создается новый проходящий луч, причем в него копируется текущий список (с добавленным в него объектом В). Наконец, производится рекурсивный вызов метода shadeO.

2. Предположим теперь, что луч покидает объект В. Тогда в качестве скорости ct принимается скорость света того объекта из списка, который обладает наивысшим приоритетом. Далее объект В удаляется из списка и в качестве скорости с2 принимается скорость света объекта с наивысшим приоритетом из оставшихся в списке. Затем создается новый проходящий луч и в него копируется текущий «внутренний список». Наконец, производится рекурсивный вызов метода shade().


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