Реализация тестирования относительно экстентов Как же формировать экстенты для каждой геометрической формы и как осуществлять тестирование относительно каждого экстента? Естественно хранить информацию об экстенте объекта внутри самого объекта, поэтому добавим несколько новых полей в класс GeomObJ (см. приложение В). Нам может понадобиться любой из четырех типов тестирования экстентов, поэтому мы добавим поля для каждого из них:
Spherelnfo genSphereExtent. worldSphereExtent: Cuboid genBoxExtent. worldBoxExtent:
В классе Spherelnfo (см. приложение В) описание сферы хранится в двух полях: поле center содержит координаты центра сферического экстента, а в поле radSq хранится квадрат радиуса этой сферы. (Там мог бы храниться сам радиус, однако в тесте относительно экстента используется только квадрат радиуса.) Класс Cuboid содержит шесть полей: left, top, right, bottom, front, back. Под этим понимается, что прямоугольный экстент простирается по оси х от left до right, по оси у от bottom до top, а по оси z от back до front.
После построения списка объектов, но до начала трассировки лучей данные для каждого объекта из списка объектов помещаются в эти поля. Затем, во время трассировки лучей, внутри каждого метода hitO вызывается некоторая комбинация подпрограмм rayHitsSphereExtentO и rayHitsBoxExtentO. Особенно прост тест луча относительно сферического экстента (см. упражнения в конце раздела); он реализуется с помощью следующей функции:
bool rayHitsSphereExtentCRay & ray. SphereInfo& sph) {
double A - dot3D(ray.dir. ray.dir): Vector3 diff - ray.start - sph.center; double В - dot3D(diff. ray.dir): double С - dot3D(diff.diff) - sph.radSq: return(B * В >" A * C):
}
В этой функции проверяется положительность дискриминанта соответствующего квадратного уравнения. Для вычисления этого дискриминанта требуется одиннадцать умножений, поэтому тест не совсем «бесплатный».
Введение в трассировку лучей
Тест rayHitsBoxExtent() является адаптацией метода hitO из класса Cube к работе с прямоугольным экстентом, описанным в структуре данных класса Cuboid. Его следует хорошо отладить для обеспечения максимальной скорости (см. упражнения).