Contents

3D表征

常见3D表征类型

几何模型 CAD CSG

体素

点云

mesh

隐式表达 SDFs

pcd

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# python 保存、读取
from plyfile import PlyData, PlyElement
ply_data = PlyData([vertex_element])
ply_data.write(path)

# 判断格式
head -n 10 plyfile
format binary_little_endian 1.0 # 二进制-小端格式
format ascii 1.0 # 文本

with open("input.ply", "rb") as f:
    header = f.readline().decode().strip()
    if "format ascii" in header.lower():
        print("文件是ASCII格式,建议转换为二进制")

# 格式转换
import trimesh
mesh = trimesh.load("input.ply")
mesh.export("output_binary.ply", file_type="ply", encoding="binary")

# 高效读取库
trimesh 
pyply
pyntcloud
pandas
open3d
numpy.fromfile()

# 读取加速
Chunking
二进制
多进程/并行

SDF

在三维计算机图形学和三维重建领域,SDF(Signed Distance Function) 是一种非常重要的表示三维物体的方法。它可以描述一个三维物体的形状,广泛应用于计算机图形学、物理模拟、3D建模、虚拟现实(VR)等领域。SDF 用于描述空间中的每个点与物体表面之间的距离,且每个点的值是一个标量,表示到最近表面的距离,并且带有符号信息(即物体内外的区分)。

1. 什么是 SDF(Signed Distance Function)

SDF 是一种函数,用来表示空间中每个点到最近物体表面的距离。这个函数不仅给出点到表面的距离,还通过符号(正负值)来指示点位于物体的内外。

  • 正值:如果点位于物体的外部(物体表面之外)。
  • 负值:如果点位于物体的内部(物体表面之内)。
  • 零值:如果点位于物体的表面。

SDF 函数通过这种方式编码了一个三维物体的形状,能够非常简洁且有效地表示复杂的几何结构。

2. 数学表示

SDF 是一个定义在三维空间中的函数,通常表示为:

SDF(x,y,z)=距离(p,物体表面)SDF(x, y, z) = \text{距离}(p, \text{物体表面})

SDF(x,y,z)=距离(p,物体表面)

其中:

  • (x,y,z)(x, y, z)(x,y,z) 是三维空间中的一个点。

  • 距离(p,物体表面)\text{距离}(p, \text{物体表面})距离(p,物体表面) 是点 p 到物体表面的最短距离。

    pp

  • 如果 SDF(x,y,z)>0,表示点在物体的外部;

    SDF(x,y,z)>0SDF(x, y, z) > 0

  • 如果 SDF(x,y,z)<0,表示点在物体的内部;

    SDF(x,y,z)<0SDF(x, y, z) < 0

  • 如果 SDF(x,y,z)=0,表示点在物体表面上。

    SDF(x,y,z)=0SDF(x, y, z) = 0

3. SDF 在三维表示中的应用

SDF 在三维计算机图形学、物理模拟、几何建模等领域有广泛的应用。它有几个显著的优势和特点:

(1) 清晰的物体内部与外部区分

由于 SDF 返回的值具有符号信息,它能够明确区分物体的内部和外部,这对许多计算机图形学应用(如碰撞检测、体积计算等)非常有用。

(2) 平滑表示

与传统的基于网格的表示方法(如三角网格、点云等)相比,SDF 提供了一个平滑的物体边界表示,这意味着即使是非常复杂的物体,也可以通过简单的 SDF 函数来表示。

(3) 动态更新和变形

由于 SDF 描述的是物体表面的距离,它比传统的网格表示更容易处理物体的变形。例如,通过更新 SDF 函数,可以直接得到物体变形后的新形状,而无需重新计算网格。

(4) 与其他计算的结合

SDF 在物理模拟中非常有用,尤其是在流体动力学、碰撞检测、布料模拟等领域。它能够方便地与物理场景结合,例如用于粒子模拟、接触检测和物体的相互作用。

4. 从 SDF 到三维网格(Mesh)

虽然 SDF 是非常有效的表示三维物体的方式,但它并不是直接可以进行渲染的网格数据格式。因此,在实际应用中,常常需要将 SDF 转换为传统的三维网格(Mesh)。这个过程通常包括以下几个步骤:

(1) 等值面提取(Marching Cubes)

