上一篇介绍了Marching Cubes算法,Marching Cubes算法是三维重建算法中的经典算法,算法主要思想是检测与等值面相交的体素单元并计算交点的坐标,然后对不同的相交情况利用查找表在体素单元内构建相应的网格拓扑关系。Marching Cubes算法简单,但是存在一些缺陷:1.模型二义性问题;2.模型特征问题。

  对于二义性问题,以2D情形为例,存在一个单元中同一顶点状态而不同的连接方式(如下图所示)。

图:2D中Marching Cubes算法的二义性问题

  那么对于上图中两种连接方式的不同选择,可能会导致在同一张图像上完全不同的结果(如下图所示),二义性在3D中的直接后果是产生“孔洞”。如果在一个单元中,一条对角线的两端点值大于等值面阈值,另一条对角线的两端点值小于等值面阈值,那么通常会发生这种二义性问题。

图:二义性问题的不同结果

  对于特征问题,由于Marching Cubes算法只计算体素单元的交点坐标信息,并根据这些交点连接的三角面片来构建体素单元内的几何模型,这样假如体素单元内存在几何模型的特征信息(棱边、棱角),但是Marching Cubes算法最终构建出的几何模型会缺少这些特征信息(如下图所示)。

图:左上-交点坐标和法向;右上-Marching Cubes算法;左下-Extended Marching Cubes算法;右下-Dual Contouring算法

  Dual Contouring算法[Ju et al. 2002]也是经典的等值面提取算法,相比Marching Cubes算法,Dual Contouring算法利用Hermite数据(交点的位置和法向)进行等值面构建,它克服了Marching Cubes算法所出现的缺陷。具体算法分两步:

  第一步:利用二次误差函数生成顶点坐标

  对于每个与等值面相交的体素单元,通过最小化二次误差函数来生成一个顶点坐标:

其中pi为交点的位置,ni为交点的法向。

  误差函数可以写成矩阵形式:

其中矩阵A的行向量为交点的法向ni,向量b的每个元素为ni·pi

  极值点可以通过求解正则方程得到:

  但是文章指出这种方式会存在数值不稳定,并提出一种解决方法。基于QR矩阵分解计算正交矩阵Q,使得Q与[A b]相乘为如下上三角矩阵形式:

其中A'为3*3的上三角矩阵,b'为长度为3的向量,r为标量。

  那么误差函数可以变化为:

  然后再根据上式计算极值点。

  第二步:生成网格面片

  对于每一条等值面相交的体素边,那么包含该体素边的4个相邻体素单元内必然都存在顶点,将这4个顶点连接生成1个四边形面片。

  

  文章[Schaefer et al. 2002]详细介绍了Dual Contouring算法的实现细节,通过总结该文可以得到Dual Contouring算法过程如下:

  对于每个与等值面相交的体素单元:

  1. 创建1个4*4的零矩阵用于存放QR矩阵分解的结果;

  2. 对于体素单元的每条相交边,计算交点的位置pi和对应的法向ni

  3. 将向量[ ni.x, ni.y, ni.z, dot(pi,ni) ]添加到4*4的零矩阵底部;

  4. 通过QR矩阵分解得到3*3的上三角矩阵A'和向量b';

  5. 求解线性方程组A'TA'x = (A'Tb' - A'Tb'c) , 其中c是体素单元中所有交点的质心位置;

  6. 将计算得到的偏移量x加上质心位置c即为体素单元中的顶点坐标;

  7. 如果计算得到的顶点坐标位于体素单元之外,那么顶点坐标用质心位置c来代替;

  8. 对于每一条相交的体素边,将其周围4个体素单元内的顶点连接生成1个四边形面片。

 

图:左- Marching Cubes算法;右-Dual Contouring算法

 

图:左- Marching Cubes算法;右-Dual Contouring算法

 

图:box与sphere相交模拟

本文为原创,转载请注明出处:http://www.cnblogs.com/shushen

相关:

水泡动画模拟(Marching Cubes):http://www.cnblogs.com/shushen/p/5542131.html

参考文献:

[1] Tao Ju, Frank Losasso, Scott Schaefer, and Joe Warren. 2002. Dual contouring of hermite data. ACM Trans. Graph. 21, 3 (July 2002), 339-346.

[2] Scott Schaefer and Joe Warren. Dual contouring: The secret sauce. Technical Report 02-408, Department of Computer Science, Rice University, 2002.

[3] http://users.csc.calpoly.edu/~zwood/teaching/csc572/final15/kpidding/index.html

