double tl - (-B - discRoot)/A: // the earlier hit // более раннее соударение

if(tl > 0.00001) // is hit in front of the eye? // находится ли данное соударение впереди глаза?

{
inter.hit[0].hitTime - tl; inter.hit[0].hitObject = this: inter.hit[0].isEntering - true; inter.hit[0].surface - 0; Point3 P(rayPos(genRay. tl)):

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

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

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

// hit spot

// точка соударения

inter.hit[0].hitPoint.set(P):
inter.hit[0].hitNormal.set(P):

num = 1: // have a hit // имеем соударение }

double t2 - (-B + discRoot)/A: // the later hit // более позднее соударение

if( t2 > 0.00001)
{
inter.hit[num].hitTime - t2: inter.hit[num].hitObject - this: inter.hit[num].isEntering - false: inter.hit[num].surface - 0: Point3 P(rayPos(genRay. t2)):
// hit spot

// точка соударения

i nter.hi t[num].hi tPoi nt.set(P): inter.hit[num].hitNormal.set(P): num++: // have another hit // имеем еще одно соударение }

inter.numHits = num:

return (num > 0): // true or false // true или false }

В листинге 14.6 приведен метод hit() для класса Sphere. Сначала он преобразует луч г в базовые координаты данной сферы, используя при этом обратное преобразование для именно этой сферы. Подпрограмма xfrmRayO преобразует луч в соответствии с уравнением (14.15) (см. упражнения в конце раздела). Далее определяются коэффициенты А, В, С квадратного уравнения (14.12) и исследуется дискриминант В2 - АС. Если он меньше нуля, то данное уравнение не имеет вещественных решений, и мы делаем вывод, что данный луч должен пройти мимо сферы. Тогда метод hit() возвращает false и запись inter не используется.

Какие!очки соударения находятся впереди глаза?

Рис. 14.10. Какие!очки соударения находятся впереди глаза?

Если же дискриминант положителен, то из уравнения (14.13) определяются два момента соударения. Обозначим более раннее из этих времен через г,, а более позднее - через г2. Как показано на рис. 14.10, имеются три возможности"opengl1_941.html">⇐ Предыдущая| |Следующая ⇒