一种常见的从 SDF 到网格的转换方法是 Marching Cubes 算法。该算法通过在三维空间中划分小立方体(Voxel),并根据每个立方体中 SDF 的符号变化提取等值面(Iso-surface)。具体步骤如下:

  • 将三维空间划分为一个个小立方体,每个立方体包含 8 个角点。
  • 对每个立方体,计算其角点的 SDF 值。
  • 根据角点的 SDF 符号,使用查表法确定立方体的表面形状,从而提取出网格三角形。

这种方法通过选择一个合适的 SDF 等值面值(通常为零)来提取物体表面,并将其转化为网格形式。

(2) 法线计算

为了获得更加真实的渲染效果,通常需要计算物体表面的法线。在 SDF 中,法线可以通过计算距离场梯度来获得,即:

n(x,y,z)=∇SDF(x,y,z)\mathbf{n}(x, y, z) = \nabla \text{SDF}(x, y, z)

n(x,y,z)=∇SDF(x,y,z)

计算出来的法线用于后续的光照计算。

(3) 网格优化

从 SDF 提取出的网格可能是非常密集的,并且包含很多小三角形。为了提高性能和降低存储要求,通常会对网格进行简化。例如,使用 Quadric Error Metric (QEM)Laplacian Smoothing 等技术来优化网格的拓扑和形状。

5. SDF 的应用

(1) 计算机图形学和可视化

  • 表面重建:通过将 SDF 转换为网格,能够从稀疏的或不完全的数据中重建出完整的三维物体表面。
  • 体积渲染:SDF 可以表示体积数据(例如医学图像),并通过体积渲染技术生成图像。

(2) 物理模拟

  • 碰撞检测:SDF 在物理模拟中非常有用,可以通过计算点到物体表面的距离来检测物体之间是否发生碰撞。
  • 流体模拟:SDF 用于表示流体的边界,并通过跟踪边界的变化来实现流体模拟。

(3) 计算机视觉

  • 深度估计:通过从多个视角计算物体表面的 SDF,可以进行三维重建,恢复物体的完整形状。
  • 目标跟踪:SDF 可以用于跟踪物体的表面变化,帮助在动态场景中追踪物体。

6. SDF 与其他表示方法的比较

表示方法优点缺点
SDF- 简单的数学表示- 渲染效率较低
- 平滑且连续的表面表示- 需要额外的网格化步骤
- 易于与物理模拟结合
点云- 直接采集自现实世界- 无法直接表示物体表面,通常较稀疏
三角网格- 渲染效率高,易于渲染- 不适合处理复杂变形
- 可以直接用于3D打印和动画制作- 较为不连续,容易出现裂缝或不平滑的表面

7. 总结

SDF(Signed Distance Function) 是一种强大的三维物体表示方法,能够通过每个空间点到物体表面的距离及其符号,提供一个平滑且连续的物体表面表示。SDF 在计算机图形学、物理模拟、3D重建等领域有着广泛应用,其优势在于对物体的内部和外部有明确的区分,并且容易与其他计算(如碰撞检测和流体模拟)结合。虽然 SDF 不能直接用于渲染,但通过算法如 Marching Cubes,它可以很容易地转换为传统的三维网格,供后续的渲染和优化使用。

TSDF

本质上也是基于体素的方法(数据结构实现方面)

讲解: 截断符号距离函数

GLM

TSDF(Truncated Signed Distance Function,截断符号距离函数)是一种常用于三维计算机视觉和图形学中的体积表示方法。它通过存储每个体素(voxel)到最近表面的符号距离来表示三维空间中的物体。以下是TSDF的基本概念和特点:

基本概念

  1. 体素(Voxel)
    • 三维空间被划分为一系列小的立方体,每个立方体称为一个体素。
  2. 符号距离
    • 对于每个体素,计算其中心点到最近物体表面的距离。
    • 如果体素在物体内部,距离为负;如果在物体外部,距离为正。
  3. 截断
    • 距离值被截断在一个特定的范围内(例如,-1到1米)。超出这个范围的距离被设置为截断值。

特点

  1. 连续性
    • TSDF提供了空间中点到表面距离的连续表示,便于进行梯度计算和优化。
  2. 表面重建
    • 通过提取等值面(如距离为零的表面),可以重建物体的三维表面。
  3. 融合
    • 多视角的深度数据可以融合到同一个TSDF体积中,形成更完整的三维表示。
  4. 内存效率
    • 由于只存储距离值,TSDF相对于其他表示方法(如点云或网格)可以更高效地利用内存。
  5. 处理遮挡
    • TSDF能够处理部分遮挡的情况,因为它是基于体素的累积表示。

