for (int i = 0: i < N: i++)
// for each plane of the polyhedron

// для каждой плоскости полиэдра

{
numer = dot3 (mi. Bi - S);
denom - dot3 (mi. c);

if(fabs(denom) < eps) ... as before Il как и прежде ... same as before ... II все как прежде }

Алгоритм пересечения для каркасного объекта Поскольку у нас имеется богатый ассортимент каркасных объектов из главы 6, а также метод drawOpenGK ) для любой сетки (mesh), то естественно рассмотреть трассировку луча для сеток. Для разработки метода hitO для сеток используем прежний подход. Напомним, что объекты класса Mesh описываются посредством списка граней, а каждая грань представляет собой список вершин вместе с нормальным вектором в каждой вершине. Мы будем брать поочередно каждую грань сетки и рассматривать ее как ограничивающую плоскость. Назовем плоскость, связанную с каждой гранью, ее «плоскостью грани» («face plane»). Объект, для которого производится трассировка луча, представляет собой пересечение внутренних полупространств каждой из плоскостей граней объекта.

На рис. 14.13 показаны две формы (для простоты взяты двумерные) с отмеченными плоскостями граней. Объект на рис. 14.13, а - выпуклый, поэтому его плоскости граней совпадают с соответствующими ограничивающими плоскостями. Трассировка луча для такой формы будет осуществлена корректно. На рис. 14.13, б показан невыпуклый объект, причем та его часть, которая находится внутри плоскостей граней, закрашена. Именно это отобразит на дисплее трассировщик лучей! (Нарисуйте такой невыпуклый объект, который при трассировке лучей вообще будет невидимым.) Итак, данный метод для сеток будет работать только в том случае, когда сетка представляет строго выпуклый объект. Чтобы построить метод hitO для сетки, мы формируем для каждой грани поочередно переменные numer н denom. В качестве репрезентативной точки на каждой плоскости грани выбираем нулевую вершину

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

этой грани, а именно pt[face[f] .vert[0]. vertlndex], а в качестве нормали к плоскости грани принимаем нормаль, связанную с этой вершиной: norm[f ace[f ]. vert[0]. normlndex]. Тогда код примет следующий вид:


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