УДАЛЕНИЕ НЕВИДИМЫХ ЧАСТЕЙ Этот метод предназначен для т.н. indoor environments - в буквальном переводе "комнатная среда"; это как бы внутренность какого-то здания. В качестве примера могут служить Doom, Quake. В этом случае сцена составляется из комнат. Комнаты связаны друг с другом какими-то проходами - дверями, окнами, чем угодно. На каждый такой проход вешается обычный полигон, называемый порталом. Для отрисовки сцены достаточно нарисовать текущую комнату вместе с тем, что из нее видно. Но то, что из нее видно, может быть видно *только* через порталы. Таким образом, для отрисовки всей сцены мы просто берем и рисуем текущую комнату, используя любые методы удаления невидимых частей (например, алгоритм художника и отброс нелицевых граней). А если в процессе отрисовки нам встречается полигон, помеченный как портал, то мы рисуем комнату, которую видно через этот портал, причем отсекаем ее уже по проекции этого портала. Как обычно, кусок кода для уяснения: // ... void drawRoom(int roomID, polygon *clipArea) { int i; for (i = 0; i < rooms[roomID].numFaces; i++) drawFace(&rooms[roomID].face[i], clipArea); } void drawFace(polygon *face, polygon *clipArea) { polygon *newClipArea; if (face->isPortal) { if (isVisible(face, clipArea) { newClipArea = clipPolygon(face, clipArea); drawRoom(face->destinationRoom, newClipArea); } } else drawClippedPolygon(face, clipArea); } // ... drawRoom(currentRoom, fullScreen); // ... Здесь функция isVisible(face, clipArea) возвращает false, если грань face и область отсечения clipArea не пересекаются; функция clipPolygon возвращает пересечение полигонов face и clipArea (то есть отсекает face в clipArea и наоборот); fullScreen - полигон размером с экран (или любую нужную область отрисовки). В природе есть Alpha 2 - готовый engine, использующий порталы и написанный на TMT Pascal, причем, что приятно, доступный в исходниках. Есть, впрочем, надежда, что найти этот engine особых проблем не составит. Осталось упомянуть, что несмотря на то, что в изложенной форме метод и требует возможности отрисовки произвольной грани, отсеченной в произвольную грань, можно обойтись и отсечением по bounding box проекции портала. |
|