三维等值面提取算法(Dual Contouring)的更多相关文章

  1. SIFT 特征点提取算法

    SIFT特征点相对于ORB计算速度较慢,在没有GPU加速情况下,无法满足视觉里程计的实时性要求,或者无法运行在手机平台上,但是效果更好,精度更高.在应用时可以择优选取,了解其本质原理的动机是为了自己使 ...

  2. TextRank:关键词提取算法中的PageRank

    很久以前,我用过TFIDF做过行业关键词提取.TFIDF仅仅从词的统计信息出发,而没有充分考虑词之间的语义信息.现在本文将介绍一种考虑了相邻词的语义关系.基于图排序的关键词提取算法TextRank [ ...

  3. 关键词提取算法TextRank

    很久以前,我用过TFIDF做过行业关键词提取.TFIDF仅仅从词的统计信息出发,而没有充分考虑词之间的语义信息.现在本文将介绍一种考虑了相邻词的语义关系.基于图排序的关键词提取算法TextRank. ...

  4. 关键字提取算法TF-IDF和TextRank(python3)————实现TF-IDF并jieba中的TF-IDF对比,使用jieba中的实现TextRank

    关键词:    TF-IDF实现.TextRank.jieba.关键词提取数据来源:    语料数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据    数据处 ...

  5. PIE SDK水深提取算法

    1.算法功能简介 水深提取算法就是根据输入的水位设为d,dem设为h 这两个数据做一个差值运算,则水深计算公式为d-h;本示例中的是基于洞庭湖提取的水体矢量文件的范围来计算dem和水位25米的差值. ...

  6. 关键词提取算法TF-IDF与TextRank

    一.前言 随着互联网的发展,数据的海量增长使得文本信息的分析与处理需求日益突显,而文本处理工作中关键词提取是基础工作之一. TF-IDF与TextRank是经典的关键词提取算法,需要掌握. 二.TF- ...

  7. 关键词提取算法-TextRank

    今天要介绍的TextRank是一种用来做关键词提取的算法,也可以用于提取短语和自动摘要.因为TextRank是基于PageRank的,所以首先简要介绍下PageRank算法. 1.PageRank算法 ...

  8. wav2midi 音乐旋律提取算法 附可执行demo

    前面提及过,音频指纹算法的思路. 也梳理开源了两个比较经典的算法. https://github.com/cpuimage/shazam https://github.com/cpuimage/Aud ...

  9. 摘要提取算法——本质上就是pagerank,选择rank最高的句子作为摘要,如果结合word2vec应该有非常好的效果

    最近需要做一些文本摘要的东西,选取了TextRank(论文参见<TextRank: Bringing Order into Texts>)作为对比方案,该方案可以很方便的使用Python相 ...

随机推荐

  1. order by用法

    此文来源于CSDN中zxcvg的博文 1.ORDER BY 中关于NULL的处理 缺省处理,Oracle在Order by 时认为null是最大值,所以如果是ASC升序则排在最后,DESC降序则排在最 ...

  2. “三巨头”有变化,BAT还能走多久?

    在腾讯市值超越阿里巴巴后,市场分析多数认为,当年的BAT“三巨头”时代已经彻底结束,进入了“双寡头”时代了 从对外投资来看,BAT不同的投资逻辑可以推测其战略方向 撰文/梁云风 时评员,关注财经与互联 ...

  3. 使用git error: RPC failed; result=22, HTTP code = 411

    使用git提交比较大的文件的时候可能会出现这个错误 error: RPC failed; result=22, HTTP code = 411 fatal: The remote end hung u ...

  4. Lind.DDD.Events事件总线~自动化注册

    回到目录 让大叔兴奋的自动化注册 对于领域事件之前说过,在程序启动时订阅(注册)一些事件处理程序,然后在程序的具体位置去发布(触发)它,这是传统的pub/sub模式的体现,当然也没有什么问题,为了让它 ...

  5. 13、ASP.NET MVC入门到精通——MVC请求管道

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 ASP.NET MVC的请求管道和ASP.NET请求管道基本上一模一样,如果你对ASP.NET请求管道十分熟悉的话,你只要关注一下不同点.看 ...

  6. 《More Effective C#》读书笔记

    <More Effective C#>这本书,大概是四年前看完的,但只整理了一部分读书笔记,后面有时间的话,会陆续补充的. More Effective C# :使用泛型 More Eff ...

  7. 分享20个最新的免费 UI 设计素材给设计师

    用户界面设计涉及到很多的创意,灵感以及需要与客户进行有效沟通的技能.良好的用户界面是一致的,可以使网站更容易理解和使用.UI设计的重点在于用户体验和互动,同时易于使用对于一个成功的移动应用程序来说非常 ...

  8. Spring(5)—— 注解

    注解Annotation,是一种类似注释的机制,在代码中添加注解可以在之后某时间使用这些信息.跟注释不同的是,注释是给我们看到,java虚拟机不会编译,注解也是不编译的,但是我们可以通过反射机制来读取 ...

  9. 轻松掌握:JavaScript模板方法模式

    模板方法模式 假如我们有一些对象,各个对象之间有一些相同的行为,也有一些不同的行为,这时,我们就可以用模板方法模式来把相同的部分上移到它们的共同原型中(父类),而将不同的部分留给自己各自重新实现. 模 ...

  10. NHibernate代码监视

    今天在使用NH连接MySQL的时候,突然想起来MySQL好像并没有类似于SQL SERVER Profiler的功能,那以后调试不是很操蛋吗?搞了半天,发现并没有办法,只好拐个弯解决问题:将NH中的生 ...