+ SQR(genRay.start.y + genRay.dir.y * tc) <

SQR(smallRadius)) // within disc // внутри диска

{
inter.hit[num].hitTime - tc:

inter.hit[num++].surface - 2: // 2 for the cap // 2 для крышки }

if(num - 0) return false: // missed everything, or behind the eye // луч проходит мимо всего или находится позади глаза

inter.numHits - num:
if(num - 1)

// eye inside cylinder, only have the exiting hit // глаз внутри цилиндра, имеется только соударение выхода {

inter.hit[0].isEntering - false: inter.hit[0].hit0bject - this:
}

14.6. Пересечение лучей с другими примитивами

else

// have two hits - first must be entering // имеется два соударения - первое должно быть вхождением {

// now sort the two hits

// теперь сортируем два соударения

if(inter.hit[0].hitTime > inter.hit[l].hitTime) // must reverse them // следует поменять их местами

{
// need only swap the hitTime and surface fields

// требуется только переставить hitTime и поля поверхностей

double tmpT - inter.hit[0].hitTime: // swap times

// переставляем значения времени

inter.hit[0].hitTime - inter.hit[l].hitTime;
inter.hit[l].hitTime - tmpT:

int tmpS - Inter.h1t[0].surface: // swap surfaces // переставляем поверхности

inter.hit[0].surface - inter.hit[l].surface:
inter.hit[l].surface - tmpS:
}
inter.hit[0].1sEntering - true:
inter.hit[l].isEntering - false:
inter.hit[0].hitObject - inter.hit[l].hitObject - this:
}

// now set the hit point and normal for the hit or hits // теперь устанавливаем точку соударения и нормаль // для одного или нескольких соударений

for(int i - 0: i < num: i++)
{

Point3 PO(rayPos(genRay. inter.hit[i].hitTime)): // position of first hit // положение первого соударения

inter.hit[i].hitPoint.set(PO): int surf - inter.hit[1].surface; if(surf - 0)

// wall // стенка

inter.hit[i].hitNorma1.set(P0.x. PO.y. -sm * (1 + sm * PO.z)): else 1f(surf - 1)
// base

// основание

inter.hit[i].hitNorma1.set(0.0.-l): else inter.hit[i].hitNorma1.set(0,0.1):

// cap // крышка }

return true;
}

В листинге 14.8 все эти идеи собраны вместе в скелет кода, соответствующий базовому коническому цилиндру. (Как и раньше, выражения, выделенные жирным шрифтом, означают псевдокод.) Отметим,


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