Marching Cubes算法

Marching Cubes算法

  • 1. 简介
  • 2. 算法原理的理解
    • 2.1 如何找到面经过的这些小块(六面体)?
    • 2.2 找到后,如何又进一步的找到面与这些小块(六面体)的交点;
    • 2.3 这些交点按照怎么的拓扑连接关系连接,是怎么操作的?
  • 3. 总结
  • 4. 参考

1. 简介

在学习网格生成算法之前,推荐大家先了解Marching Cube(MC)算法,为什么呢,他也不是一个端到端的网格生成算法?因为很多连续算法在最后提取等值面的时候都会采用marching cube或其改进版本,可以说MC算法是很多算法的后处理。如果不理解这一步怎么做的,也很难理解其他算法之前的那么多计算的目的是什么。除此之外可以大大简化其他算法的解释过程,最后一步,就可以忽略不解释了。所以我们大家开始吧。

在解释MC算法前,我们先来解释一下等值面。

等值面是什么?
首先等值面是空间中的一个曲面,我们规定空间中每一个点都有一个属性值,属性值相等连续空间组成的曲面,我们称之为等值面。可能还是不太直接,跟我们网格生成有什么关系,我们接下来看。

我们在采集深度点云时,由于传感器自身精度以及配准的误差在一个地方会采集到很多点,可以认为是空间连续点的采样,而且点的位置会有很大的波动。我们通过一些其他方法可以得出这些点与真正的面(这里就是我们所说的等直面)的差值,

那么怎么搞清楚真正的面在哪里呢?

假如一个点在面的前方,我们标记为+1,一个点在真实面的后方,标记为-1,我们可以认为这个真正的面就在这两个点的中间。

我们还可以这么认为,空间内真正的面,会产生一个场,场内有无数个等值面,这个值我们暂且称之为空间场值,空间场值在面的前方为正值,后方为负值。离真实面越近,空间场值的绝对值越小,真实面的空间场值为0(暂定为0,也可以是其他的)。我们的目的就是在对这个场进行采样后,找到空间内真正的面。

2. 算法原理的理解

MarchingCube算法的核心是:为了提取空间中的等值面,并用三角面近似(mesh数据格式)的表示出来。

打个比方:我们可以在CAT影像数据中测量组织的密度,并在组织变得坚硬且致密的点处创建一个表面,因此我们可以创建头骨的 3D 模型,以帮助外科医生进行修复。下图显示了使用 March Cubes 算法根据 CAT-Scan 数据重建的人类头骨。
在这里插入图片描述
那么,Marching Cube 的算法流程是怎么的呢?

首先将空间分成众多的六面体网格,类似将空间分成很多的小块,分成的小块数越多,则分辨率越高,更能适配局部表面的复杂性,但耗时比较久。如下,右侧划分的小块要多一些。
在这里插入图片描述
然后找到等值面经过的小块(六面体):划分成一个个小块后 ,一个个小块上进行迭代(“行进”)。如果立方体的所有 8 个顶点均为正值,或者所有 8 个顶点均为负值,则立方体完全高于或完全低于表面,所以不会产生任何三角形。否则,表面会经过这些小块,并且与边产生交点,将这些交点按照一定的拓扑连接关系连接起来,作为0等值面在该小块(六面体网格)中的近似表示。注意是近似表示,我们采用三角形。

在这里插入图片描述

那么问题来了。

  1. 如何找到面经过的这些小块(六面体)?
  2. 找到后,如何又进一步的找到面与这些小块(六面体)的交点?
  3. 这些交点按照怎么的拓扑连接关系连接,是怎么操作的?

2.1 如何找到面经过的这些小块(六面体)?

前面我们提到过,我们有很多的已知采样点,并且知道这些点在空间中的空间场值,现在我们将空间分为很多个小格子,每个小格子都有8个顶点,我们通过计算8个顶点周围(范围与六面体的大小相关)的采样点,近似计算出8个顶点的空间场值(加权评价等方法)。我们就可以对六面体做以下分类,我们分析一下以下情况:

  1. 八个顶点都没有空间场值,0等值面不经过或者经过但是没有采样,我们没有办法进行近似,所以不处理。
  2. 八个顶点都有或部分有空间场值,当空间场值都是正值或者都是负值时,说明0等值面,不在六面体内。
  3. 当六面体内的的顶点的空间场值有正有负时,则说明有0等直面穿过六面体。我们需要从众多六面体内,筛选出这样的六面体。

2.2 找到后,如何又进一步的找到面与这些小块(六面体)的交点;

