当前位置: 首页 > news >正文

【3D 入门-6】大白话解释 SDF(Signed Distance Field) 和 Marching Cube 算法

  • 【3D入门-指标篇上】3D 网格重建评估指标详解与通俗比喻
  • 【3D入门-指标篇下】 3D重建评估指标对比-附实现代码
  • 【3D 入门-3】常见 3D 格式对比,.glb / .obj / .stl / .ply
  • 【3D 入门-4】trimesh 极速上手之 3D Mesh 数据结构解析(Vertices / Faces)
  • 【3D 入门-5】trimesh 极速上手之 Hunyuan3D-2.1 中的“非水密网格“处理流程

在这里插入图片描述

  • 先有 SDF 描述形状内外(上图右侧白色到黑色的坐标),再由 Marching Cube (上图中的红色多面体是由一个个 cube 组成的)生成网格
  • 图片来源:https://www.youtube.com/watch?v=M3iI2l0ltbE
一、什么是SDF?(Signed Distance Field,有向距离场)

1. 基础概念
SDF是一种描述空间中每个点与某个形状距离的数学工具。简单来说:

  • 对于空间中的任意一点,SDF会计算它到某个物体表面的最短距离,并且用“正负号”表示点在物体的内部还是外部:
    • 如果点在物体外部,距离为正数
    • 如果点在物体内部,距离为负数
    • 如果点正好在物体表面上,距离为0

举个例子
比如一个半径为1的球体,球心在原点(0,0,0)。对于空间中的点P(x,y,z),它的SDF值就是:
SDF(P)=x2+y2+z2−1SDF(P) = \sqrt{x^2 + y^2 + z^2} - 1SDF(P)=x2+y2+z21

  • 当P在球外时(比如(2,0,0)),距离是2-1=1(正数);
  • 当P在球内时(比如(0.5,0,0)),距离是0.5-1=-0.5(负数);
  • 当P在球面上时(比如(1,0,0)),距离是0(表面)。

2. 为什么SDF很重要?

  • 简洁描述形状:用数学公式就能表示复杂形状,比如球体、立方体甚至更复杂的物体。
  • 方便计算:通过SDF可以快速判断点与物体的位置关系,这在3D建模、游戏渲染、物理模拟中很常用。
二、什么是Marching Cube算法?(移动立方体算法)

1. 算法的目标
Marching Cube算法的核心是:将SDF表示的形状,转换为计算机能显示的三角形网格(3D模型的基本组成单元)

2. 工作原理(类比“切豆腐”)
假设我们有一块“豆腐”(代表3D空间),里面藏着一个用SDF描述的形状。算法的步骤如下:

  • 第一步:划分网格
    将3D空间分成许多小立方体(像切豆腐一样切成小方块),每个小立方体的顶点都有一个SDF值(正或负)。

  • 第二步:判断表面位置
    对于每个小立方体,观察它的8个顶点的SDF值:

    • 如果顶点的SDF是正数,说明它在形状外部;
    • 如果是负数,说明在形状内部。
      当相邻顶点的SDF值一正一负时,说明形状的表面穿过这两个顶点之间的边,需要计算表面与边的交点。
  • 第三步:生成三角形
    根据小立方体中顶点的正负分布,找到所有表面与边的交点,然后将这些交点连接成三角形。这些三角形拼接起来,就形成了形状的表面网格。

举个例子
如果一个小立方体的4个顶点在形状内部(SDF负),4个在外部(SDF正),那么它的表面可能穿过某些边,算法会计算这些边上的交点,并把交点连成三角形,覆盖形状的表面。

三、两者的关系:SDF + Marching Cube = 3D模型生成
  • SDF就像“蓝图”,用数学方式描述形状的内外;
  • Marching Cube就像“施工队”,根据蓝图(SDF的正负值)把形状“雕刻”出来,变成计算机能显示的三角形网格。
四、生活中的类比
  • SDF:像地图上的等高线,每个点的海拔(正负)表示它在山的内部还是外部。
  • Marching Cube:像用积木搭建城堡,根据每个积木块的位置和形状,决定哪些积木需要被用来搭建表面,最终组成城堡的样子。
