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算法学习笔记

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融时报:波场亮相哈佛大学并举办TRON Builder Tour活动

近日,波场TRON作为顶级白金赞助商出席哈佛区块链会议并成功举办TRON Builder Tour哈佛站活动,引发海外媒体热议。美联社、金融时报、Cointelegraph等国际主流媒体及加密知名媒体均对此给予了高度评价,认为本次大会对TRON Builder Tour活动具有里程碑意义,彰显了波场TRON致力于促…

mysql基础5——设置主键

业务字段尽量不要用做主键 删除主键,只是主键被删除,字段还存在 alter table demo.membermaster drop primary key; 添加一个字段设置为主键并给主键添加自增约束 alter table demo.membermaster add column id int primary key auto_increment; 自增…

javaEE知识点记录

一、过滤器 在JavaEE中,过滤器(Filter)是一种用于在Web应用程序中对请求和响应进行预处理和后处理的组件。它可以对进入或离开应用程序的请求/响应进行拦截和修改。 过滤器主要用于以下几个方面: 认证和授权:可以使用过…

Gitea 简单介绍、用法以及使用注意事项!

Gitea 是一个轻量级的代码托管解决方案,它提供了一个简单而强大的平台,用于托管和协作开发项目。基于 Go 语言编写,与 GitLab 和 GitHub Enterprise 类似,但专为自托管而设计。以下是对 Gitea 的详细介绍,包括常用命令…

在react配置使用less的最优解

在react配置使用less的最优解 react默认支持用scss,不支持less,直接使用less时会报错,因此当使用less的时候需要进行额外配置。至于技术选型选择less或scss完全取决于你的个人偏好。你当然可以采取别的方式去实现对less的配置。但是我这里只…

anaconda配置的环境对应的地址查看,环境安装位置

打开conda指令窗口 这个和上面的都一样,哪个都行 点开后,输入 conda env list 这里显示的就是自己的每个环境对应的地址了

游戏黑灰产识别和溯源取证

参考:游戏黑灰产识别和溯源取证 1. 游戏中的黑灰产 1. 黑灰产简介 黑色产业:从事具有违法性活动且以此来牟取利润的产业; 灰色产业:不明显触犯法律和违背道德,游走于法律和道德边缘,以打擦边球的方式为“…

巧用断点设置查找bug【debug】

默认设置的断点,当代码运行到断点处MCU就会被挂起,从而停在断点处。 但在某些情况下,如调试FCCU时,如果设置断点,MCU停下后将会导致 FCCU 配置WDG超时。或在调试类似电机控制类的应用时,不适当的断点会导 致…

复合升降机器人教学科研平台——技术方案

一:功能概述 1.1 功能简介 复合升降机器人是一款集成移动底盘、机械臂、末端执行器、边缘计算平台等机构形成的教学科研平台,可实现机器人建图导航、路径规划,机械臂运动学、动力学、轨迹规划、视觉识别等算法功能和应用,提供例如…

C语音——不要解引用未初始化的指针

解引用:*pt得到指针指向地址上储存的值。 int *pt;*pt 5; 创建一个指针时,系统只分配了储存指针本身的内存,并未分配储存数据的内存。若直接用5赋值*pt,由于pt未初始化地址,其地址是随机值&a…

Python中列表数据的保存与读取:以txt文件为例

目录 引言 一、列表数据的保存 二、列表数据的读取 三、进阶用法与注意事项 1. 处理嵌套列表 2. 处理大量数据 3. 注意事项 四、总结 引言 在Python编程中,我们经常需要处理各种类型的数据,包括列表。列表是一种非常灵活的数据结构,…

边缘计算的优势

边缘计算的优势 边缘计算是一种在数据生成地点附近处理数据的技术,而非传统的将数据发送到远端数据中心或云进行处理。这种计算模式对于需要快速响应的场景特别有效,以下详述了边缘计算的核心优势。 1. 降低延迟 边缘计算通过在数据源近处处理数据&…

npm config set registry切换npm镜像源

要切换 npm 镜像源,可以使用 npm config set registry 命令。以下是切换到官方的 npm 镜像源的步骤: 查看当前 npm 镜像源: npm config get registry如果当前的镜像源不是官方的 npm 镜像源(https://registry.npmjs.org/&#xff…

java学习笔记3

5. 多重循环和程序调试 5.1 多重循环 多重循环是指循环中嵌套循环结构 多重循环注意事项 各种循环可以互相嵌套一般不要超过三层嵌套外层循环变化一次,内层循环要全部执行完代码 **需求1:**使用循环嵌套输出10*10的矩形 public static void demo() {for (int i = 0; i <…

imx6ull设备树驱动--pinctl、ioctl

添加pinctl节点 进入arch/arm/boot/dts目录下dts文件 在iomuxc下添加pinctlled节点 将 GPIO1_IO03 这个 PIN 复用为 GPIO1_IO03&#xff0c;电气属性&#xff08;配置GPIO一些列寄存器&#xff09;值为 0X10B0 添加led设备节点 与上一节一样&#xff0c;在 / 下面添加设备节…

数电期末复习(四)组合逻辑电路

这里写目录标题 4.1 概述4.2 组合逻辑电路的分析方法4.3 组合逻辑电路的设计方法4.4 若干常用组合逻辑电路4.4.1 编码器&#xff08;encoder&#xff09;4.4.2 译码器(decoder)4.4.3 数据选择器 (data selector)4.3.4 加法器&#xff08;Adder&#xff09;4.4.4 数值比较器&…

4.21总结

由于之前的项目没有使用服务器搭建&#xff0c;这两天进行了一些修改&#xff0c;以服务器为中端进行搭建&#xff0c;登录注册等功能从直接与数据库关联改为由服务器进行&#xff08;直接关联只能在自己的端口进行修改&#xff0c;放在别人电脑上就无法进行&#xff09; 顺遍…

kubectl常用命令行介绍

1、kubectl用法概述 kubectl命令⾏的语法如下&#xff1a; $ kubectl [command] [type] [name] [flags] command&#xff1a;命令&#xff0c;用于操作Kubernetes集群资源对象的命令&#xff0c;例如create、delete、describe、get、apply等TYPE&#xff1a;资源对象的类型&am…

OpenHarmony UI开发-ohos-svg

简介 ohos-svg是一个SVG图片的解析器和渲染器&#xff0c;解析SVG图片并渲染到页面上。它支持大部分 SVG 1.1 规范&#xff0c;包括基本形状、路径、文本、样式和渐变,它能够渲染大多数标准的 SVG 图像。ohos-svg的优点是性能好、内存占用低。 效果展示 SVG图片解析并绘制: …

Python基本类型

1、Java基本类型 在java里&#xff0c;总共有8种基本类型&#xff0c;分别是&#xff1a; boolean&#xff1a;布尔类型&#xff0c;只有两个值true和false。char&#xff1a;字符类型&#xff0c;占用2个字节&#xff0c;用来表示一个单一的字符。byte&#xff1a;字节类型&…