发表时间:2007年8月9日 11时43分
Portal系统可以快速有效的从可见集中剔除大片的空间。它的思想非常简单-把整个世界空间分
解成离散的区域(Zone),区域之间以Portal连接。Potal以一个凸多边形来表示,通过它,与
Potal关联的两个区域可以看到彼此。Portal系统的优势在于,空间中不能通过一系列Potal看
到的部分不会被渲染。当判断世界中哪些部分是可见的,Portal系统可以让我们只处理整个数
据集的一小部分,在无形的Portal的背面的那些几何体都被忽略了。
图一显示了如何通过Portal系统进行可见性测试。
1。我们把视点定位到某个区域中,这个区域永远是可见的。
2。我们逐个检测这个区域边缘的Portal,对于每一个与视域相交的Portal,我们认为与之相连
接的另一个区域是可见的。
3。对于对于步骤2中得到的每个可见区域,检测其中的每个Portal(跳过与视域区域联系的
Portal),但是这次使用的视域是被Portal的边界缩减了的。
4。递归上述过程,直到没有可见的Portal被发现。
![]()
图一
以Portal连接的区域可以进一步被组织成树结构,区域之中的几何体也可以有自己的包围体。Portal系统提供的是大尺度的可见性测试,它的功能要由BSP或者八叉树等中尺度的可见性测试技术以及各种包围体的小尺度可见性测试来补充。
Portal剪裁
当相机从区域A通过Portal观察区域B的时候,B中的可见区域要比整个视域要小。视域的近平面和远平面可以保持不变,但是侧平面要被替换掉。
习惯上,Portal所在平面的法线是指向相机的,Portal的顶点以逆时针方向相连,如图二所示。结果是场景中的Portal都是单方向的,可以从A观察到B的Portal就不能从B观察到A。当相机位于Portal背面时,Portal永远是不可见的。要实现双向可见,每一个区域都要有一个通向对方的Portal.
为了得到新的视域,我们用当前视域的侧面来剪裁代表Portal的多边形。用一个平面剪裁多边
形就是把多边形中位于平面背面的部分去掉,只剩下位于多边形正面的部分。假设我们要剪裁
这样一个Portal,它的多边形为凸多边形,顶点分别为V1,V2...Vn,我们要用平面L剪裁它,剪
裁后的凸多边形最多有n+1个顶点。在开始剪裁之前,我们把所有的顶点分成三类:位于L正面
的;位于L背面的;位于L上的。如果没有顶点位于L正面,则Portal就是不可见的,我们不去渲
染它连接到的区域。如果没有顶点位于L背面,就不用对Portal剪裁。否则,我们遍历多边形的
每条边,对于与平面相交的边,添加新的顶点,去掉位于平面背面的顶点,如图三所示。
缩减的视域
有了被剪裁的Portal,我们要计算出包围Portal可见区域的平面,这使得我们可以用一个更精确的视域来进行可见性测试。包含视点和剪裁后Portal上两顶点Vi和Vi+1的平面可以这样计算:
![]()
如果剪裁后的Portal有n个顶点,我们用式一来计算缩减视域的n个侧平面。(当计算到Ln的时候,设Vn+1=V0)这样计算出来的侧平面,相邻的侧平面可能形成很小的夹角,这是会影响包围体测试的效率的,在这种情况下远离视域的物体仍然可能有一部分在所有平面的正面,如图四所示。为了休正这个问题,我们需要在这种情况下向视域添加一个额外的侧平面。
图四所示,在相邻的两平面(法线为N1,N2)间,一个法线为N3的平面被添加。要得到这个平面,首先通过N1+N2得到N1和N2的平均方向,然后从中间去其在N1*N2方向上的投影,以保证新的平面包含相邻平面的交线,如此:
额外添加的平面并不会改变视域的形状,它应该只被用来进行某一个区域的可见性测试,而不能是对下一级Portal进行进行剪裁。