因为六面体有8个顶点,8个顶点的状态就有2^8 = 25种分布状态,但是由于六面体是有对称性的,我们通过对称性,可以简化这些状态至15种状态,至于怎么简化,为什么相等,大家简单想一想就好,这个并不复杂。我们看一下15种状态:
在这里插入图片描述

我们上面展示了等值面与六面体相交的情况一共就这样15种,其中还有一个没有交点的,也可以说14种。现在我们就需要精算出来,这个交点的具体的位置,下面我们举一个例子:

我们先给六面体的所有的顶点和边坐上标记:

假如体素下方的顶点3(点的序号见上图)的值小于等值面值,其他顶点上的值都大于等值面值,那么我们可以生成一个与体素边2,3,11相交的三角面片,而三角面片顶点的具体位置则需要根据等值面值和边顶点3-2,3-0,3-7的值线性插值计算得到。

我们将交点坐标用P表示,P1、P2代表边上两个端点的坐标,V1、V2代表这两个端点上的值,V代表等值面值,那么交点坐标的计算公式如下(就是简单的线性差值,当然还有很多种方法,先简单介绍一个简单的线性插值):

P = P1 + (V – V1)·(P2 – P1)/(V2 – V1)

那么现在我们对所有的含有等值面的六面体计算出了其与等值面的角点。下一步也就是最后一步,就是将这些角点链接成三角形就好了。我们来看看怎么做的。

2.3 这些交点按照怎么的拓扑连接关系连接,是怎么操作的?

其实每个顶点的状态,会为这256种情况制作一个8位索引,这个8位索引一般用16进制表示。一般会有2个查找表,第一个表是8个顶点上下关系的二进制表示,即edgeTable查找表,第二个表是triTable查找表。这些表在较早的时候有人手动统计的。

3. 总结

Marching Cubes等值面提取算法在原理和实现上都比较简单直观

经典的Marching Cubes算法还存在一些问题:

  1. 缺陷一:拓扑连接二义性,如下图所示
  2. 缺陷二:效率低下,需要借助分层结构和并行计算

4. 参考

  • Lorensen W E, Cline H E. Marching cubes: A high resolution 3D surface construction algorithm[J]. Acm Siggraph Computer Graphics, 1987, 21(4):163-169.
  • Marching Cubes Part 1: Explaining marching cubes
  • 网格生成之marching cube算法学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【链表】Leetcode 两数相加

题目讲解 2. 两数相加 算法讲解 我们这里设置一个头结点,然后遍历两个链表,使用一个flag记录相加的结果和进位,如果两个链表没有走到最后或者进位不等于0,我们就继续遍历处理进位;如果当前的链表都遍历完成了&#x…

基于springboot实现的摄影跟拍预定管理系统

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven…

【系统分析师】多媒体技术与知识产权标准化

文章目录 一、多媒体技术1、音频2、图像3、媒体的分类4、有损压缩和无损压缩5、多媒体标准 二、知识产权标准化1、保护范围和对象2、保护期限3、知识产权人确定4、侵权判定5、标准化 一、多媒体技术 1、音频 # 声音文件格式 .wav .mp3 .ra .mid .snd .au .aif .voc2、图像 # 彩…

一招下载transformers真不用网上那些教程(我试了1*mol多次才知道)

pip很多是2 然而!!!!!!!!!!!!!!!!!!!!…

ASP.NET大文件分片上传

ASP.NET大文件分片上传,C#上传大型视频文件到服务器,解决方案,用C# 实现断点续传 (HTTP),ASP.NET实现文件夹的上传和下载,.NET使用WEBUPLOADER做大文件的分块和断点续传,ASP.NET实现文件上传和下载,完美解决…

fastgpt、dify功能分析比较

目录 前言 一、dify、fastgpt是什么? 二、同场pk 1.大模型接入 2.chat(最简应用) 3.发布应用 4.知识库 5.workflow 6.其他 三、一些point记录 总结 前言 现在都开始AI应用开发,何谓AI应用,起码要和AI大模型…

13-LINUX--消息队列

一.消息队列 1.消息队列:消息队列为一个进程向另一个进程发送一个数据块提供了条件,每个数据块会包含一个类型。 2.相关函数 1>.msgget(key_t key,int msgflg) : 创建消息队列 2>. msgsnd:把消息添加到消息队列 3>.msgrcv &#xf…

【iOS开发】(四)react Native第三方组件五个20240419-20

react native 外的 第三方组件 目录标题 react native 外的 第三方组件(一)与rn核心组件的使用步骤区别:(二)第三方组件概览1 WebView2 Picker3 Swiper4 AsyncStorage5 Geolocation6 Camera (三)详细学习1 WebViewCoco…

