室外大场景渲染技术研究与实现 游戏地图加载(7)

时间:2012-11-08   来源:   网友评论:0   人气: 1280 作者:

  ·用包围盒、包围球做物体的视锥体剔除

  对于物体是否在视锥体区域内的判定,我们可以借助包围球或者包围盒隅1。在课题中,选用了包围球,也就是地形的外接球。

  视锥体和包围球是否相交的经典算法是检查包围球的球心到视锥体每一个平面的有向距离di,i∈[0,5],设球体半径为R,如果存在一个i∈[0,5]使得di≤一R,那么包围球是在视锥体外,如果存在一个i∈[0,5]使得di≤R,那么包围球和视锥体是相交,否则包围球是在视锥体内。代码如下:

 

 

 3.6.3地形的空间管理与视锥体剔除

  对地形的三角形面片而言,怎么判断哪些面片在视锥体中,我们不能把面片的所有顶点都计算判定一次,更好的算法是把整个场景分成一个个方便管理的区域,以每个区域为最小单位做视锥体剔除。由此空间管理算法出现,他的作用就是在空间上快速排除不需要渲染的面片。

  · 用四叉树(Quadtree)管理空间

  四叉树结构是每个父节点对应四个子节点的数据结构。我们可以把地形的三维空间近似看作XZ的二维空间,根节点表示整个正方形地形区域,其子节点分别可以表示“左上",“右上’’,“左下"和“右下”四个象限区域,那这四个子区域又可以递归划分下去,如图3.17:

  四叉树中的阴影节点就是代表了地形中的阴影区域。四叉树的叶子节点代表了地形的最小可分区域。当要查找某一个区域时只需要遍历这个完全四叉树就可以了。

  空间四叉树节点的数据结构可以描述如下:

  ·用八又树(Octree)管理空间

  八叉树是在四叉树的基础上演变而来的。四叉树只可以描述二维空间,八叉树它可以描述三维空间。如图:

  八叉树的空间管理一般用在有很多其他物体的场景中,比如建筑,树木等物体参与到游戏中来的时候,可以通过八叉树对这些物体进行统一管理,方便进行碰撞检测、视锥体剔除等。如果只是针对地形的裁剪,用四叉树足够了。

  ·用空间四叉树节点做视锥剔除

  我们从上到下,依次遍历四叉树的节点,判断节点代表的区域与视锥体的位置属于哪一种:a.与视锥体相交, b.在视锥体外,c.在视锥体内。

  如果是情况a,递归判断这个节点的四个子节点。

  如果是情况b,剔除该节点。

  如果是情况C,渲染这个节点代表的地形。

  得到可渲染节点的代码如下:

  3.6.4地形遮挡剔除,背面剔除

  ●背面剔除

  当我们在三维场景中漫游时,只能看到地形起伏的正面部分,地形的背面部分被正面部分的网格面片遮挡,因此在绘制地形网格时,这部分网格可以不绘制。背面剔除算法的目的就是将这些看不到的背面网格去除掉,实现步骤如下:

  (1)计算位于一个给定网格多边形平面上的某两个向量的矢量积,得到这个网格多边形的法向量,这两个向量可以通过多边形顶点的差分来得到。在求解网格平面的法向量时必须保证两个向量的矢量积的方向朝外,否则无法得到正确的法向量值。

  (2)计算视点观察方向与法向量之间标量积的符号,由此决定它们之间是否形成大于90。的角。视线与网格平面之间的关系如3.20图所示:

  当视线与网格平面法向量之间夹角大于90。时,表示这个多边形位于起伏地形的背面,需要剔除,否则不被剔除。

  在实际编程时,地形网格的法向量可以预先计算并存储在内存中,当漫游时,只需要直接计算视线与法向量的夹角就可以判断网格是否要被剔除。如果对每个三角形面片都去判断其是否是背面的话,计算量是很大的,这增加了CPU的负担,虽然能够最小化参与绘制的面片,但是CPU的计算很容易形成效率瓶颈,结果绘制效率有可能反而没有不剔除背面的做法高。因此,这种算法必须针对具体情况,适当选取。如果场景大多是峰峦叠嶂,这时就可以考虑使用此算法。


 

文章评论