基于八叉树的网格生成算法剖析

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

基于八叉树的网格生成算法剖析

前言

  对于网格生成这个主题,之前的网格生成系列的三篇博客文章分别介绍了MC算法,SMC算法以及Cuberille算法三种方法。同时还有一篇介绍网格生成与种子点生长算法高效结合的算法。本篇文章继续这一主题,介绍采用八叉树结构来进行网格生成的算法,这个算法并不是独立于之前介绍的算法,而是基于了SMC算法,同时也采纳了一些MC算法范畴内的思想。换句话说,就是使用八叉树对上述网格生成进行改良,从而进一步减少网格的规模。

研究动机与SMC算法的网格规模

  在SMC算法那一篇中已经指出,SMC算法是相对于MC算法的简化改良,它的一大特点就是生成网格的规模相对于MC算法大大减少。但是SMC算法也毕竟是从体元中产生三角片,三角片的大小是不会超过一个体元的范围的。而三维图像往往会有很大的尺寸这就意味着体元的数量会非常大。因而即便不采用MC算法而采用SMC算法,仍然会产生大量密集的小三角片。比如下图是Engine数据的三维图像模型,可以看出三角网格是由很多小三角片构成的。

  进一步观察这样的模型,我们发现:模型中实际上存在大量的共面三角片。了解网格型的话就会意识到这不是一个好的网格模型,因为网格模型通过小三角形片去拟合模型表面的曲面。而像上图那样的平面,完全可以使用更少的三角片去表示。比如一个具有下图左方结构的Mesh用8三角片个表示一个正方形,完全等价于右图用2个三角片表示的正方形。

8个三角片组成一个正方形 2个也能组个一样的

  因此这就引入了进一步减少网格规模的主题,这也是本文使用八叉树来简化网格生成的研究动机。无论是SMC算法还是MC算法,其生成的网格都有存在大量共面三角形的可能,而这些数量众多的小三角形也有合并成较少的大三角形的可能。尤其是SMC算法,由于其小三角形的法向和形状具有良好的可枚举性,因而在局部非常容易出现能够合并的小三角形。

  为此还必须指出,本文即将讨论的方法与针对Mesh进行网格削减的一系列算法(如之前的文章提到的顶点聚簇)并不是同一类算法。后者旨在脱离图像的概念,仅从几何意义上去对Mesh进行削减。而本文的算法是在网格生成之前,通过八叉树结构进行网格生成的优化,从而直接在Mesh被构造时就减少网格的规模。所以其本质上还是算作Mesh Generation算法而不是Mesh Processing算法。 

空间划分树的分类-均等树和BON树

  熟悉计算机的都知道树这个数据结构,尤其是二叉树。在计算机科学中,树形结构经常被用来组织和检索数据。当然树的用处不止是这些。在计算机图形学中,经常使用树来对空间进行划分,也就是把空间组织成一个层次结构。这样树的每一个节点就被赋予了空间上的意义,可以用来代表一个区域,而树的父子关系也正好能表示区域之间的包含关系。一般的,一维空间可以使用二叉树来划分,而平面和空间区域分别使用四叉树和八叉树来进行划分。

  对于一维的数据,比如一个下面的范围[0-12],可以使用二叉树划分。最终使得范围内的每一个子元素都在二叉树的节点上。这样的划分方式也比较常见,简单的对范围空间除以2即可。所以扩展到平面和空间就是对各个轴坐标范围不停的除以2,这种方式与快速排序中递归树的划分方式有一点相似(注意不是完全一样的),我们把这种方式划分的树叫做均等树。比如下图展示了对0-12范围的数据进行均等划分到底所建立的树。均等树对于[A,B]这样的范围,首先找到(A+B)/2,然后就将区域分成[A,(A+B)/2],[(A+B)/2,B]。之后再继续按相同的方式划分到不能再分为止。

均等树的划分方式

  BON树是一种不大同于上述均等树划分方式的树。从上图可以看出均等树的算法在除2的时候会遇到奇数偶数的问题。实际上在遇到奇数个元素的范围内,均等树所划分的子树实际上是不均等的,按上文说的办法,遇到奇数个元素,就会把中位数分在靠前的范围中,而靠后的范围实际上会少一个元素。这样划分到最后会出现单枝叶子节点的情况。而BON树为了保证树形,会在一开始就把最初的范围变成2的幂,从而能让划分的范围一直处于偶数个元素。例如下图展示使用BON树的分法来划分0-12的范围,首先需要找到包含这个范围的最小的2的幂,即16,然后再对这个范围进行划分,超出范围的节点不再创建。

BON树实际能表示到最近的2的幂 BON树超出部分不建立分支

  BON树的划分逻辑相比于均等树,并不更加复杂,而且相比于均等树存在一个潜在的好处。例如上图中对0-12范围所创建的均等树,可以从节点的编号上就能够获得节点的位置信息。例如9这个节点,9的二进制位为1001,正好对应这这个9的节点被BON树所分的层次信息。从图上0对应左子树,1对应右子树,这样从根节点到1001这个数就正好是右→左→左→右。这样同时提供了树节点插入的一个思路:在表示0-M范围的BON树中,若要插入A,则可以跟据A的二进制位和树的层数来确定这个A在树中的位置。同时,BON树的非叶子节点都能指代一个范围。例如9上面的父节点,就能代表100X(X为0或1)这个由两个数组成的范围,而这个父节点的父亲又能指代10XX的范围。

  以上是对两种具有不同空间划分方式的树的介绍,本文所要继续介绍的八叉树划分方法,是基于BON树的。同时在下文中会详细说明这样的树结构究竟是如何与具体的网格生成算法结合的。

 

树结构与信息的概括

  在介绍具体算法之前,还需要继续对空间划分树的一大特点进行介绍,而对这个特点的利用也是本文算法的基本思想。这个特点就是树结构具有对局部信息的概括能力。

  了解算法的人都比较清楚,像树这种具有层次的数据结构,很好的实现了对信息的概括。比如二叉排序树组织数据,相比与使用数组来说,树的每一个节点都概括了自己子树的信息,就是:左子树下面的都比自己小,右子树下面的都比自己大,这就是一种概括。那么当有数据来检索的时候,与一个节点的比较,就能判断出数组访问一个元素更多的大小关系。这就是层次结构之所以能实现高效检索的原因。而数组的每一个位置不像树那样具有概括信息的能力,访问每个位置都只能知道这一个位置的元素的信息。

  而对于本文说的空间划分树,可以通过下面的例子来说明其是如何概括信息的。例如下图中展示了一个编号为0-12的范围,这个范围分布有红绿两种颜色。也就是有的编号处是红色,有的是绿色。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值