应用

  1. 三维重建
    • 从多视角的深度图像中重建物体的三维模型。
  2. 实时渲染
    • 用于实时三维渲染,特别是与深度相机结合使用时。
  3. 机器人导航
    • 在机器人导航和避障中使用,提供环境的三维信息。
  4. 增强现实(AR)和虚拟现实(VR)
    • 用于AR和VR中的环境映射和物体跟踪。

计算过程

  1. 初始化
    • 创建一个三维体素网格,并将所有体素的距离初始化为截断值。
  2. 深度图像输入
    • 输入深度图像,将其转换为三维点云。
  3. 距离计算
    • 对于每个体素,计算其到最近点云点的距离和符号。
  4. 更新TSDF
    • 根据计算出的距离和符号,更新体素的TSDF值。
  5. 融合
    • 如果有多个视角,重复上述步骤,并将结果融合到同一个TSDF体积中。

优点和局限性

优点

  • 能够处理复杂的几何形状和部分遮挡。
  • 适用于实时应用。
    局限性
  • 对于非常精细的细节,可能需要高分辨率的体素网格,这会增加计算和存储需求。
  • 在处理大规模环境时,可能需要大量的内存。
    TSDF是一种强大而灵活的三维表示方法,广泛应用于各种三维计算机视觉和图形学任务中。随着计算能力的提升和算法的优化,TSDF在实际应用中的性能和效果也在不断改进。

神经网络

NeRF 隐式神经场

待续…

混合方法

DMTet

本文提出了一种新的显式、隐式结合的表达方式DMTET

初步可以理解为,先得到隐式SDF表达,然后利用可微的Marching Tetrahedra过程将SDF转化为显式的Mesh表达

MC/MT

通过输入粗略的点云/低分辨率体素,得到高分辨率Mesh表达。

https://blog.csdn.net/supersyzz/article/details/143208697

深度步进四面体(DMTet)是一种复杂的三维表示技术,基于步进四面体的概念,该方法用于等值面提取。与传统的步进立方体或步进四面体不同,后者在固定网格上操作,DMTet利用深度学习来增强表示的灵活性和准确性。DMTet的核心是使用神经网络预测三维空间的占据情况和外观。该网络通常以潜在代码或隐式函数作为输入,该输入编码了对象的形状和结构。空间被离散化为四面体,即小的四面体形体积元素。评估每个四面体的顶点以确定其占据值,指示它们是在对象表面内部还是外部。然后,使用这些占据值通过插值四面体顶点的值来提取表面,类似于传统步进方法的操作,但具有更自适应和学习的边界。

Tri-plane

三个正交平面 降维表达

三平面大约将三维空间划分为三个正交平面(通常与X、Y和Z轴对齐),从而允许高效地编码和渲染三维信息。每个平面捕获空间结构的不同方面,并且它们共同提供了一个全面的表示。三平面表示利用了复杂三维结构通常可以分解为更简单的二维投影这一事实,然后可以将这些投影重新组合以形成完整的三维模型。这种分解通过将问题的维度从三维降低到二维来简化三维数据的处理和操作。在实践中,这意味着关于三维对象或场景的信息被编码在三个单独的二维网格或纹理中,每个网格对应于一个正交平面。这些网格可以存储各种属性,如颜色、深度或占据情况,然后可以使用标准的二维图像处理技术进行处理。

三平面表示的一个关键优势是其能够在计算效率和三维重建质量之间取得平衡。通过利用三维对象和场景的固有结构,该方法可以在无需复杂且资源密集的三维体积处理的情况下实现高细节水平和准确性。这使得它特别适合性能至关重要的实时应用,如虚拟现实(VR)和增强现实(AR)。

3D Gaussian Splatting

详见3DGS文章

显示 vs. 隐式

在三维重建(3D Reconstruction)中,显式(Explicit)和隐式(Implicit)表达是两种常见的三维场景表示方法。它们的主要区别在于数据存储和处理的方式,以及如何描述和表示三维几何形状。理解这两种方法有助于选择适合特定应用的技术。

1. 显式表达 (Explicit Representation)

显式表示是指通过明确列举或定义三维物体的几何信息来表示三维空间的形状。简而言之,显式表示直接给出了物体的表面或边界,是一种可以直接可视化的表达方法。

