16-17-24-25 и т. д. Рис. 10.47

Сначала достаточно нарисовать лицевые грани из текущей комнаты, затем для каждого портала, принадлежащего этой комнате, нужно нарисовать видимые сквозь портал части лицевых граней смежных комнат, используя при этом соответствующий портал как область отсечеггия.

Рассмотрим комнаты, соединенные порталами с комнатами, соседними с начальной, и нарисуем те их лицевые грани, которые видны через суперпозицию (пересечение) сразу двух порталов, ведущих в соответствующую комнату, и т. д. Если пересечение порталов - пустое множество, то данная комната из начальной точки, где находится наблюдатель, не видна.

Компьютерная графика. Полигональные модели Получившийся алгоритм реализует следующий фрагмент псевдокода: void renderScene ( const Polygon clippingPoly, Cell activeCell)

{
for each wall of activeCell
if ( wall intersects viewingFrustrum )
{
Polygon clippedWall = clipPolygon (wall, clippingPoly); drawPolygon (clippedWall);
}
for each portal of activeCell if ( portal intersects viewingFrustrum )
{
Polygon clippedPortal = clipPolygon ( portal, clippingPoly); renderScene ( clippedPortal, adjacentCell ( activeCell, portal));
}
}

Так как в большинстве случаев все многоугольники являются выпуклыми, то в результате требуется процедура отсечения одного выпуклого многоугольника по другому выпуклому многоугольнику.

10.5.3. Метод иерархических подсцен Традиционный метод порталов можно несколько видоизменить, отказавшись от условия выпуклости областей, на которые порталы разбивают сцену.

Разобьем всю сцену на ряд отдельных областей (подсцен) при помощи порталов. Каждую такую подсцену можно рассматривать как некоторый абстрактный объект со своей, присущей именно ему внутренней структурой, умеющей строить свое изображение в заданном многоугольнике картинной плоскости. И мы приходим к тому, что каждая подсцена является объектом, унаследованным от приведенного ниже абстрактного класса SubScene.

//File subscene.h

о

JM.
class SubScene : public Object {
public:
SubScene () {} virtual -SubScene () {}

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