Плоскость

Numer Denom
1-S,

Су

1 + Sy -s
i-s,

с»

i + sx

с.

1+S, "Cr

Листинг 14.9. Метод hit() для класса Cube

bool Cube:: hit(Ray& r. Intersections inter) {
double tHit, numer. denom:

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

double tin = -100000.0. tOut - 100000.0: // plus-minus infinity // плюс-минус бесконечность

Ray genRay:

int inSurf. outSurf; // which of the six surfaces // которая из шести плоскостей

xfrmRay(genRay. invTransf. r):
for (int i - 0: i < 6: i++)
{

switch(i) // which plane of cube to test // какую плоскость куба проверять

{

case 0: numer - 1.0 - genRay.start.у:

denom - genRay.dir.y: break: case 1. case 2. case 3. case 4 similarly

// аналогично

case 5: numer = 1.0 + genRay.start.z: denom - -genRay.dir.z: break:
}

if(fabs(denom) < 0.00001) // ray is parallel // луч параллелен

{
if(numer < 0) return false:

// ray is out: // луч снаружи

else:

// ray inside, no change to tln.tOut // луч внутри, никаких изменений в tln.tOut }

else

// ray is not parallel // луч не параллелен {

tHit = numer / denom; if(denom > 0){

// exiting // выход луча

if(tHit < tOut){
// a new earlier exit

// новый, более ранний выход

tOut = tHit: outSurf - i:
}
}
else {

// denom is negative: entering // denom отрицателен: вход луча

if(tHit > tln){ // a new later entrance // новый, более поздний вход

tin - tHit: inSurf - i:

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

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

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

}
}

if(tln >= tOut) return false: // it's a miss - early out // луч проходит мимо - досрочный выход

}

// end of the for loop // конец цикпа for

int num - 0: // no positive hits yet // до сих пор нет положительных соударений

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

{
inter.hit[0].hitTime - tin:
inter.hit[0].surface - inSurf:

inter.hit[0].isEntering = 1: // is entering // луч входит

inter.hit[0].hit0bject - this:
inter.hit[0].hitPoint.set(rayPos(genRay.start. genRay.dir.tln)):
i nter.hi t[0].hi tNormal.set(cubeNormal(i nSurf)):

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