- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二叉空间分割 BSP 树
二叉空间分割 BSP 树
二叉空间分割(BSP)树
BSP(Binary Space Partition)表示二叉空间分割。使用这种方法可以使我们在运行时使用一个预先计算好的树来得到多边形从后向前的列表,它的复杂度为。它是由Fuch和Kedem在1980年首先提出的。它的基本思想是基于这样一个事实,任何平面都可以将空间分割成两个半空间。所有位于这个平面的一侧的点定义了一个半空间,位于另一侧的点定义了另一个半空间。此外,如果我们在任何半空间中有一个平面,它会进一步将此半空间分割为更小的两个子空间。我们可以使用多边形列表将这一过程一直进行下去,将子空间分割得越来越小,直到构造成一个二叉树。在这个树中,一个进行分割的多边形被存储在树的节点,所有位于子空间中的多边形都在相应的子树上。当然,这一规则使用于树中每一个节点。
我们来看一下图7.21种的多边形。为了简单起见,我们选择一个这样一个平面投影,在它上面,所有多边形都能映射为直线段。让我们由多边形B开始构造一个BSP树。(见图7.21)
图7.21一个二叉空间分割
多边形B所在的平面将空间分割为两个部分,使得多边形D和E位于同一个半空间中,多边形C在另一个半空间中。在这个例子中,多边形A穿越了两个半空间,这样,它就不能十分明确的被分配到任何一个半空间中。但是,如果我们将这个多边形从它与分割平面相交的地方分为两个部分一个命名为,另一个命名为,这样,就和D、E在同一个半空间中,和C在同一个半空间中。下图表述了这一过程。
图7.22建立BSP树的一个阶段
我们现在已经将问题分成了两个子问题。我们可以在子树中再次使用上述算法。例如,我们在左边子树中选择E作为分割多边形,在右边子树中选择作为分割多边形。这样,我们将建立下面的结构树。(见图7.23)
图7.23建立BSP树
必须注意,任何给定的BSP树都不是唯一的。我们可以对同样的多边形找到多个有效的二叉分割。依靠我们选择来进行分割的多边形的顺序,可以得到不同的树。例如,在图7.24中,我们可以看到另一个树,它也建立在前面我们讨论的多边形上。
图7.24另一种结构
尽管所有适合这种算法的正确的树都可以用来得到多边形从后向前的顺序,但是总有一些要比其他一些更加有效。我们首先检查树遍历算法,然后检查确认特殊树结构的原因。
我们考虑一个包含了一系列多边形的场景,场景带有一个预先计算好的BSP树和一个位于场景中某个位置的观察者。(见图7.25)
图7.25用BSP树来得到从后向前的顺序
我们检查观察者的位置和位于树顶部的多边形之间的关系。很明显,当这个多边形将空间分割为两个部分时,观察者必须位于其中的一个半空间中。当然,位于同一半空间中的多边形要比另一半空间中的多边形离观察者更近。基于这样的事实,如果我们首先将较远处半空间中的多边形放置在最终的列表中,然后放置根多边形,再放置与观察者在同一半空间中的多边形,这样就很容易得到多边形从后向前的顺序了。我们对每一个子树都重复同样的过程,在每一个级别中选择相应的顺序,最终,就会得到正确的多边型的顺序。
这一算法的一个优点就是无论观察者位于场景中的什么位置,无论观察者的朝向如何,它都可以很好的进行工作。例如,在图7.25(a)中产生的列表就与(b)中产生的不同。但是他们对于各自的情况都是正确的。这样,如果我们预先为一个多边形模型计算一个BSP树,那么在运行时,我们只需要根据观察者的位置调用这个树,执行树遍历过程,就可以产生用于隐面消除的画家算法所需的从后向前的多边形顺序。
在这个算法中,在树的每一个节点处所作的判定,都依赖于观察者位于该节点多边形所产生的哪一个半空间中。在第五章中,分析平面方程式时我们已经遇到过要使用这种计算的情况。利用我们所讨论过的事实,我们可以看到,如果将观察者位置的坐标代入给定多边形的平面方程式中,结果数值的符号如果是正号,就表示观察者位于该多边形的法向量所指向的半空间中,负号表示位于另一个半空间中,0值表示他位于这个多边形所在的平面上。最后一种情况,对于遍历整个BSP树的意图来说,意味着半空间在屏幕上的投影不相交,并且我们可以在这一阶段的遍历过程中选择任何子树的顺序。
相同的计算也要在预先计算一个BSP树时使用到。我们需要决定不同的多边形应该被放置在哪个子树中。从可实现性的观点出发,预先计算一个BSP树的过程可以被描述成下面的形式:对多边形集合,我们选择一个多边形。进一步计算该多边形的平面方程式。对剩余的多边形,我们用所说的方程式检查它们的所有顶点。如果所有顶点都是负值,那么多边形就放置在一个子树中;如果都是正值,那么多边形就放置在另一个子树中;如果结果有正有负,那么多边形就被分为两部分,分别放置在两个子树中。一旦我们将所有多边形分配到了正确的半空间中,我们就可以对子树进一步调用同样的方
原创力文档


文档评论(0)