C语言 分支控制语句之 if

然后 我们来说 流程控制语句之 if 选择控制结构 是通过 分支语句来实现的 其中 包括 单分支选择语句通过 (if) 来实现 双分支语句通过 (if) 和 (else) 实现 多分支语句通过 (if) (else if) (else) 实现 对于单分支来讲 它控制的语句就是 要嘛做 要嘛不做 好比如 放假了 你是…

MySQL基础之单表操作(定义DDL,增删改DML,查DQL)

目录 一、概述1.1 什么是数据库1.2 连接MySQL1.3 数据模型1.4 SQL语句的分类1.5 数据类型 二、数据库设计-DDL2.1 数据库层面2.2 数据表层面创建表约束查询修改add,modify,change,drop,rename删除 三、数据库操作-DML3.1 添加数据insert3.2 修改数据update3.3 删除数据delete 四…

插值与重采样在AI去衣技术中的关键作用

在人工智能(AI)的众多应用中,去衣技术作为一种新兴的图像处理技术,逐渐引起了广泛关注。这项技术不仅涉及复杂的计算机视觉和深度学习算法,还需要对图像处理中的插值与重采样技术有深入的理解。本文将详细探讨插值与重…

霸气归来,AKG N9 Hybrid头戴式降噪耳机震撼发布!手边的“大耳”瞬间不香了?

自1947年Rudolf Grike博士和Ernst Pless先生在“音乐之都”维也纳创立AKG以来,品牌已经走过77载辉煌历程,其产品被广泛应用于全球各大巡回演出和录音棚中,为全球音乐爱好者和专业人士提供了无数优质的声音体验。 近日,AKG再度以王…

(一)Java EE企业级应用开发实战之Servlet教程——JDK安装

首先打开清华大学开源软件镜像站,清华大学开源镜像网站地址为: https://mirrors.tuna.tsinghua.edu.cn/ 打开该地址后的界面显示如下图所示 找到8版本对应的SDK安装包,我现在用的开发机器是Windows,所以我找的是Windows对应的版本…

手机文件怎么传给商家打印?

在数字化时代,手机已经成为我们生活和工作中不可或缺的工具。当需要将手机中的文件传给商家打印时,传统的打印店往往要求通过微信等社交软件传输文件,这种方式非常操作繁琐。那么,手机文件怎么传给商家打印呢?琢贝云打…

Kotlin语法快速入门-函数(4)

Kotlin语法快速入门-函数(4) 文章目录 Kotlin语法快速入门-函数(4)四、函数1、函数定义2、infix关键字3、参数省略4、函数类型参数5、多参数--vararg 四、函数 1、函数定义 fun 函数名(参数: 类型) :返回值类型{//函…

“EDM邮件营销”如何构建企业获客增长新赛道

在这个瞬息万变的数字时代,企业的营销策略不断进化,以求在激烈的市场竞争中脱颖而出。其中,“EDM(Electronic Direct Mail)邮件营销”作为一项经典且高效的营销手段,正借助先进的技术力量,重新焕…

网络常识!!!

网络常识!!! 一:网络的发展史二:关键的概念三:IP地址四:端口号二级目录二级目录二级目录二级目录三级目录 一:网络的发展史 从游戏方面发展历程进行理解: 从单机游戏-----游戏支持局域网对战-------游戏支持广域网对战-------移动端 (1)局域网对战:在同一个网吧里,不同的游戏…

stable diffusion本地部署@win10

一键无脑安装stable-diffusion-webui stable diffusion是当前非常出色的文生图模型,要优于以前gan文生图模型。现在有了stable-diffusion-webui软件,可以一键安装,大大简化了操作难度。本文档就是stable-diffusion-webui在windows 10上的安装…

MySql 安装教程+简单的建表

目录 1.安装准备 1.MySQL官方网站下载 2.安装步骤 3.测试安装 4.简单的建表 1.安装准备 1.MySQL官方网站下载 下载安装包或者压缩包都可以 选择相应版本,点击Download开始通过网页下载到本地(压缩包下载快一些) 2.安装步骤 双击此.exe…

SpringAOP从入门到源码分析大全(三)ProxyFactory源码分析

文章目录 系列文档索引五、ProxyFactory源码分析1、案例2、认识TargetSource(1)何时用到TargetSource(2)Lazy的原理(3)应用TargetSource 3、ProxyFactory选择cglib或jdk动态代理原理4、jdk代理获取代理方法…