Marching Cubes

Marching Cubes算法是三维数据场等值面生成的经典算法,是体素单元内等值面抽取技术的代表。今天我将进行简单的介绍一下。(It is for extracting a polygonal mesh of an isosurface from a three-dimensional scalar field)。
步骤:
1.确定包含等值面的体素和相应的边。
 Screenshot - 2011_10_28 , 23_52_17
见上图,8个数据点分别位于该体素的8个角点上。MC算法的基本假设是:沿着体素的边其数据场呈局部连续线性变化,根据这个假设,可认为,如果两个相邻采样点一个为正点,一个为负点,则它们连成的边上一定存在且仅有一个等值点。如果得到了体素各条边上的等值点,就可以以这些点为顶点,用一系列的三角形拟合出该体素中的等值面。因此确定立方体体素中等值面和立方体相交的边是该算法的基础。
对顶点进行分类:
1). 如体素顶点的数据值大于或等于等值面的值,则定义该顶点位于等值面之外,记为正点,即 "1”。
2). 如体素顶点的数据值小于或等于等值面的值,则定义该顶点位于等值面之内,记为负点,即 "0”。
由于每个体素共有8个顶点,且每个顶点有正负两种状态,所以等值面可能以 2^8 = 256 种方式与一个体素相交。通过列举出这256种情况,就能创建一张表格,利用它可以查出任意体素中的等值面的三角面片表示。
如果考虑互补对称性,将等值面的值和8个角点的函数值的大小关系颠倒过来,即将体素的顶点标记置反(0变为1, 1变为0),这样做不会影响该体素的8个角点和等值面之间的拓扑结构,可将256种方式简化成128种。其次,再利用旋转对称性,可将这128种构型进一步简化成15种。见下图:球点表示在等值面外的点,箭头代表法向方向。
Screenshot - 2011_10_29 , 0_05_00
如果在MC算法中用一个字节(8位)的空间构造了一个体素状态表,该状态表中的每一位可表示出该体元中的一个角点的0或1的状态。根据这一状态表,就可知道当前体素属于上图中哪一种情况(其实可以根据15种情况得到所有的256种情况,然后在进行查找。),并且可以判断等值面和哪一条边相交。最关键的是:可以从中找到对应的三角面片的组成。
 
2.确定等值面与体素边界的交点位置。
在确定体素内三角剖分模式后,就要计算三角片顶点位置。当三维离散数据场的密度较高时,即当体素很小时,可以假定函数值沿体素边界呈线性变化,这是MC算法的基本假设。因此,根据这一基本假设,可以直接用线性插值计算等值面与体素边的交点。
对于当前被处理体素的某一条边,如果其两顶点的标记值不同,那么等值面一定与此边相交,且仅有一个交点。交点使用P代表等值点坐标,p1、p2代表两个端点的坐标,V1,V2代表两个端点的采样值,V代表等值面的值p = p1 + (V-V1)*(p2-p1)/(V2-V1)。求出等值面与体素棱边的交点以后,就可以将这些交点连接成三角形或多边形,形成等值面的一部分。
 
3.确定等值面的法向量计算。
为了利用图形硬件显示等值面图象,必须给出形成等值面的各三角面片的法向分量,选择适当的局部面光照模型进行光照计算,以生成真实感图形。对于等值面上的每一点,其沿面的切线方向的梯度分量应该是零,因此,该点的梯度矢量的方向也就代表了等值面在该点的法向。
Mc算法采用中心差分方法求采样点p(i,j,k) 处的梯度矢量:
Gx = (g(i+1,j,k)-g(i-1,j,k))/2dx   
Gy = (g(i,j+1,k)-g(i,j-1,k))/2dy     
Gz = (g(i,j,k+1)-g(i,j,k-1))/2dz
对G进行归一化,得到(Gx/|G|,Gy/|G|,Gz/|G|)作为(i,j,k)上的单位法向量。然后,对体素八个顶点上法向量进行线性插值就可得到位于体素边上的三角片的各个顶点的法向量。
 

参考:

http://zhidao.baidu.com/question/48217227

书:《三维数据场重构与显示工程软件设计》

posted on 2011-10-29 00:30  fire_fuxm_USTC  阅读(4100)  评论(0编辑  收藏  举报