Плоскость |
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)):