num++: // have a hit // имеется соударение }

if(tOut > 0.00001) {
inter.hit[num].hitTime « tOut;
inter.hit[num].surface - outSurf:

inter.hit[num].isEntering » 0: // is exiting // выход луча

inter.hit[num].hit0bject - this:
i nter.hi t[num].h i tPoi nt.set(rayPos(genRay.sta rt. genRay.dir.tOut)):
inter.hit[num].hitNormal.set(cubeNormal(outSurf)):
num++:
}

inter.numHits = num: // number of hits in front of eye // количество соударений перед глазом

return (num > 0):
}

В листинге 14.9 приведена подпрограмма hit О для класса Cube, в которой реализованы все необходимые тесты. Как и в случае других подпрограмм hit(), луч преобразуется в базовые координаты объекта и все тестирование производится с базовым лучом. Затем шесть плоскостей тестируются в цикле, причем используются соответствующие значения numer и denom. Первоначально бесконечный интер14.6. Пересечение лучей с другими примитивами вал CI «усекается» до его окончательного значения (tin, tOut), если только интервал не становится пустым после какого-нибудь из тестов, что указывает на то, что луч проходит мимо куба. Поскольку важно отслеживать, какая плоскость связана с текущими значениями tin и tOut, эта информация сохраняется в переменных surin и surOut.

Когда протестированы все шесть плоскостей, мы знаем моменты времени соударения tin и tOut. Если tin положительно, то данные о соударении в момент tin записываются в inter.hit[0], данные о соударении в момент tOut записываются в inter. hit[l]. Если положительным является только tOut, то данные о его соударении загружаются в inter.hit[0].

Нормальный вектор к каждой плоскости соударения определяется с использованием вспомогательной функции cubeNormal (i ), которая возвращает внешнюю нормаль, показанную в табл. 14.1. Например, cubeNormal (0) возвращает вектор (0,1, 0), a cubeNormal (3) возвращает (-1, 0, 0) (см. упражнения в конце раздела).

Алгоритм пересечения для произвольного выпуклого полиэдра Нетрудно распространить метод hit() на любой выпуклый полиэдр. Предположим, что существует N ограничивающих плоскостей и в i-й плоскости содержится точка Bt и имеется (указывающий наружу) нормальный вектор nr. Все в методе hitO для куба остается неизменным, за исключением того, что для вычисления numer и denom теперь используется уравнение (14.17). Теперь следует вычислить два трудоемких скалярных произведения, после чего цикл for приобретет следующий вид:


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