Как может работать такая подпрограмма? На рис. 13.21 показан пример разбиения выпуклой грани плоскостью. Предположим, что грань F имеет вершины V0, V,, …, VN_а уравнение плоскости имеет вид m Р - D, где m - нормальный вектор к плоскости, указывающий на ее внешнюю сторону. Подпрограмма обходит вершины грани F, занося каждую из них, V[i], во внешний или во внутренний список вершин, в зависимости от результатов следующего теста: О V[i] лежит с внешней стороны плоскости, если hi V[i] > D {заносим вершину во внешний список}; О V[i] лежит с внутренней стороны плоскости, если m V[i] < D {заносим вершину во внутренний список}.
Если при переходе от одной вершины к другой знак выражения m V[i] - D изменяется, то соответствующее ребро продолжается по обе стороны плоскости. Таким образом, процедура находит пересече13.9. Тематические задания ниє ребра с плоскостью и заносит это ребро в оба списка. (Почему?) В примере на рис. 13.21 пентагон (пятиугольник) разбивается на пентагон и четырехугольник. Создаются два куска, и любая информация, содержавшаяся в исходной грани, копируется в оба этих куска. (Если имелись нормали в вершинах и текстурные координаты, то для вновь созданных вершин они определяются интерполяцией.)
Рис 13.21. Разбиение выпуклой грани плоскостью
Обдумайте те обобщения, которые должны быть сделаны в данной подпрограмме, если полигон будет невыпуклым.
Тематическое задание 13.3. Удаление невидимых поверхностей с использованием BSP-деревьев Уровень сложности III.
Предположим, что подпрограмма визуализации трехмерной сцены (без HSR) уже доступна. Напишите приложение, которое визуализирует грани из массива faces[] и для решения задачи удаления невидимых граней (HSR) использует BSP-дерево. Проверьте полученную программу на интересных сценах, состоящих из нескольких объектов, например из набора случайных кубов.
Обобщенный тип данных Face включает два указателя Face *1ns1de0nes и Face *outs1de0nes, которые в момент построения массива faces[] устанавливаются в NULL. Перед началом визуализации грани помещаются в BSP-дерево с помощью примерно такой подпрограммы"opengl1_917.html">⇐ Предыдущая| |Следующая ⇒