Marching Cube 算法综述
- 格式:doc
- 大小:827.00 KB
- 文档页数:9
vtkmarchingcubes 原理vtkMarchingCubes是一种基于Marching Cubes算法的体数据表面重建方法,用于将离散的三维体数据转换为连续的三维表面模型。
Marching Cubes算法是一种将等值面从三维体数据中提取出来的方法,它将三维体数据划分为一系列的小立方体单元,并根据每个小立方体单元内部的数值情况来确定等值面在该单元内的位置和形状。
vtkMarchingCubes的原理如下:
1. 将三维体数据划分为一系列的小立方体单元。
每个小立方体单元由八个顶点和对应的标量值组成。
2. 对于每个小立方体单元,根据其八个顶点的标量值与等值面的关系,确定等值面在该单元内的位置和形状。
3. 根据等值面在每个小立方体单元内的位置和形状,构建三角面片。
对于每个小立方体单元,根据等值面与六个面的交点,生成相应的三角面片。
4. 将所有的三角面片连接在一起,构建出连续的三维表面模型。
vtkMarchingCubes算法可以应用于各种三维体数据的表面重建,例如医学图像中的器官表面提取、地质数据中的地质构造表面提取等。
它在可视化、仿真、建模等领域有广泛的应用。
第19卷第7期2007年7月计算机辅助设计与图形学学报JOURNAL OF COMPU TER 2AIDED DESIGN &COMPU TER GRAPHICSVol 119,No 17J uly ,2007收稿日期:2007-05-281基金项目:国家自然科学基金重点项目(60633030,60533060);国家自然科学基金(60573180)1孙 伟,男,1981年生,硕士研究生,主要研究方向为CA G D 、信息可视化1张彩明,男,1955年生,博士,教授,博士生导师,CCF 高级会员,主要研究方向为CA G D 、信息可视化1杨兴强,男,1964年生,博士,副教授,CCF 高级会员,主要研究方向为CA G D 、信息可视化1Marching Cubes 算法研究现状孙 伟1) 张彩明1,2) 杨兴强1)1)(山东大学计算机科学与技术学院 济南 250061)2)(山东经济学院计算机科学与技术系 济南 250014)(sun wei @mail 1sdu 1edu 1cn )摘要 对现有的Marching Cubes 改进算法从拓扑结构二义性、提高逼近精度、算法的时间和空间效率3个方面进行综述,对每一类改进算法进行新的分类,并对各类算法的实验结果进行比较1关键词 Marching Cubes ;等值面抽取;拓扑二义性;精度;效率中图法分类号 TP39114R esearch R evie w on Marching CubesSun Wei 1) Zhang Caiming 1,2) Yang Xingqiang 1)1)(School of Com puter Science and Technology ,S handong U niversity ,Ji ’nan 250061)2)(School of Com puter Science and Technology ,S handong Economic U niversity ,Ji ’nan 250014)Abstract We review the Marching Cubes algorithms and discuss its recent advances at the aspects of topology ,accuracy ,time and space complexity 1New classifications of these improvement methods are pro 2posed and their results are compared 1K ey w ords marching cubes ;isosurface approximation ;topology ambiguity ;accuracy ;efficiency 等值面技术在科学计算可视化中应用很广,许多标量场中的可视化问题都可归纳为等值面的抽取和绘制,如医学图像中的三维重建,有限元计算中的标量场分析,分子化学中的分子表面显示,地质中矿藏分布的构造等1在散乱点的曲面重构和关键帧动画中,也常常提取零等值面作为散乱点数据的重构曲面和中间帧1近年来,等值面逼近问题得到了极为广泛的关注,并取得了许多重要的成果,其中Lorenson 等[1]于1987年提出的Marching Cubes (MC )算法是基于体元的一种典型的面绘制算法1MC 算法作为一种构造等值面的算法,使用三角面片作为中间几何图元的基本表达元素1由于目前的显卡都可以对三角面片进行硬件加速的绘制,并且MC 算法本身原理简单、容易实现,因此得到了广泛的应用,被认为是目前最流行的等值面抽取算法之一,对科学计算可视化领域的研究产生了深远的影响1然而,MC 算法也存在一些不足之处,主要集中在提取曲面正确的拓扑结构[2211]、提高绘制精度[12213]、减少存储空间和提高处理速度[14221]等1到目前为止,在科学计算可视化领域的著名杂志和会议上,还经常有针对MC 算法的改进算法1对于可视化算法中面绘制的综合研究中,Van G elder 等[5]对等值面抽取过程中产生的拓扑结构问题进行了研究,Brodlie 等[21]对体数据可视化的各种算法及改进算法进行综述;但对于面绘制的经典算法MC 及其改进算法缺乏综合的分析讨论,没有形成在实际应用中被广泛认可的一个有效算法1MC 算法提出以来,根据不同领域的数据特征,其改进算法的种类也大相径庭1本文对于已有的MC 改进算法,从提取曲面正确的拓扑结构、提高绘制精度、减少存储空间和提高处理速度三个大的方面,分类比较相应的改进算法结果,并进行讨论,为综合使用各种改进算法对体数据做面绘制和相应的处理,得到理想的处理效果提供了很好的帮助11 MC算法简介MC算法[1]将体元的每个顶点进行标记并根据不同的顶点状态组合进行分类,通过线性插值求得立方体各条边上的等值点,然后用一系列的三角形拟合出该立方体中的等值面1MC算法以扫描线方式逐个处理数据场中的每一立方体体素,求出每一个体素内包含的等值面,由此生成整个数据场的等值面,因而简单、高效1但该算法在构造等值面的过程中太依赖于直观的构造;构建体元状态模型时,对于对称、旋转等情况的处理缺乏全面考虑;忽视了立方体内部可能存在的环状结构和存在的临界点(等值面发生变化的点),直接使用求得的边界等值点简单连接成三角片1MC算法存在以下缺点:1)不能保证生成连续曲面,即产生的逼近等值面片的拓扑结构与采样数据场的拓扑结构不一致;2)直接连接边上插值得到的等值点组成逼近等值面的多边形,然后三角化得到等值面,当要求的逼近精度较高时,很难达到逼近精度的要求,特别是对于采样比较稀疏的数据场更是如此;3)用大量的三角片来逼近等值面,对这些三角片的顶点和顶点连通关系进行编码,需要非常大的存储空间和传输带宽,同时,生成和处理大量的三角片往往会耗费较多的执行时间,大大地限制了算法在交互应用中的使用1针对MC算法存在的问题,近年来,许多研究人员对其进行改进,其中,主要是拓扑结构方面的改进1这些改进算法大都基于立方体内部的曲面呈三线性变化的性质进行改进,其中,Nielson等[3]使用渐近线算法很好地解决了面上的二义性;对于立方体内部存在的拓扑二义性,Nielson[10]和梁秀霞等[11]提出的解决办法有着很好的代表性1对于稀疏数据场中表示精度不高的情况,Lopes等[12213]采用增加采样点的算法来提高表示精度,成效比较显著;但该算法即使对最简单的模型也要加入很多采样点进行处理,Cignoni等[9]提出渐进网格抽取的算法,较好地解决了这个问题1针对MC算法效率进行改进的算法众多,它们主要从时间[14]和空间[15217]效率上进行改进,多分辨率算法[18]也因为其能同时兼顾算法的时间和空间效率,应用十分广泛1本文针对上述各类缺陷的改进算法进行讨论分析12 消除生成等值面的二义性211 面二义性问题Durst[2]通过分析基本体元状态模型,提出在立方体的一个面上,如果位于等值面内和在等值面外的顶点分别分布在对角线的两端,就会有2种连接方式;当相邻的2个立方体在公共面上采取的连接不同时,就会导致孔洞的生成1如何从2种以上的连接模式中选择正确的模式是解决二义性的关键1解决这种面上二义性的算法主要有2类:四面体剖分算法和双曲线渐近线算法121111 四面体剖分消除二义性使用四面体剖分算法解决二义性时,假设在四面体的边上数据场呈线性变化,由于四面体的每个面是三角形,因此生成的等值面片的连接方式是唯一的1四面体剖分算法能够解决拓扑二义性,有比较高的逼近精度,但生成三角片的数量明显增多1大量的三角片导致计算量增加,并且在立方体内的等值面没有二义性时,立方体也会被剖分处理,大大增加了算法的时间耗费1此外,Cignoni等[9]提出,四面体剖分算法中等值面的构造与剖分方式有关,相邻立方体单元剖分不一致会导致裂缝的产生,导致形成的逼近等值面可能和真实等值面有不同的拓扑结构,因此它未得到广泛的应用121112 双曲线渐近线算法消除二义性Nielson提出使用双曲线渐近线算法来解决面上的二义性1等值面与立方体某一面的交线是一组双曲线或者其中的一支1当2支双曲线都与立方体表面相交时,就会产生二义性1在出现二义性的情况中,2支双曲线将立方体表面分成3个区域,可以证明,双曲线渐近线的交点总是和其中一对交点落在同一个区域1比较渐近线交点和等值面的标量值,如果渐近线交点的标量值大于等值面的标量值,则标量值大于等值面标量值的一对顶点与该交点落在同一个区域;反之,另一对顶点与渐近线交点落在同一区域1212 消除立方体内二义性Nielson等虽然对立方体面上存在的二义性进行了分析,但对三线性插值函数在立方体内部的形状没有给予足够的重视1Natarajan[4]对三线性插值函数等值面在立方体内部的具体形状进行详细研究,进一步发现:即使体元中不存在二义性面,体元849计算机辅助设计与图形学学报2007年内部也可能存在不同拓扑结构的等值面,指出了体二义性存在的可能性,并提供了最初的解决办法1随后,通过对三线性插值等值面拓扑结构的深入研究,人们提出了许多体内拓扑二义性的解决办法1 21211 利用鞍点解决体二义性Natarajan引入了面鞍点和体鞍点的概念,并利用这2类鞍点来解决体二义性问题1其中,面鞍点为双曲线渐近线算法中渐近线的交点,体鞍点为在三维空间中面鞍点的扩展1得到面鞍点和体鞍点后,根据以下规则来解决二义性:如果面上的一对对角线顶点与面鞍点有相同的符号(同时大于或者同时小于等值面值),则这一对顶点在同一个区域内;否则另外一对定点在同一区域1如果体对角线的一对顶点与体鞍点有相同的符号,则连通这一对顶点,构成一个管状曲面,否则不连通这对顶点,形成2个分离的三角片1Van G elder等[5]发现:为保证多边形逼近等值面C0连续,体数据内部的逼近多边形的边只能由2个多边形共享,体数据边缘的边只能出现在一个逼近多边形中;并进一步指出,如果三角片位于立方体的面上,在该立方体中就会有2个三角形共享同一条边,同时在相邻的立方体中也会有至少一个三角形共享这条边,这将导致生成的三角片逼近曲面不连续1虽然Natarajan解决了立方体中存在的拓扑二义性,但由于算法中没有解决三角片落在立方体面上的问题,导致了生成的三角片逼近曲面不能保证C0连续;同时,也没有明确提出对曲面如何进行三角化1Cignoni[9]以Natarajan的研究为基础,基于面鞍点和体鞍点对MC算法的基本体元状态进行进一步分类,构造了扩展查找表,对各种情况都给出了三角化算法1对于逼近等值面存在不连续性的问题,特别是当有三角片在立方体面上存在时,该算法通过对立方体对角线顶点插值来加入一个体对角线上的点,有效地解决了不连续的问题1但由于数据场在体对角线上是三线性变化的,因此引入的内部点可能不在原等值面上;此外,它没有很好地解决单个复杂曲面片和存在2个体鞍点的情况121212 利用插值函数空间连续性消除体二义性Chernyaev[7]利用双曲线渐近线算法解决面上的二义性,并提出2种新算法来解决拓扑二义性1第一种算法以下面的结论为基础:在立方体上的一个三线性插值函数,它在一条平行于边的直线上是线性变化的1该算法通过比较有拓扑二义性的立方体相对的平面上的渐近线来消除二义性1如果2个符号相同的点在立方体内部是连通的,那么其一个面上的渐近线投影到其相对的另一个面上时,2段渐近线必然相交;反之,如果2段渐近线的投影不相交,那么这2个顶点是分离的1第二种算法基于在平行于立方体面的任意平面上,三线性插值函数都是双线性变化的1在立方体中,如果有2个顶点是在内部连通而在面上不是连通的,那么必然存在一个平行于立方体面的平面,平面与立方体的交点形成的面是一个二义性面,在该二义性面中,与立方体中连通的顶点符号相同的2个顶点连通1通过判断与立方体平行的平面的连通关系,可以有效地解决立方体内部的拓扑二义性问题1对于MC算法的15种基本情况,Chernyaev首先根据是否含有二义性面进行细分;对其中存在内部拓扑二义性的情况再进一步加以细分;最后明确给出了有33种情况的拓扑分类和对应的三角化算法1对于立方体内部需要加入顶点的情况,算法选择其他顶点的平均值作为新加入的点,其中选择的点不一定位于等值面上;同时,该算法也没有解决三角片位于立方体面上,从而导致生成逼近等值面片的不连续问题1Matveyev[6]提出了一种解决二义性的算法,在解决面上二义性的同时,能比较好地解决体素内部的拓扑二义性问题1该算法首先把面投影到二维局部坐标系中,将组成面的边和等值面的交点按照任一个坐标分量进行排序,将排序后的交点序列两两连接,通过分析三线性插值函数的特征,可以证明得到的连接方式是正确的1将这种算法应用到立方体内部,利用三线性插值函数在立方体对角线上是三次变化的,可以计算等值面和立方体对角线的交点,得到相应的等值面在立方体内部的点1该算法将得到的所有点和其连接表示成图的形式,图的顶点用交点表示,交点之间的连线当作图的弧;然后使用图论的算法得到逼近等值面片1这种算法虽然可以同时解决面上的二义性和立方体内部拓扑二义性,但计算量比较大,生成的三角片也明显增多121213 基于临界点的体二义性解决办法由Morse理论可知,临界点是曲面拓扑结构发生变化的点1Nielson[10]和梁秀霞等[11]分别求出了三线性插值函数的临界点1Nielson利用临界点,提出3层分类的算法,得到了较好的分类模型,但算法中仍然引进了体鞍点,并根据体鞍点的符号来判定是正区域还是负区域连通在一起;此外,该算法没有很好地解决三角片落在立方体面上从而导致不连续9497期孙 伟等:Marching Cubes算法研究现状性的问题1文献[11]对Nielson 算法进行了进一步的完善,利用临界点在立方体内的个数和立方体的顶点状态组合来确定立方体元的分类情况,不需引入体鞍点就可以很好地解决复杂面片的情况1由于算法中求出的临界点是位于等值面上的,因此当需要利用立方体内增加点来解决不连续问题时,可以直接利用临界点进行三角化处理1这样在解决拓扑结构问题的基础上,还能够得到逼近精度比较高的逼近等值面1图1所示为使用文献[10211]算法在简单光照明模型下得到的逼近等值面效果对比图,其中椭圆曲线标注的区域为用2种算法逼近的三角片等值面上拓扑结构不同的区域1可以看出,由于文献[11]考虑了等值面在立方体内部的变化、将等值面位于体元内部的临界点作为等值点、与体元边界上的等值点一起进行三角化,得到的结果拓扑结构更好1图1 简单光照明模型下复杂片状曲面逼近结果比较21214 基于拓扑复杂度的二义性解决办法文献[11]中引入了拓扑复杂度的定义,对于三线性插值函数定义的等值面,拓扑复杂度为曲面上临界点的数目1相应地,体元内部曲面的拓扑复杂度为体元内部曲面上临界点的数目1对于拓扑结构不存在二义性的体元模型,仍然采取原MC 算法中的分类;对于复杂拓扑结构的体元模型,采用顶点状态组合与拓扑复杂度相结合的算法进行分类1确定了体元内部曲面的分类,就可以计算每一种体元拓扑模型的逼近等值面,并预先存储在查找表中1临界点是反映三维标量场中的等值面拓扑结构的关键点,如果提取的采样点中不包括临界点,则无法保证得到拓扑结构正确的逼近等值面1对体元内部曲面进行逼近的基本算法是,将体元内部曲面的临界点和边界等值点一起进行三角化,因此对于结构比较复杂的曲面和内部含有管状结构的曲面,其具有比较好的逼近结果13 提高逼近精度在利用MC 算法求逼近等值面的过程中,使用线性插值计算出等值面与立方体边的交点之后,采用简单连接的方式形成逼近等值面的边界多边形,然后进行三角化,并得到最终的逼近等值面片1当对目标数据场的采样密度比较大、立方体大小相对显示尺度很小时,这种简单构造三角片的方式已经足以满足实际使用的精度要求1如果要对局部数据放大观察或者采样数据本身的分辨率很低,就需要对这种简单构造方式进行改进,以达到较高的逼近精度要求1311 增加内部点1)肩点的概念可以证明:对于立方体的一个面,等值面与该面的交点是双曲线1面上的肩点定义为在立方体面的双曲线上,且其切线方向与双曲线端点的连线平行12)增加肩点提高精度Lopes 等[12213]应用肩点来提高等值面的精度1在原来的算法中,逼近等值面片的边界多边形是通过连接等值面与立方体的交点形成的,边界多边形的边都在立方体的面上1对面上的边通过加入肩点进行扩展,可以提高逼近等值面在面上的表示精度1Lopes 定义了2种类型的点对提高立方体内部的精度进行辅助处理:1)双肩点1可以看作是面上的肩点在立方体内的扩展;2)临界点1等值面开始发生变形的点1通过加入这2类点进行三角化处理后,正确地表示了逼近等值面在立方体内部拓扑结构的同时大大地提高了逼近精度1312 使用渐近网格法Lopes 算法通过在立方体内部增加点的方式,来提高逼近等值面在立方体内部的表示精度1增加的点越少,生成的三角面片就越少1Cignoni 基于这种思想提出渐进网格抽取的算法,该算法不断地将逼近等值面网格进行细分,一直到满足需要的精度为止,则在保证精度的同时,也可以保证算法不生成太多的三角片14 提高效率MC 算法在数据场密度较高的情况下具有较好的绘制效果,但往往生成过多的三角片,需要较大的存储空间和传输带宽;并且过多三角片需要较长的59计算机辅助设计与图形学学报2007年时间进行处理,以至于无法进行实时绘制,这些因素都使MC算法的应用受到了限制1因此需要改进算法来减少对存储空间的需要和对时间的耗费1411 缩短处理时间通常情况下,体数据场中与等值面相交的立方体仅仅占立方体总数的一小部分,但在抽取等值面的过程中,MC算法需要遍历所有的立方体单元来生成所需要的逼近等值面片1因此有必要建立新的数据结构来有效地查找与等值面相交的立方体,以减少对与等值面不相交的立方体的访问1八叉树算法[14]是一种常用的算法,该算法以八叉树形式组织体数据场,当等值面与八叉树的节点相交时,细分该节点成八叉树1判断子节点与等值面的相交情况,如果相交,则进一步细分,直到体素级为止1当等值面与八叉树节点不相交时,可以跳过该不相交的立方体和对应的子节点立方体1另一种应用比较广泛的算法是用逐渐增长的方式抽取等值面片1首先用预处理算法选中一部分立方体作为种子立方体,然后使用区域搜索算法遍历与种子立方体相交的立方体,直至找出所有的等值面1为生成完整的等值面,预处理过程中产生的种子立方体集合中,必须包含所有独立的等值面片的一部分1随着计算机性能的提高,使很多复杂应用的并行处理成为可能1研究发现,MC算法最为耗时的操作有2步:1)计算等值面和立方体边界的交点;2)对每一种情况,求与此等价的查找表中的类1因此,将这2步操作进行矢量并行化处理,可以提高整体的运行效率,即使对处理数据量较大的情况,它也具有较快的速度,满足实时操作的需求1412 减少存储冗余为减少MC算法需要的存储空间,一种算法是对数据进行压缩处理,但这往往是以丢失图像细节为代价的;另一种算法是减少生成三角片的数量, Decimation算法[15]满足这个要求,而且优化比很高(能达到10%);但它是一个最优化过程,执行时间很长,即使是对1万个三角片进行优化,也需要分钟数量级的执行时间1另外,为了建立边表结构,该算法需要很大的内存开销1Montani等[17]将体数据场看作离散的数据空间,在处理每一个立方体的过程中,直接使用立方体边的中点来代替等值面与立方体边的交点1在这种假设下,抽取出来的等值面仅仅有几种方式的三角片组成,从而可以进一步合并成更大的平面多边形片1这样,在增加计算量不大的情况下,该算法有效地减少了生成的面片的数量1Shu等[16]发现MC算法生成大量冗余、共面的三角片,利用这个性质,提出自适应MC算法1该算法对一个大立方体(立方体素集合)用MC算法进行等值面抽取,如果得到的逼近等值面与原始等值面的误差在一定的界限内,则可以用这个逼近来表示等值面;否则,将该大立方体分成8个小立方体,重复以上过程,直至达到误差界限或者小立方体为体素为止1当等值面形状比较平坦、变化比较小时,可以使用较少的大三角片表示;对等值面的细节处,则用相对较多的小三角片表示等值面1根据等值面的形状来调节三角片的大小,大大地减少了生成三角片的数量,生成逼近等值面的质量与原来算法相比也没有明显的不同1413 多分辨率算法对大规模数据集的交互式研究,多分辨率算法逐渐成为一种很重要的工具1多分辨率算法允许用户对整个数据场粗糙表示进行观察,也可以对局部进行放大观察,或者对感兴趣的区域进行细微的高分辨率观察1多分辨率算法主要有2种:1)在满足精度要求的情况下,尽量减少生成的三角片数,以减少处理时间和存储空间;2)为了使抽取的等值面可以与用户进行交互,限定了抽取等值面的处理时间,在规定的时间界限内尽量提高等值面的逼近精度1薛强等[18]提出一种体数据的等值面多分辨率算法Marching Boxes(MB),该算法将整个体数据场看成是一个Box,把Box分成Box1和Box2,分别用MC算法抽取出其中的等值面;然后按一定的规则将该算法产生的面片加以归并,在不同的应用中指定不同的表示精度限制,通过进行不同程度的等值面归并来减少三角片数量1该算法在有效地减少三角片数目的同时,还有选择地保留了图像的细节特征1Pascucci等[20]提出了一种基于交互性的多分辨率算法1目前,很多多分辨率算法构造和表示等值面耗费时间长,不能保证不断变化的等值面的交互显示,并且不能控制生成等值面的各个不同层次的几何形状与原始数据一致1Pascucci算法在给定交互式应用时间需求的情况下,使用渐进算法尽量构造有较高表示精度的等值面,再使用一个递归的算法进行等值面的光滑处理1该算法在交互应用的前提下,也能够有效地保证在每个等值面细节层次上使逼近等值面保持原始数据场的细节特征11597期孙 伟等:Marching Cubes算法研究现状。
三维重建技术(面显示与体显示)介绍田捷中国科学院自动化研究所 三维医学图像技术的意义♦改变传统的阅片方式(两维到三维)♦给医生提供真实感三维图形♦任意角度观察♦辅助医生临床诊断三维重建的过程♦输入:由CT、MR等设备扫描得到的一系列的两维切片数据♦输出:组织(器官)的三维形状三维重建的分类♦面显示(Surface Rendering)♦体显示(Volume Rendering)三维重建的分类——面显示♦只提取感兴趣的某一种物质(如骨骼)♦计算速度快,显示清晰♦一般用密集的三角网格来表达♦应用广泛(图形引导手术、虚拟内窥镜等)♦可以实现多层的面显示,以观察整体效果面显示的例子(骨骼)面显示的例子(皮肤)多层面显示的例子三维重建的分类——体显示体显示的例子♦将切片中所有的物质(皮肤、骨骼、肌肉等)集中在一幅图中显示♦可看出整体效果♦计算速度慢,显示容易模糊体显示的例子面显示算法简介♦Marching Cubes算法是面显示算法中的经典算法,它也被称为“等值面提取”(Isosurface Extraction)♦本质是将一系列两维的切片数据看做是一个三维的数据场,从中将具有某种域值的物质抽取出来,以某种拓扑形式连接成三角面片Marching Cubes算法描述♦切片数据可以看做是一些网格点组成的,这些点代表了密度值Marching Cubes算法描述♦每次读出两张切片,形成一层(Layer)Marching Cubes算法描述♦两张切片上下相对应的八个点构成一个Cube,也叫Cell,Voxel等Marching Cubes算法描述♦对一个Cube的8个顶点分别进行分类:–顶点密度值<域值,Outside(1)–顶点密度值≥域值,Inside (0)Marching Cubes算法描述♦由此索引值去查询一个长度为256的查找表,得到三角片三个顶点所在的边号Marching Cubes算法描述♦得到边号以后,在此条边上进行线性插值运算得到三角片顶点的坐标Marching Cubes算法描述♦法向量的计算也同样采用线性插值,首先使用中心差异法计算两个顶点的梯度值,然后由这两个梯度值插值得到三角片顶点的法向量Marching Cubes算法描述♦算法的难点:查找表的构造–因为一个Cube有8个顶点,每个顶点有Inside和Outside两种状态,所以一个Cube里头三角片的分布总共可能有28=256种组合–如果手工去造表的话,不仅容易出错,而且工作量也太大–反映了图形学算法的特点:容易理解,但是细节太烦琐Marching Cubes算法描述♦Cube具有旋转(Rotation)对称性,旋转不影响等值面的拓扑结构♦另外,所有的Inside变为Outside,同时所有的Outside变为Inside,则等值面的连接方式也不会改变(Invertion对称)Dividing Cubes算法简介♦由于Marching Cubes算法得到的三角面片数量相当巨大,并且很多三角片投影到屏幕上以后小于一个像素的大小,因此Marching Cubes的作者又开发了一个更简化的算法:Dividing Cubes♦绘制的基本元素由三角片变成了点,无需考虑拓扑结构♦速度更快,尤其适合于医学图形领域♦目前新兴的基于点的绘制(Points Based Rendering)为这一算法赋予了新的意义Dividing Cubes算法描述♦同Marching Cubes算法一样,处理的基本对象都是一个Cube(体现了分而治之的策略)Dividing Cubes算法描述♦对每个Cube进行分类–所有的八个顶点都是Inside则为Interior Cube –所有的八个顶点都是Outside则为ExteriorCube–其它则为Surface CubeDividing Cubes算法描述♦将Surface Cube在空间上分割为与最终图像解析度相同的Sub Cube–如果数据集的规模为256×256×128,而最终显示的窗口的大小为512×512,则在x、y 方向上分割一次,在z方向上分割两次–新的Sub Cube的顶点密度值由三线性插值得到–对于每个Sub Cube,继续进行上一步骤(分类)Dividing Cubes算法描述♦对于最终得到的Surface Cube,计算它的中心点的坐标、法向量(由梯度得到)♦最终形成一个点集,每个点都具有法向量体显示算法简介♦主要是研究光线在带颜色的、半透明的材质中传播的理论。
Marching Cubes 算法是一种用于从体数据中提取等值表面的三维重建方法。
该算法在可视化和医学图像处理等领域中广泛应用。
以下是一个使用VTK(Visualization Toolkit)中的Marching Cubes算法的简单案例。
在这个案例中,我们假设你已经安装了VTK库,并且你的项目中包含了VTK的相关依赖。
pythonimport vtkfrom vtk.util.colors import tomato# 创建一个VTK 读取器,加载体数据文件reader = vtk.vtkDICOMImageReader()reader.SetDirectoryName("path/to/your/dicom/data") # 替换为实际的DICOM数据目录reader.Update()# 创建Marching Cubes算法marching_cubes = vtk.vtkMarchingCubes()marching_cubes.SetInputConnection(reader.GetOutputPort())marching_cubes.SetValue(0, 400) # 设置等值面的数值,需要根据实际数据调整# 创建Mapper和Actor用于显示等值面mapper = vtk.vtkPolyDataMapper()mapper.SetInputConnection(marching_cubes.GetOutputP ort())actor = vtk.vtkActor()actor.SetMapper(mapper)actor.GetProperty().SetColor(tomato) # 设置演示的颜色# 创建渲染器和渲染窗口renderer = vtk.vtkRenderer()renderer.SetBackground(1, 1, 1) # 设置背景颜色render_window = vtk.vtkRenderWindow()render_window.SetWindowName("Marching Cubes Example")render_window.SetSize(800, 600)render_window.AddRenderer(renderer)# 创建交互器interactor = vtk.vtkRenderWindowInteractor()interactor.SetRenderWindow(render_window)# 添加Actor到渲染器renderer.AddActor(actor)# 设置相机位置renderer.GetActiveCamera().Azimuth(30)renderer.GetActiveCamera().Elevation(30)renderer.ResetCamera()# 渲染并启动交互render_window.Render()interactor.Start()在这个案例中,我们使用了VTK中的`vtkMarchingCubes`算法来提取等值面。
threejs中marchingcubes的实现原理Three.js是一款强大的WebGL库,它提供了丰富的API和工具,使得开发者可以轻松地创建和展示3D图形。
在Three.js中,MarchingCubes算法是一种常用的算法,用于从体素数据中提取出三维物体。
本文将详细介绍MarchingCubes的实现原理。
一、MarchingCubes算法概述MarchingCubes算法是一种从体素数据中提取三维物体的算法,其基本思想是将三维物体表示为一系列的体素块,然后通过算法在这些体素块上提取出三维物体。
该算法具有较高的精度和效率,被广泛应用于三维重建、虚拟现实等领域。
二、实现原理1.体素数据首先,我们需要将三维物体表示为一系列的体素数据。
体素是一种三维空间中的基本数据单元,可以看作是三维空间中的一个立方体,每个立方体的中心点都有一个与之对应的数值。
这些数值可以是颜色、法向量、纹理坐标等三维物体的属性。
2.体素块的划分为了方便提取三维物体,我们需要将体素数据划分为一系列的体素块。
这些体素块可以是任意大小的立方体,但通常会选择大小为2^n的立方体,以便于算法的实现。
每个体素块对应一个三角形网格,这些三角形网格组成了三维物体的表面。
3.算法步骤(1)遍历所有体素块,对于每个体素块,计算其中心点的颜色值。
(2)将中心点的颜色值与阈值进行比较,如果中心点的颜色值与某个表面颜色值相差较大,则认为该体素块与表面相邻。
(3)根据相邻的体素块,确定该表面是由哪些三角形网格组成的。
(4)将表面添加到结果集合中,并更新该集合中所有三角形网格的颜色值。
(5)重复步骤(3)和(4),直到所有体素块都被遍历完毕。
三、优缺点分析MarchingCubes算法具有较高的精度和效率,被广泛应用于三维重建、虚拟现实等领域。
但是,该算法也存在一些缺点:1.计算量大:MarchingCubes算法需要遍历所有体素块,并进行大量的比较和计算,因此计算量较大。
MARCHING CUBE 算法原理Marching Cube 算法原理 1.1.1 Marching Cube 算法概述面绘制法则是根据设定的阈值从体数据中提取出表面的三角面片集再用光照模型对三角面片进行渲染形成三维图像。
面绘制法主要分为基于断层轮廓线的方法和基于体素的方法。
基于断层轮廓线的方法是先在不同的断层上提取出感兴趣区的轮廓线然后在相邻的断层的轮廓线间构造出三角面片的方法这在同一断层上有多个轮廓线时会产生模糊性上下两层的轮廓线不易对应。
用户干预可以避免一定的模糊性但是这样大大增加了操作的复杂性。
因此不被广泛采纳使用。
基于体素的方法以移动立方体法Marching CubeMC为代表。
Marching Cubes算法是面显示算法中的经典算法它也被称为“等值面提取”Iso-surface Extraction。
本质是将一系列两维的切片数据看做是一个三维的数据场从中将具有某种域值的物质抽取出来以某种拓扑形式连接成三角面片。
算法的基本原理MC算法的基本思想是逐个处理体数据场中的各个体元并根据体元各个顶点的值来决定该体元内部等值面的构造形式算法实现过程中体元内等值面构造要经过以下两个主要计算:1、体元中三角面片逼近等值面的计算2、三角面片各顶点法向量的计算。
1.1.2预备知识介绍体素模型和等值面介绍 1、体素模型的介绍体素一般有两种定义一种与二维图像中像素定义相类似。
直接把体数据中的采样点作为体素另一种是把八个相邻的采样点包含的区域定义为体素。
在三维空间某一个区域内进行采样若采样点在xy.z三个方向上分布是均匀的。
采样间距分别为ΔxΔyΔz则体数据可以用三维数字矩阵来啊表示。
每八个相临的采样点采样点相临的立方体区域就定义为一个体素。
而这八个采样点称为该体素的角点。
他们的坐标分别为 i j k i1jk ij1ki1j1k ijk1 ijk1 i1.jk1 ij1k1 和i1j1k1如图-1所示图-1 移动立方体的体素对于体素内任一点P6x yz其物理坐标可以转换为图像坐标 i6 j6 k6 其中i6x/Δx j6y/Δy k6z/Δz.当把方向无关的三个线性插值作为体素模型时其值可以表示为 2、等值面Iso-Surface介绍在面重建算法中以重建等值面这一类算法最为经典。
Marching Cubes 算法Marching Cubes算法是三维规则数据场等值面生成的经典算法,于1987年由Lorensen 和Cline 两人在Siggraph Proceedings (pp. 163-169)提出。
处理的对象一般是断层扫描(CT),或是核磁共振成像(MRI)等产生的图像。
一、基本概念在Marching Cube算法中,体素是以逻辑上的六面体,由相邻层上的各四个像素组成的立方体上的八个顶点。
等值面是空间中所有具有某个相同值的点的集合。
它可以表示成这里的c是我们在三维重构过程中给定的阈值。
二、算法简介算法的基本思想是逐个处理数据场中的立方体(体素),分类出与等值面相交的立方体,采用插值计算出等值面与立方体边的交点。
根据立方体每一顶点与等值面的相对位置,将等值面与立方体边的交点按一定方式连接生成等值面,作为等值面在该立方体内的一个逼近表示。
之所以这样,是由于Marching Cubes有个基本假设:沿六面体边的数据场呈连续性变化。
也就是讲,如果一条边的两个顶点分别大于或小于等值面的值,则在该条边上有且仅有一点是这条边与等值面的交点。
为了说明一下算法,先从2D图像开始。
图1(a)是一张像素灰度值为0~3的图像。
给定阈值1.5,黑色的点表示像素值大于1.5的像素。
图1(b)(c)描述了等值线的抽取过程。
图1(a)图1(b):用空心小圈表示图1(c):进行线性插值,求等值线与这条边相交出交点位置对于某棱边,如果它的两个端点v1、v2标记不同,那么等值面一定与此棱边相交。
且交点坐标为:P=P1 + (isovalue - V1 ) (P2 - P1 ) / (V 2 - V 1 )其中P代表等值点坐标,P1、P2代表两个端点的坐标,V1、V2代表两个端点的灰度值,isovalue 代表阈值。
对于每个四边形来说,每个顶点两种情况(大于或小于),4个顶点共16种情况(图2a),考虑到旋转对称性,从新分类后可得4种基本模式(图2b)。
Marching Cubes 算法Marching Cubes算法是三维规则数据场等值面生成的经典算法,于1987年由Lorensen 和Cline 两人在Siggraph Proceedings (pp. 163-169)提出。
处理的对象一般是断层扫描(CT),或是核磁共振成像(MRI)等产生的图像。
一、基本概念在Marching Cube算法中,体素是以逻辑上的六面体,由相邻层上的各四个像素组成的立方体上的八个顶点。
等值面是空间中所有具有某个相同值的点的集合。
它可以表示成这里的c是我们在三维重构过程中给定的阈值。
二、算法简介算法的基本思想是逐个处理数据场中的立方体(体素),分类出与等值面相交的立方体,采用插值计算出等值面与立方体边的交点。
根据立方体每一顶点与等值面的相对位置,将等值面与立方体边的交点按一定方式连接生成等值面,作为等值面在该立方体内的一个逼近表示。
之所以这样,是由于Marching Cubes有个基本假设:沿六面体边的数据场呈连续性变化。
也就是讲,如果一条边的两个顶点分别大于或小于等值面的值,则在该条边上有且仅有一点是这条边与等值面的交点。
为了说明一下算法,先从2D图像开始。
图1(a)是一张像素灰度值为0~3的图像。
给定阈值1.5,黑色的点表示像素值大于1.5的像素。
图1(b)(c)描述了等值线的抽取过程。
图1(a)图1(b):用空心小圈表示图1(c):进行线性插值,求等值线与这条边相交出交点位置对于某棱边,如果它的两个端点v1、v2标记不同,那么等值面一定与此棱边相交。
且交点坐标为:P=P1 + (isovalue - V1 ) (P2 - P1 ) / (V 2 - V 1 )其中P代表等值点坐标,P1、P2代表两个端点的坐标,V1、V2代表两个端点的灰度值,isovalue 代表阈值。
对于每个四边形来说,每个顶点两种情况(大于或小于),4个顶点共16种情况(图2a),考虑到旋转对称性,从新分类后可得4种基本模式(图2b)。
Marching Cubes算法(医学图像三维绘制中的面绘制)2007-08-16 00:50建议要看的资料[1] Lorensen W E, Cline H E .Marching cubes: a high-resoulution 3D suface construction algorithm [J], Computer Graphics,1987, 21(4):163~169[2]集成化医学影像算法平台理论与实践田捷,赵明昌,何晖光清华大学出版社2004年10月[3]Polygonising a scalar field Also known as: "3D Contouring", "Marching Cubes", "Surface Reconstruction".au/~pbourke/geometry/polygonise/Marching Cubes;[4]Marching Cubes算法工作原理Marching Cubes算法是三维数据场等值面生成的经典算法,是体素单元内等值面抽取技术的代表。
等值面是空间中所有具有某个相同值的点的集合。
它可以表示为,,c是常数。
则称F(f)为体数据f中的等值面。
在MC算法中,假定原始数据是离散的三维空间规则数据场。
用于医疗诊断的断层扫描(CT)及核磁共振成像(MRI) 等产生的图像均属于这一类型。
MC算法的基本思想是逐个处理数据场中的体素,分类出与等值面相交的体素,采用插值计算出等值面与体素棱边的交点。
根据体素中每一顶点与等值面的相对位置,将等值面与立方体边的交点按一定方式连接生成等值面,作为等值面在该立方体内的一个逼近表示。
在计算出关于体数据场内等值面的有关参数后山常用的图形软件包或硬件提供的面绘制功能绘制出等值面。
图2.1 离散的三维空间规则数据场中的一个体素2.1.1 MC算法的主要步骤1.确定包含等值面的体素离散的三维空间规则数据场中的一个体素可以用图2.1表示。
Marching Cubes算法研究【摘要】医学影像三维可视化技术利用二维医学图像序列重建出三维模型.为医生提供了直观、全面、准确的病灶和正常组织信息.是当今医学领域研究的热点.其中最有代表性的是由W.E Lorenson和H.E.Cline在1987年提出来的MarchingCubes方法.本文主要介绍了MC方法的原理和步骤.本文阐述了MC算法存在的不足,对现有的改进算法进行综述.【关键词】医学影像;三维可视化;MC0 引论三维重建方法主要分为面绘制和体绘制两类.其中面绘制的主要思想是首先提取感兴趣物体的表面信息,把体数据转换为一系列三角形面片拟合的等值面,然后再根据光照、明暗模型进行消隐和渲染得到三维的显示图像.与体绘制比较,面绘制原理简单、易于实现,有较高的效率,并由于目前的显卡都可以对三角面片进行硬件加速的绘制,使它成为至今为止最具影响力的一种等值面构造方法,一直到现在为止在可视化领域的著名杂志和会议上还经常有针对MC方法的改进算法[1]。
使用面绘制可以轻易地完成对立方体素的三角面片构型确定,三角面片顶点坐标的计算,三角面片顶点法向量的计算,并最终完成对三维图像的高精度完全重建.Marching Cubes算法的不断完善和发展,使得提供直观、逼真而且能够包含原始信息中隐含的丰富内容的三维信息成为可能.通过图形图像技术,可以对影像进行任意放大、缩小、旋转、对比调整、三维重建等处理,得到便于研究者从多角度、多层次进行观察的三维模型.这对分析结果的准确性有深远的意义.1 MC算法1.1 工作原理及步骤医学图像的三维重建的主要思想就是根据输人的大量的医学断层图像.经分割和提取处理之后,重建出可视的三维图像.这些三维图像在大多数时候是计算出来的大量的三角面片逼近表示.所以如何计算出这些三角面片信息是三维重建的关键.Marching Cubes算法是基于体素的三维物体表面重构方法.其基本原理是首先找出经过该等值面的体元,求出该体元内的等值面并计算出相关参数,通过这些参数在物体表面通过的每一个体素内构造三角面片.整个重建物体由这些三角面片连接组成.并且在Open GL中提供了相应的处理三角面片信息的接口函数,可以进一步提高成像速度.Marching Cubes算法不必考虑分叉问题,并且全局的拓扑结构已经由局部拓扑处理所确定,适用于密集体数据的重建[2].Marching Cubes算法的过程可以描述如下[3].(1)每次读取两张切片,形成一层(Laver).(2)每个laver中上下两切片对应的相邻四个像素构成一个立方体(Cube);(3)按从左至右,从上到下的顺序提取cube,并对cube根据所给阈值进行计算处理,然后再按从下到上顺序处理到最后一层.每个cube需要按照所给闽值进行处理,如果一个顶的灰度值在所给阂值之间,则将它标记为1,而小于闽值的记为0,这样就可以根据所有点标记情况判断出等值面与cube 的相交情况,进而得到相应三角面片表示形式.所有的三角面片表示情况共有256种,去掉对称情况,再经过相应旋转可最终确定十五种情况,如图1所示.(4)将计算出来的全部三角面片信息使用Open GL提供的三角面片绘制函数进行绘制,便可得到最终的三维成像结果.图1 Marching Cubes十五种情况在不降低成像结果质量的同时尽可能的减少三角面片的数量[4].1.2 MC算法存在的问题Durst通过分析基本体元状态模型,提出在立方体的一个面上,如果位于等值面内和在等值面外的顶点分别分布在对角线的两端,就会有2种连接方式;当相邻的2个立方体在公共面上采取的连接不同时,就会导致孔洞的生成.如何从2种以上的连接模式中选择正确的模式是解决二义性的关键.解决这种面上二义性的算法主要有2类:四面体剖分算法和双曲线渐近线算法.1.2.1 四面体剖分消除二义性使用四面体剖分算法解决二义性时,假设在四面体的边上数据场呈线性变化,由于四面体的每个面是三角形,因此生成的等值面片的连接方式是唯一的.四面体剖分算法能够解决拓扑二义性,有比较高的逼近精度,但生成三角片的数量明显增多.大量的三角片导致计算量增加,并且在立方体内的等值面没有二义性时,立方体也会被剖分处理,大大增加了算法的时间耗费.此外,Cignoni[5]等提出,四面体剖分算法中等值面的构造与剖分方式有关,相邻立方体单元剖分不一致会导致裂缝的产生,导致形成的逼近等值面可能和真实等值面有不同的拓扑结构,因此它未得到广泛的应用.1.2.2 双曲线渐近线算法消除二义性Nielson[6]提出使用双曲线渐近线算法来解决面上的二义性.等值面与立方体某一面的交线是一组双曲线或者其中的一支.当2支双曲线都与立方体表面相交时,就会产生二义性.在出现二义性的情况中,2支双曲线将立方体表面分成3个区域,可以证明,双曲线渐近线的交点总是和其中一对交点落在同一个区域.比较渐近线交点和等值面的标量值,如果渐近线交点的标量值大于等值面的标量值,则标量值大于等值面标量值的一对顶点与该交点落在同一个区域;反之,另一对顶点与渐近线交点落在同一区域.2 结论MC算法抽取的等值面的拓扑结构、表示精度、算法的时间和空间效率等在实际使用中都具有非常重要的意义.本文阐述了算法在这些方面存在的不足,对现有的改进算法进行综述,改进后的算法较之原始MC算法显示效果已经有了较大的改进,但在应用到医学可视化等具体领域时,还存在许多问题,有必要进行更深人的研究因此,研究在并行和分布式情况下应用MC算法,也是改进算法的一个重要方向.【参考文献】[1]祁俐娜,罗述谦.基于VTK的医学图像三维重建[J].北京:北京生物医学工程,2006,25(1):1-5.[2]罗述谦,周果宏.医学图像处理与分析[M].北京:科学出版社,2003.[3]Arie E. Kaufman. Accelerated V olume Graphics[J]. Geometric Modeling and Processing,2002,3(7):3-7.[4]张尤赛,陈福民.三维医学图像的体绘制技术综述[J].北京:计算机工程与应用,2002(8):18-19,122.[5]Cignoni P,Ganovelli F.Montani.etal.Reconstruction of topologically correct and adaptive trilinear surfaces [J].Computers and Graphics,2000,24(3):399-418.[6]Nielson G,Hamann B.The asymptotic decider:resolving the ambiguity in marching cubes[C].Proceedings of Visualization’91,Los Alamitos CA,1991:83-91。
Marching Cubes 算法
Marching Cubes算法是三维规则数据场等值面生成的经典算法,于1987年由Lorensen 和Cline 两人在Siggraph Proceedings (pp. 163-169)提出。
处理的对象一般是断层扫描(CT),或是核磁共振成像(MRI)等产生的图像。
一、基本概念
在Marching Cube算法中,体素是以逻辑上的六面体,由相邻层上的各四个像素组成的立方体上的八个顶点。
等值面是空间中所有具有某个相同值的点的集合。
它可以表示成
这里的c是我们在三维重构过程中给定的阈值。
二、算法简介
算法的基本思想是逐个处理数据场中的立方体(体素),分类出与等值面相交的立方体,采用插值计算出等值面与立方体边的交点。
根据立方体每一顶点与等值面的相对位置,将等值面与立方体边的交点按一定方式连接生成等值面,作为等值面在该立方体内的一个逼近表示。
之所以这样,是由于Marching Cubes有个基本假设:沿六面体边的数据场呈连续性变化。
也就是讲,如果一条边的两个顶点分别大于或小于等值面的值,则在该条边上有且仅有一点是这条边与等值面的交点。
为了说明一下算法,先从2D图像开始。
图1(a)是一张像素灰度值为0~3的图像。
给定阈值1.5,黑色的点表示像素值大于1.5的像素。
图1(b)(c)描述了等值线的抽取过程。
图1(a)图1(b):用空心小圈表示图1(c):进行线性插值,求等
值线与这条边相交出交点位置
对于某棱边,如果它的两个端点v1、v2标记不同,那么等值面一定与此棱边相交。
且交点坐标为:
P=P1 + (isovalue - V1 ) (P2 - P1 ) / (V 2 - V 1 )
其中P代表等值点坐标,P1、P2代表两个端点的坐标,V1、V2代表两个端点的灰度
值,isovalue 代表阈值。
对于每个四边形来说,每个顶点两种情况(大于或小于),4个顶点共16种情况(图2a),考虑到旋转对称性,从新分类后可得4种基本模式(图2b)。
图2
这些2D图像正是3D Marching Cubes算法中立方体各个表面的等值线抽取情况。
在3D中,由于每一立方体共有8个顶点,每个顶点共有2个状态(物体内和物体外),因此共有256种组合状态,分析立方体体素的2种对称性:
(1)顶点状态反转,等值三角面片的拓扑结构不变,也就是讲,大于等值面与小于等值面的点是可以相互替换的。
(2)旋转对称性,经过适当旋转,有许多状态是一致的。
这样,可归纳出15种模式(见图3a)。
对于模式0-7,其补充模式见图3b,而模式8-14,由于有4个顶点,本身就包括了自己的互补模式。
图3a 15种模式
图3b 0-7的补充模式
在实现时,可按照立方体顶点状态构造等值面连接模式的查找表,并可直接由立方体各顶点的状态检索出其中等值面的分布模式,确定该立方体体素内的等值面三角片连接方式。
三、算法歧义性及其解决
Marching Cubes算法提出不久,就有人发现了它的歧义性。
跟上面一样,还是从2D开始说起。
先看一下图2b中的Pattern 3。
对这种Pattern,等值线的连接方式除了上图所标识的外,还有另外一种(见图4a)。
图4
对图4a的两种连接方式的不同选择,在同一张图像上可导致完全不同的结果(见图4b)。
经过观察我们可知,这种歧义性只发生在:一个面上,如果一条对角线的两端点大于阈值,另一条对角线的两端点小于阈值的情况。
在立方体中,我们把这种面称作歧义面。
把这个问题放到3D上就产生了Hole问题。
先回头看图3中的Patten 3和它的补充模式3c。
按上面的歧义面定义可知,Pattern 3的底面Direct类型,而Pattern 3c是Reverse类型。
当我们把Pattern 3c倒过来以后放到Pattern 3下面就会产生下图最左边所示情况:
图5
图5还显示了Pattern 10在Pattern 6c上面(中间)和Pattern 6在Pattern 3c上面的情况。
这种歧义性导致的结果可见图6。
图6
从上面可知,产生歧义性的原因是我们把3c等这些补充模式等同于对应的基本模式,从而导致在歧义面上Direct类型和Reverse类型交错使用。
为了解决这个问题,提出两种扩展的Marching Cubes算法。
第一种是把所有的歧义面都按Direct类型来连接。
这样产生了23中模式(图7)。
图7
另一种刚好相反,所有歧义面都为Reverse类型,也有23中模式。
图8和图9分别显示了产用上面两种扩展算法后,对应于图5和图6的结果:
图8
图9
扩展的Marching Cubes算法虽然解决了Hole问题,但并没有解决歧义性问题。
因为无论是Direct还是Reverse都是强制性的,并没有从图形本身出发。
为此,G.M.Nielson等人提出了渐近线判别法。
它通过计算等值面与体素边界面的交线(双曲线)的渐进线与体素的边界面的相互位置关系来判断等值面的正确连接方式。
在一般情况下,等值面与体素边界面的交线是双曲线。
该双曲线的两支及其渐近线与体素的一个边界的相互位置关系可用图10来表示。
在该图所列的4 种状态中,当双曲线的两支均与某边界面相交时,就产生了连接方式的二义性。
此时,双曲线的两支将边界面划分为3个区域,可见,双曲线中两条渐近线的交点必然与边界面中位于对角线上的一对交点落在同一个区域内。
图10:双曲线与体素边界的相互位置关系
设双曲线的两条渐近线的交点坐标为(x, y, z)。
当出现二义性时,需要计算f(x, y, z) 的值。
如果f(x, y, z) > c ,则渐近线的交点应与其函数值大于c的一对角点(立方体的顶点)落在同一区域内。
如果f(x, y, z) < c ,则渐近线的交点应与其函数值小于c的一对角点落在同一区域内。
这就是当出现二义性时,交点之间的连接准则,如图11所示。
图11:二义性等值面判定
在15 种基本模式中,第0, 1, 2, 4, 5, 8, 9, 11, 14 等9 种不存在二义性面,因为它们只存在1种连接方式。
第3,6两种模式,各存在一个二义性面,因此各有两种连接方式。
第10,12两种模式,各存在两个二义性面,因而各有4种连接方式。
第7种模式存在3个二义性面,因而各有8种连接方式。
第13种模式存在6个二义性面,因而各有64种连接方式。
在G.M.Nielson的算法中,根据每种模式的歧义面情况,对各个模式进行了细化。
以Pattern 3和Pattern 10 为例。
Pattern 3有一个歧义面,可细化为2种情况:
图12
Pattern 10有两个歧义面,可细化为4种情况:
图13
立方体中间那点是为了连接成三角面片而加上去的,位置依赖于8个顶点的情况。
将以上15种模式的各种情况加在一起,共有93 种不同的连接方式,除去对称的和相同的方式,共有34种不同的连接方式[Nielson91a]。
所以,虽然这种方法可以正确地修正二义性,但是需要额外的计算,并且比较繁琐。
四、Marching tetrahedrons(移动四面体)算法简介
这是解决歧义性的较简单的一种算法。
算法把一个立方体分割为若干个四面体,再在每个四面体上提取等值面。
对于一个四面体,共有4个顶点、16中情况。
由于对成性,最后只有3种基本模式、2种补充模式(图14)。
图14
从上图可知,Marching tetrahedrons算法没有歧义性。
把一个立方体划分为多个四面体有多种方法,图15展示了分为5个四面体的两种情况。
图15
图16展示了8个立方体中只有它们的共用点大于域值的等值面抽取情况(分别对应于图15的两种划分方法)。
图16
当然,我们也可以把立方体划分为6个四面体或更多。
图17展示了划分为6个的情况及其等值面的抽取结果(对应于图16)。
图17
这种算法产生的3D表面要比Marching Cubes光滑,而且解决了歧义性问题。
但同时产生了比Marching Cubes算法多得多的三角面片。