a. 常见的显式表示方法:

  • 三角网格(Triangle Mesh)
    • 三角网格是最常见的显式表示方法之一,它通过一组顶点(vertices)和三角形面(faces)定义了三维物体的表面。每个三角形由三个顶点组成,三角形面通过这些顶点连接形成一个网格结构。
    • 网格顶点通常包含空间坐标(x, y, z),而面片则由这些顶点的索引定义。
    • 这种方法广泛应用于计算机图形学和三维建模,如在CAD游戏引擎动画制作中。
  • 多边形网格(Polygon Mesh)
    • 类似于三角网格,但在某些情况下,面片可以是其他多边形(如四边形)。这种表示方式在三维建模中也比较常见。
  • 点云(Point Cloud)
    • 点云是另一种显式表示方法,它通过一系列三维点来表示物体的表面或体积。每个点通常由一组空间坐标定义。
    • 点云广泛应用于激光扫描、视觉SLAM、深度相机等应用中,用于捕捉和表示物体表面的粗略形状。
  • 体素网格(Voxel Grid)
    • 体素网格是一种将空间划分为均匀立方体单元格(体素)的表示方法,通常用于表示体积数据。每个体素包含一定的属性(如颜色、密度等),用于表示三维物体的结构。
    • 体素网格通常用于医学影像、地质建模等领域,但由于其内存消耗较大,它在高分辨率应用中较少使用。

b. 显式表示的优点:

  • 直观性:显式表示直接给出了三维物体的表面或体积,容易理解和操作。
  • 几何计算:显式表示的数据结构(如三角网格)非常适合于几何计算、渲染和后期处理。
  • 易于渲染:显式表示的数据结构通常可以直接用于实时渲染,适用于游戏、动画等实时应用。

c. 显式表示的缺点:

  • 不连续性:显式表示无法描述物体的内部结构,尤其在处理复杂或细节丰富的几何时,可能会面临不规则网格或不连续表面的问题。
  • 数据量大:高精度的显式表示(如高分辨率的三角网格或点云)需要大量存储和计算资源,尤其是在大规模三维重建时。

2. 隐式表达 (Implicit Representation)

隐式表示不同于显式表示,它并不直接给出物体的几何结构,而是通过数学方程或函数来隐含描述三维物体的几何形状。隐式表示方法通过数学表达式来定义物体的表面或体积,通常不需要显式列出所有的点或面。

a. 常见的隐式表示方法:

  • 隐式表面(Implicit Surface)

    • 隐式表面使用数学方程来定义物体的形状。最常见的隐式表示方法是使用一个标量场(scalar field)或方程,通过该方程可以判断物体表面的位置。

    • 例如,**水平集方法(Level Set Method)**通过描述一个标量场(通常是一个体积数据或距离场)来表示物体的表面。物体的表面可以通过该函数值为零的点来表示。

    • 球体方程:一个简单的例子是一个球体,可以通过 来表示,其中 是球的半径。

      f(x,y,z)=x2+y2+z2−r2=0f(x, y, z) = x^2 + y^2 + z^2 - r^2 = 0

      rr

  • Signed Distance Function (SDF)

    • SDF 是隐式表示的一种形式,它表示物体表面上每个点到物体表面的最小距离。SDF值为零时表示表面,而正值表示表面外部,负值表示表面内部。SDF常用于描述复杂形状的物体,特别是动态形状和变化过程的建模。
  • 点云隐式函数

    • 另一种隐式表示方法是通过将点云数据转化为隐式表示,例如通过**核密度估计(Kernel Density Estimation, KDE)**等方法生成平滑的隐式表面。通过将离散的点云数据转化为一个连续的隐式场,可以获得更精确的表面描述。
  • 神经网络表示(Neural Implicit Representation)

    • 近年来,深度学习方法被应用于隐式表示。例如,神经网络(尤其是多层感知机,MLP)已被用于建模三维物体的隐式表面。通过神经网络来近似物体的隐式函数,可以生成连续、平滑的三维表面。代表性方法包括NeRF(Neural Radiance Fields)和DeepSDF等。

b. 隐式表示的优点:

  • 内存效率:隐式表示通常不需要显式存储整个三维几何形状,只需要存储一个数学函数或模型,因而更为内存高效。
  • 平滑性:隐式表示可以自然地处理物体的平滑表面,避免了显式网格在细节和边界处可能出现的失真。
  • 处理复杂形状:隐式方法能够描述非常复杂、细节丰富的物体形状,并且对形状的变化更为灵活,尤其适用于动态物体或形状变化的建模。

