`
javahigh1
  • 浏览: 1276708 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

BSP分割算法补充——关于分割一个三角形

阅读更多
BSP分割算法补充——关于分割一个三角形
上篇文档写完后,做了一个比较复杂的场景,进行分割后发现原算法的一些问题,在此做一个补充。根据此补充,原文档将被删掉重新修改完后再发,对各位读者造成的不便,希望大家能够见谅。
在上篇文章里谈到的分割算法里有关被分割面的处理,采取的是直接将被分割面正负都放的策略。当时认为这只会对AABB的计算产生影响,所以也就堂而皇之这么写上去了。这个算法虽然简单,但是在之后的Portal处理时会面临很多困难,这一点也是我开始没有考虑到的。
在将场景变得复杂之后,这个问题就越发显现出来:在有些叶子,将会仅包括若干被分割的共享三角形,且这些三角形根本无法构成封闭空间。然而,这些叶子却被送入了Portal计算,最后出来的Portal非常诡异,甚至包括了在同一面上的若干个Portal。
用更多的思路更改Portal算法,倒不如从根本上将空间分割得更为合理,也就是采取标准的做法:将被分割三角形分割开,分割为多个三角形,分别放入相应空间。
其实这个算法很简单,一个三角形如果被一个平面分割,直观上看,有且只有两种情况:一种是在正负各生成一个三角形;另一个是在一侧有一个三角形,另一侧有两个三角形。直观上说,无论哪种情况,关键算法流程都是:
顺序访问原三角形的边,设边的第一个顶点是v0,第二个顶点是v1。
如果这个边的两个顶点均在平面一侧,则两个顶点算入平面相应一侧的新多边形。
如果有一个点在平面上,则这个点如果是这个边的第一个顶点,应该在平面两侧的新多边形中都要放。如果是第二个顶点,则需要判断第一个顶点在平面的哪一侧,并将之放入相应空间(只放一次)。可参考下图(左)来进行理解。
如果这个边被平面切割,则:首先算出来切割后的顶点vip,注意这里需要根据顶点格式分割,法线、纹理坐标均应分割。这时,同样是判断第一个顶点在平面哪一侧,根据此,把v0、vip、v1按照相应顺序组合,分别放到两侧的多边形中(在这过程中,vip会两侧都放)。
split1
这个算法有几个需要注意的地方:
首先,为了生成顶点顺序与原三角形一致的三角形(即顺时针三角形生成后仍是顺时针,逆时针三角形生成后仍是逆时针),我们必须要按照相应的顺序遍历原三角形的边:v0-v1、v1-v2、v2-v0,只有顺序访问原三角形的边才能保证生成后的三角形的顺序。如果一开始的顺序就很诡异,那么最后生成出来的三角形顺序将很难保证,代码也会很不直观。
第二,分割出来两侧的是多边形而不是三角形,这需要分开判断,如果多边形的顶点数量是3,说明这一侧生成的是一个三角形,那么就好办了,直接使用这个三角形即可。如果是4,说明是一个四边形。如果设四边形顶点顺序是v0 v1 v2 v3那么,组成这个四边形的两个三角形分别应该是v0-v1-v2和v0-v2-v3。具体的推导过程就不说了,如果觉得难于理解,可以参考下面的图,就容易明白了。其中,OV是指原始三角形的三个顶点,V是分割后的这个四边形的四个顶点,请注意顺序。
split2
第三,注意法线的切分,如果两个顶点的法线方向正好相反(当然,这是特殊情况),那么最后生成的新顶点的法线会是0!在这种情况下,法线需要单独作一下处理,我的处理是将整个面的法线赋给这个顶点,当然,您也可能有更好的方式。
第四,在分割中会生成新的顶点和面,所以最后BSP的顶点数和面数经常会超过在模型原始数据里的顶点数和面数。但现在由于没有被两个叶子共同共享的三角形了,所以,一个叶子中的三角形可以统一建一张IB,一次渲染了,速度当然会比使用共享面要快。
切分算法并不是唯一的,正如BSP分割的方式也并不唯一一样,关键还是选择对自己最容易掌握,最有利的算法。
分享到:
评论

相关推荐

    BSP空间分割简述

    - **空间分割**:BSP通过一系列的平面(称为“分割平面”)将整个三维空间分割成多个子空间。 - **二叉树结构**:分割过程形成了一个二叉树结构,其中每个节点表示一个分割平面,平面将空间分成“前面”和“后面”两...

    3D场景的BSP分割算法

    ### 3D场景的BSP分割算法 #### 引言 在三维计算机图形学领域,尤其是在游戏开发中,为了高效地处理复杂的3D环境并优化渲染过程,**Binary Space Partitioning (BSP)** 树是一种非常重要的数据结构和技术。本文旨在...

    BSP.Trees.rar_BSP树_BSP树分割_BSP空间分割_分割_分割树

    BSP树的构建通常从根节点开始,选择一个分割平面,将当前空间一分为二。这个分割平面可以是任意方向的,但通常是与坐标轴平行的,以便于简化计算。然后递归地对每个子空间重复此过程,直到所有空间都被单个对象完全...

    线的基本定义——2D的BSP树的实现

    在2D BSP树的构建过程中,首先选择一个分割线,通常是对象的边界线,然后将所有对象根据它们与该线的关系(在左边、右边或穿过线上)分配到相应的子空间。这个过程会递归地对每个子空间重复,直到所有对象都被分配到...

    算法设计与分析——分布式算法

    分布式算法是计算机科学中的一个重要分支,它涉及到在多台计算机(节点)上协同解决问题的策略。在分布式系统中,每台计算机可能具有不同的资源、能力,并且通过网络进行通信。这种算法设计的目标是提高系统的效率、...

    3D游戏中常用算法 如碰撞检测 A* 四叉树 BSP分割树 地形LOD等等

    4. **BSP(二叉空间分割)树**:BSP树是一种分层数据结构,通过不断地将空间分割成两半来组织物体。这种方法使得碰撞检测、可见性测试和渲染加速变得更为高效。BSP树在实时渲染和多玩家游戏中特别有用,因为它能快速...

    bsp_tree_demo_09_bsptree_DEMO_

    2. **分割算法**:用于找到合适的分割平面,可能基于几何中心、平均位置或特定规则。 3. **插入对象**:将新的三维对象添加到BSP树中,可能涉及递归地处理子节点。 4. **遍历与查询**:实现对树的遍历,如前序、中序...

    BSP树介绍简单概念

    }这个算法建立了一个BSP树,递归地将多边形集合分解成两个子集,每个子集都包含了一个分割平面的多边形列表。 在实际应用中,BSP树可以用于解决许多问题,例如隐藏面剔除、光线追踪、实体建模和机器人动作规划等。...

    bsp技术详解.docx

    3. **构建树结构**:每次分割都会在BSP Trees中创建一个新的节点,该节点包含分割平面的信息。对于每个子空间,继续递归构建左右子树。 ##### 如何判断凸多边形 为了确保分割后的子空间保持为凸多边形,需要能够...

    Quake3 BSP 技术简析

    BSP(Binary Space Partitioning)二进制空间分割技术是一种在计算机图形学领域中广泛使用的算法,尤其在游戏开发中非常关键。它通过一系列平面将三维空间划分为多个子区域,这些子区域可以有效地组织场景数据并进行...

    BSP(二叉空间划分树).pdf

    1. **分割平面**:在BSP树中,每个内部节点对应一个分割平面,该平面将当前空间分为两部分,通常称为前半空间和后半空间。 2. **子空间**:前半空间和后半空间都是三维空间的子集,它们可以包含其他BSP树节点或者...

    ATOM_N2800 bsp for vxworks6.9

    《ATOM_N2800 BSP for VxWorks 6.9——深入了解嵌入式系统开发》 在IT领域,特别是嵌入式系统设计中,"ATOM_N2800 bsp for vxworks6.9" 是一个关键的话题。这个主题涉及到Intel Atom N2800处理器的板级支持包...

    bsp场景管理源码

    `Node.h`代表BSP树中的节点,每个节点包含一个分割平面和两个子节点(左子空间和右子空间)。节点的划分策略直接影响到BSP树的性能。高效的BSP树构建算法可以减少渲染时的分支,提高效率。 `SkinnedMesh.h`涉及到...

    SAP web 开发技术 BSP2 处理网页的

    通过一个具体的场景案例来引导读者了解BSP扩展的实际应用场景,帮助读者理解如何将理论知识应用于实际项目中。 ##### 1.3 关于BSP应用程序 详细解释了BSP应用程序的组成部分,包括页面、页面片段等,以及它们之间的...

    bsp讲解 3D object

    1. **选择分割平面**:从当前集合中选择一个平面作为分割面。 2. **分割多边形集合**: - 将所有多边形根据与分割面的位置关系分成三类:位于分割面之前、之后或相交。 - 对于相交的多边形,将其分割成两部分,一...

    BSP vs MapReduce

    BSP模型是一种并行计算架构,它将并行计算过程划分为一系列的超步(Superstep),每个超步包括本地计算、全局通信和障碍同步三个阶段。这种模型确保了并行进程之间的同步性,使得并行任务能够在保持一致性的同时,...

    Bsp.rar_BSP_BSP原理_directx BSP tree

    BSP(Binary Space Partitioning,二进制空间分割)是一种在计算机图形学中用于组织和优化场景渲染的技术。它通过将三维空间分割成多个子空间(通常是多边形区域),来实现高效的碰撞检测、绘制排序以及游戏引擎中的...

    BSP 技 术 详 解

    BSP(Binary Space Partitioning,二进制空间分割)技术是一种用于三维图形渲染的算法,尤其在室内场景的处理中占据重要地位。自1969年由Shumacker首次提出以来,BSP技术在游戏引擎如Doom、Half-Life 2等经典游戏中...

Global site tag (gtag.js) - Google Analytics