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; 自增…

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

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

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

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

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

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

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

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

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

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

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

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

边缘计算的优势

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

imx6ull设备树驱动--pinctl、ioctl

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

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

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

kubectl常用命令行介绍

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

OpenHarmony UI开发-ohos-svg

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

uni-app HBuilderX通过easycom省略import自动导入自定义组件

快速尝试 自HBuilderX 2.5.5起支持easycom组件模式。更新HBuilderX即可尝试。 easycom默认已启用,并对项目下的components和uni_modules目录开启自动扫描,对符合下面路径和命名规则的组件自动导入。 components/组件名/组件名.vue uni_modules/组件名/…

使用飞桨快速部署stable diffusion模型

这可以说是最快的部署stable diffusion模型的方法了,而且星河社区还有免费的GPU算力提供,这样再也不用担心没有算力了! 操作方法: # 安装相关库 pip install docarray0.21.0 pip install paddlehub# 初始化 from PIL import Imag…

踊跃参与,您有机会尊享300000水晶奖励!【AI书童】代言形象大投票活动开启~~~

【AI书童】运营官 未来智慧人工智能 2024-04-19 09:55 ✧ 快来选出你心目中的【AI书童】 ✦ 我们想为【AI书童】选择一个形象代言,使用【AI书童】软件生成了一部分形象照片。大家觉得哪个书童最合适呢?希望你们能给出宝贵的建议! 【AI书童…

手把手教你实现 OceanBase 数据到 Apache Doris 的便捷迁移|实用指南

作者|SelectDB 技术团队 作为广受认可的分布式数据库,OceanBase 已在众多企业关键业务系统中得到广泛应用。在 Apache Doris 社区,有众多用户选择基于 OceanBase 与 Apache Doris 以构建强大的数据处理与分析链路,本文将详细介绍如何便捷高效…

Java反序列化-CC3链

前言 前面的CC1与CC6链都是通过 Runtime.exec() 进行命令执行的。当服务器的代码将 Runtime放入黑名单的时候就不能使用了。 CC3链的好处是通过动态加载类的机制实现恶意类代码执行。 版本限制 jdk8u65Commons-Collections 3.2.1 动态类加载 loadClass -> 负责加载load…

38. UE5 RPG 修改火球术的攻击方向以及按住Shift攻击

在前面,我们实现了火球术火球的制作,能够在释放火球术时,角色将播放释放技能动画,并实现了对火球的目标的服务器同步功能。 我们先回忆一下之前完成的内容。 在前面,我们先做了一个Actor,用于承载发射的火…

集成学习-Bagging与随机森林回归

reg_fRFR() reg_tDTR()#实例化决策树 cvKFold(n_splits5,shuffleTrue,random_state1412)#实例化验证方式 result_tcross_validate(reg_t#要进行交叉验证的评估器,X,y,cvcv,scoringneg_mean_squared_error#评估指标,return_train_scoreTrue#是否返回训练分数,后面这几…