c. 隐式表示的缺点:

  • 渲染复杂性:隐式表示通常需要额外的计算来生成可视化输出。例如,通过求解隐式方程或计算SDF场来确定物体表面的位置,渲染复杂度较高。
  • 精度问题:隐式表示虽然能够描述非常平滑的表面,但它对于细节的刻画可能不如显式表示精确。高分辨率的细节可能难以通过隐式表示准确地捕捉。
  • 计算开销:一些隐式表示方法(如神经网络)可能需要较高的计算资源,特别是在训练和推理阶段。

3. 显式与隐式表达的对比

特性显式表示隐式表示
存储方式直接存储几何数据(如顶点、面、体素)通过方程或函数隐式表示几何形状
计算效率在渲染时计算效率较高,直接从数据中获取信息渲染时计算量较大,需要求解隐式方程
内存消耗存储所有几何信息,内存消耗较大只需要存储方程或模型,内存较高效
细节呈现高精度,适合精细的三维建模更适合描述平滑和复杂的形状
灵活性对动态场景的处理能力较差可以灵活地描述动态和变化的形状
应用领域适用于静态场景、精细建模和游戏渲染适用于动态建模、物理模拟和神经表示

4. 总结

显式表示和隐式表示各有优缺点,适用于不同的应用场景。显式表示适合需要精细控制和高精度的静态场景(如游戏和动画制作中的建模),而隐式表示则适合更复杂的动态场景和需要灵活处理复杂几何形状的应用。随着计算机图形学和深度学习技术的发展,隐式表示方法,尤其是

神经隐式方法,正逐步成为三维建模和重建的重要方向。

3DGS

GLM

3D Gaussian Splatting属于显式表达。
在3D Gaussian Splatting中,场景或物体是通过一系列具有位置、方向和大小等属性的3D高斯函数来表示的。这些高斯函数在空间中直接定义了物体的几何和外观信息,因此属于显式表达。
与隐式表达(如 Signed Distance Field、 Occupancy Field等)通过隐函数定义物体表面不同,显式表达如3D Gaussian Splatting直接提供了物体的几何细节和外观特征,便于进行渲染、碰撞检测等操作。
需要注意的是,虽然3D Gaussian Splatting本身是显式表达,但在某些情况下,它可以与隐式表达结合使用,以发挥两者的优势。例如,可以使用隐式表达来辅助3D Gaussian Splatting进行更高效的光线追踪或场景理解。
总的来说,3D Gaussian Splatting作为一种显式表达方法,在三维重建、渲染和计算机视觉等领域具有广泛的应用。

GPT

3D Gaussian Splatting 属于 显式表达(Explicit Representation)。

1. 为什么是显式表达?

3D Gaussian Splatting 中,三维场景是通过一组离散的高斯点(Gaussian points)来表示的,这些高斯点通常具有明确的空间位置(x,y,zx, y, z),以及可能的颜色、大小和其他属性。每个高斯点本身就是一个明确的、具有空间坐标和形状(例如,高斯分布的标准差)的实体,这与显式表示方法的特点一致。

显式表示的特征:

  • 明确的几何描述:3D Gaussian Splatting 直接通过高斯点定义三维物体的形状,类似于三角网格(Triangle Mesh)或点云(Point Cloud),每个点都有明确的坐标和属性。
  • 直接可视化:这些高斯点在空间中可以直接可视化,且通常用于渲染场景。

2. 与隐式表达的对比

在隐式表达中,物体的几何形状是通过方程(如隐式表面SDF(Signed Distance Function))定义的,而不是通过明确列举所有的点。物体的表面或体积通常通过某种数学函数或条件来隐含定义(例如,物体表面上的点是满足某个方程的点)。

3D Gaussian Splatting 直接通过显式的高斯点集合来描述物体表面,不需要通过数学方程来推导或计算物体表面的位置。因此,它属于显式表示方法。

3. 3D Gaussian Splatting的细节

  • 每个高斯点:代表了场景中的某个具体位置,并且具有形状(高斯分布),因此可以通过可视化或渲染这些点来构建三维物体的形状。
  • 点的属性:每个高斯点可能会有颜色、透明度、光照等属性,可以用于渲染物体。
  • 网格结构:与点云类似,3D Gaussian Splatting 可以看作是一个稀疏的、无网格化的结构,直接表示物体的表面。

4. 总结

3D Gaussian Splatting 是通过离散的高斯点集来表示三维场景,因此属于显式表达。这种方法与显式网格(如三角网格)类似,每个高斯点有明确的几何定义,可以直接用来渲染和表示物体的形状。