[PVS]算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[PVS]算法
pvs算法 
类型:转贴 | 来源:整理 | 时间: 2006-06-29
终于将HL2的vbsp,vvis看完了,随便也翻了翻q3map代码,发现两者的代码太相似了,可以看出在BSP分割,portal的查找⽅⾯在Q2中都应该已经定型了,因此两者使⽤的算法都是⼀样的。

下⾯我主要谈⼀下计算pvs的算法,因为在我翻译的那篇⽂章《bsp技术详解》中计算pvs是通过在每个portal上确定⼀些采样点然后进⾏ray cast来计算pvs的,这种⽅法的速度没有保证,⽽且处理起来也⾮常⿇烦。

⽽ID通过对每⼀个portal的polygen进⾏clip的⽅法来获取pvs,确实速度上要⽐上⼀个⽅法好上
很多。

下⾯我来对算法进⾏详细的介绍,如果你对bsp不是很熟的话需要明确⼀下⼏个概念,⼀个是cluster,对于室内场景来说它完全是由cluster组成的,简单的你可以将它认为是场景中的⼀个房间,另⼀个是portal,场景中的cluster是由portal连接为⼀个整体,你可以把它看作是房间的门或窗户。

在进⾏pvs计算的时候已经将整个场景划分为bsp tree,查找完portal并将cluster和leaf node连接起来了。

1、⾸先对所有的portal先进⾏⼀下预处理,让⼀个portal只和⼀个cluster发⽣联系,这样作的⽬的是为了获得⼀个单向的portal,也就是说portal只在⼀边可见,这样做是为了⽅便进⾏处理。

我们知道⼀个portal通常连接了两个cluster,⼀般情况下使⽤的是portal所在plane正⾯的portal,但为了达到上述⽬的,我们需要将portal分为正反两个,由于在bsp中每⼀个plane都保存正反两个,因此位于反⾯的portal只需要对ploygen颠倒⼀下顶点顺序即可。

这⾥规定⼀个portal只和位于其plane的法线⽅向上的luster发⽣联系,预处理后保存的portal数量是原来的2倍。

2、接着我们需要对portal进⾏⼀下分类处理。

通过简单的常识我们知道,由于现在每⼀个portal都是单向可见,因此只有位于portal可见⽅向(称为front⽅向)的portal才可能是可见的,我们需要对每⼀个portal都获得⼀个front portal列表并保存起来。

3、下⾯我们需要进⼀步的对每⼀个portal的front portal列表中不可见的portal进⾏剔除。

我们知道场景完全是由⼀个个portal连接起来的cluste组成的,对于⼀个portal来说位于同⼀个cluster的portal⼀定可见,⽽其他portal要想可见最基本的要求是它可以通过其他portal连接到这个cluster上,因此通过portal的连接关系我们可以从front portal列表中剔除那些和当前portal没有连接关系的portal,并保存到floodportal列表中。

4、好了经过上⾯的处理我们已经剔除了⼤部分不可见的portal,可见的portal⼀定包含在flood portal列表中,因此需要使⽤更精确的⽅法进⾏检查。

为了⽅便描述,我假定当前计算pvs的portal为A,任选和A所在的cluster ca相连的⼀个portal称为B,注意B⼀定是可见,因此B 所在的cluster cb⼀定可见,但是和cb相连的其它portal并不⼀定可见,为了检查是否可见,我们假定选取其中的⼀个portal称为C。

好了现在的问题简化为已知A和B求C是否可见,算法如下:
在A上选取⼀条边和B上的⼀个顶点构成⼀个clip plane,为了保证这是⼀个合法的clip plane我们需要做⼀下检查,为了简单化我们⾸先需要保证clip plane的法线⽅向必须指向portal A的外部,也就是说A上所有的顶点都位于clip plane的背⾯。

其次我们要保证portal B上所有的顶点都位于clip plane的正⾯,这样做可以保证当你选择A上最左边的⼀条边时必须要和B上最右边的⼀个顶点构成clip plane,当你选择A上最右边的⼀条边时必须要和B上最左边的⼀个顶点构成clip plane,将所有的clip plane合并起来实际上就获得⼀个A到B的最⼤可见frustum,只有位于frustum内部的portal才是可见的。

当建⽴起这个frustum后我们就可以使⽤它对C的polygen进⾏clip操作了,当C clip后如果没有polygen在frustum内部那么它是不可见的,否则portal C可见并将可见的polygen保存下来。

当C可见后我们需要接着对和C相连的portal进⾏检查,⽅法还是⼀样不过上⾯的portal B变成了C⽽且必须要注意,建⽴frustum使⽤C的polygen应该是clip后的polygen数据。

通过上⾯的⽅法对A的flood portal列表进⾏递归运算最终将获得⼀个真正的可见portal集合保存到vis portal列表中。

还需要指出⼀点的是建⽴clip plane的过程实际上需要两次,第⼀次是从A到B,第⼆次是从B到A,这样做的原因是并不是所有的极值点都位于B上的,也可能位于A上因此需要进⾏两次。

相关文档
最新文档