五、为什么这两个概念很重要?
  • SDF在游戏中常用于“碰撞检测”(比如角色是否碰到墙壁),或生成动态形状(如水流、烟雾);
  • Marching Cube是3D建模中生成复杂曲面的经典算法,比如医学图像(CT扫描)重建人体器官,或游戏中生成地形和物体模型。

如果想进一步理解,可以想象用无数小方块“包裹”一个苹果,每个方块根据苹果的形状(SDF)决定如何切割表面,最终用三角形拼成苹果的3D模型——这就是Marching Cube在做的事情~


文章转载自:

http://hA64EdUL.yrycb.cn
http://LeyUbPnO.yrycb.cn
http://j4RqkP50.yrycb.cn
http://xl0dk8AS.yrycb.cn
http://K34Z9DC6.yrycb.cn
http://oAMpbqBk.yrycb.cn
http://3IQ8r6pt.yrycb.cn
http://V6ZxIPae.yrycb.cn
http://5HtH5X8s.yrycb.cn
http://7KhqcPxo.yrycb.cn
http://lMrxn4N7.yrycb.cn
http://o9CilmPq.yrycb.cn
http://cq6jr13C.yrycb.cn
http://Dnsanay8.yrycb.cn
http://XxNc7Jvw.yrycb.cn
http://klFo31CB.yrycb.cn
http://5VY84C14.yrycb.cn
http://GQ849Bdg.yrycb.cn
http://buFiE5Th.yrycb.cn
http://3HkIWn33.yrycb.cn
http://gjLErfZL.yrycb.cn
http://7gGaePZy.yrycb.cn
http://x8b7NIWX.yrycb.cn
http://20v4v7TR.yrycb.cn
http://TRAQDCJz.yrycb.cn
http://hSU1yLH0.yrycb.cn
http://4ylLDYTz.yrycb.cn
http://Db8h1mhI.yrycb.cn
http://KMLQ1IsI.yrycb.cn
http://7Fwd2AnR.yrycb.cn
http://www.dtcms.com/a/367743.html

相关文章:

  • 并发编程——17 CPU缓存架构详解高性能内存队列Disruptor实战
  • Pycharm终端pip install的包都在C:\Users\\AppData\Roaming\Python\解决办法
  • Linux中用于线程/进程同步的核心函数——`sem_wait`函数
  • Day2p2 夏暮客的Python之路
  • C++虚函数虚析构函数纯虚函数的使用说明和理解
  • Process Explorer 学习笔记(第三章3.1.1):度量 CPU 的使用情况详解
  • 机器学习入门,第一个MCP示例
  • Spring Boot项目中MySQL索引失效的常见场景与解决方案
  • 2025 年高教社杯全国大学生数学建模竞赛C 题 NIPT 的时点选择与胎儿的异常判定 完整成品思路模型代码分享,全网首发高质量!!!
  • 代码随想录学习摘抄day6(二叉树1-11)
  • 吴恩达机器学习(五)
  • Web 与 Nginx 网站服务:从基础到实践
  • 为什么打印出来的 cJSON type 值和头文件定义的不一样?
  • MySQL子查询的分类讲解与实战
  • 【蓝桥杯选拔赛真题64】C++最大空白区 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • 企业中团队最常使用的git命令操作
  • MCP 和 Fuction Call 有什么不同
  • 去中心化投票系统开发教程 第一章:区块链基础知识
  • 热门盘点|政务办公移动化:开启政务服务高效协同新时代
  • ICPC Central Russia Regional Contest, 2024
  • (A题|烟幕干扰弹的投放策略)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
  • 化工行业的设备管理软件应用_HawkEye智能运维平台_璞华大数据
  • 论文介绍:Fast3R,更快的多视图 3D 重建的新范式
  • Java 流程控制:从入门到面试的全方位指南
  • 嵌入式第四十六天(51单片机)
  • Dubbo消费者无法找到提供者问题分析和处理
  • ​​Nginx高性能Web服务器实战:从协议原理到运维优化​​
  • 【ffmepg+ AI 】从mp3歌曲提取伴奏(纯音乐)
  • TreeMap 和 LinkedHashMap原理介绍
  • 手写智能指针:带你彻底搞懂 C++ 内存管理的底层逻辑