3D 资产的表征方式
在谈到 3D
资产的一些相关研究时,面临的首要问题就是:我们要以一种什么样的方式去表征一个 3D 物体?从直观感觉出发,我们实际上第一反应的好坏与否,来源于该表征渲染的结果是否真实合理,而更深层次地,如何去渲染,以及关注哪些信息,侧重点的不同导致了不同的表征方式,这一部分旨在总结目前已有的一些表征方式,应用场景及其优缺点。
面表达
首先想到的是,既然我们的最终目标是渲染结果的真实性,那么重点关注 3D
资产的每一个面的形状与颜色,考虑如何描述物体的边界或表面,即我们“看得见”的部分,比如一个杯子的外壳,而不是内部结构。这就是面表达。常见的形式有:
表示类型 | 描述 |
---|---|
三角网格(Triangle Mesh) | 最常用的方式,由顶点、边和三角形面片组成,保留几何结构与拓扑关系 |
点云(Point Cloud) | 仅表示散布在物体表面的离散点,通常无拓扑结构 |
B-样条曲面(B-Rep) / NURBS | 用数学函数(如样条)精确拟合曲面,常用于 CAD |
隐式曲面(如 SDF) | 用一个函数定义“离表面的距离”,曲面为零等势面 |
Mesh 表征
该种方法采用三角面片去逼近真实物体的表面。储存不同的顶点,以及哪些顶点会组成一个三角面元。形式如下:
Vertices:
V0: (0,0,0)
V1: (1,0,0)
...
Faces:
F0: [V0, V1, V2]
F1: [V0, V2, V3]
...
这里的顶点坐标是 在某个坐标系下的三维点。但这个坐标系可以是任意的,并没有一个固定“世界单位”约束,所以大小的含义依赖于不同系统下对坐标系单位的定义。在深度学习中, mesh
常被归一化道单位球中,有时也会用 bounding box
来调整物体尺寸。
对 mesh
而言,由于其较高的表面精度,表面拓扑信息完整,可编辑性强且硬件渲染支持好,因此是当前 3D
建模领域的主流格式。但在表达连续密度场、真实材质或新视角生成时略逊。同时几何面片的数量与表达准确性,渲染效率之间也存在一定的平衡关系需要考量。主要应用场景有:
- 游戏引擎:在
Unity, Unreal
中的模型载入与渲染(人物,场景,道具等)。 - 动画,影视制作:使用一些主流建模软件如
Blender, Maya
等创建可绑定骨骼的mesh
模型,进而实现运动控制与影视的制作。 Web3D
:在一些前端渲染框架如WebGL, Three.js
中实现快速的模型渲染与展示,支持obj, gltf
等格式。GIS
以及地形重建:可以将一些DEM
(数字高程图)转为地形三角网格。- 医学影像:在经过某些
MRI/CT
得到的数据分割后可用于人体器官结构的重建工作。
点云
从采集信息的角度出发,假设现在面前有一个真实的 3D
物体,那么我们如何将其转化为电子信息进行储存呢?很明显上面的采用三角面片表征的方式并不容易确定每个顶点的具体位置,我们只能围绕该物体一个点一个点进行采样,尝试通过足够多的采样点来对实际物体进行一个表征,这就是点云的基本思想。点云是由一组三维空间中的离散点集合组成的数据结构。每个点通常表示一个物体或场景的表面采样点,其基本单位是:
即:三维坐标 + 可选颜色信息
这种格式随着激光扫描技术和立体视觉的发展自然出现。其主要优势有:
- 三维数据获取更直接:与传统图像相比,点云可以表达真实世界几何结构。
- 无需连接拓扑:避免了网格(
mesh
)中面连接的不确定性。 - 硬件天然支持:很多
3D
传感器输出就是点云(如LiDAR
、Kinect
、RGBD
摄像头)。
相对地,不包含拓扑结构也导致了其无法应用于高精要求的物理仿真以及 3D
打印等场合。而采样所带来的不规则稀疏也使得处理起来不像图片那样可以直接处理,需要特殊如 PointNet 等结构。而采样也不可避免会引入一定的噪声,存在误差,遮挡,缺失等问题。可视化也较为复杂。应用场景更多偏向于需要怪苏生成以及并没有很高精度要求的场合如自动驾驶,工业扫描检测,虚拟现实,大型建筑三维重绘等。
总之,点云是轻量、灵活的 3D 表达方式,适用于数据采集、感知分析等场景,但缺乏拓扑和结构语义,需要配合后处理或深度模型进行补全与理解。
B-Rep 样条
B-样条曲面 和 NURBS(Non-Uniform Rational B-Splines),是工业级三维建模中最精确和广泛使用的一类 参数化曲面表示方法,是边界表示(B-Rep
的重要实现形式。这些方法的核心是:用控制点和基函数来构造连续、光滑、可编辑的曲线与曲面,相比于网格(mesh
)或点云,强调的是数学精度与几何连续性,广泛应用于 CAD/CAM
、曲面设计、航空、汽车制造等高要求的领域。
以 NURBS
曲面为例,这是一种通过控制点网格来精确构建平滑曲面的数学方法。它的核心思想是:用一组二维参数 $(u, v) \in [0, 1] ^2$ 来控制一个三维曲面,通过加权平均的方式将控制点的影响组合起来,构建出一个连续、可调的曲面。定义公式如下:
其中:
- $\mathbf{S}(u,v)$:是参数$u,v$对应的三维曲面点
- $\mathbf{P}_{ij}$:控制点构成的二维网格
- $w_{ij}$:控制点的权重,用于增强对局部曲率的控制
- $N_{i,p}(u),M_{j,q}(v)$:B 样条基函数,定义控制点对曲面形状的影响范围
- $p,q$:分别表示在$u$、$v$方向的曲面阶数 (例如三次)
每个控制点通过基函数和权重参与整个曲面的生成,而非均匀节点向量则允许曲面在不同区域具有不同的参数间隔与光滑度。通过显示的函数表达的方式,精确地表示经典几何(圆,椭球,圆锥曲面等),可对局部曲率进行直接调整,并且具有连续的光滑曲面。常用于 CAD
及工业零件等需要高精度几何控制的场景。围绕数学公式插值控制,该种方法的优缺点主要有:
类别 | 优点 | 缺点 |
---|---|---|
✨ 精度 | 可精确表示圆、球、圆锥曲面等经典几何体 | 曲面不一定过控制点,难以精确插值控制 |
✂️ 可编辑性 | 控制点局部控制性强,调节简单 | 控制点网格对非专家用户不直观 |
🧠 数学性质 | 拥有良好的连续性($C^n$ 连续)、参数化 | 公式复杂,计算和实现成本高 |
📐 拓扑控制 | 适合表示规则拓扑结构曲面 | 不适合拓扑不规则或有洞、分支的结构 |
💾 存储效率 | 用少量参数表示复杂形状(高压缩) | 不易与图像、点云等稀疏数据结合 |
🖥️ 渲染支持 | CAD 软件、渲染引擎广泛支持 | GPU 直接渲染不如网格高效 |
SDF
SDF(Signed Distance Function) 最早的系统性研究可以追溯到 Level Set Method(Osher & Sethian, 1988),该方法使用 SDF 来跟踪运动中的曲面。
设一个三维物体的表面为 $\mathcal{S} \subset \mathbb{R}^3$,则 SDF 是一个函数:
$$ f:R^3 \rightarrow R $$其定义为:
$$ f(\mathbf{x})= \begin{cases} +d(\mathbf{x},\mathcal{S}) & \mathrm{if~}\mathbf{x}\text{ is outside the object} \\ 0 & \mathrm{if~}\mathbf{x}\in\mathcal{S} \\ -d(\mathbf{x},\mathcal{S}) & \mathrm{if~}\mathbf{x}\text{ is inside the object} & & \end{cases} $$其中 $d(\mathbf{x}, \mathcal{S}) = \min_{\mathbf{y} \in \mathcal{S}} | \mathbf{x} - \mathbf{y} |_2$ 是 $\mathbf{x}$ 到表面最近点的欧几里得距离。
对一些传统表征方法,可以较为直接地进行 SDF
的计算;
- 体素网格(
voxel grid
):预定义一个3D
网格,在每个体素中心计算该点的SDF
。 - 基于网格模型计算
SDF
: 对于一个三角形面片网格,可以通过最近点搜索(point-to-triangle
)来计算任意点的SDF
。
在 DeepSDF (Park et al., CVPR 2019) 出来之后,也会有很多神经网络模型如 DeepSDF, StEik 使用多层感知机直接将 $f(\mathbf{x})$ 作为输出:
$$ f_\theta(\mathbf{x})\approx\text{SDF value at }\mathbf{x} $$这种隐式的表达由于是连续函数,其优势主要有:
-
连续性强:天然是连续函数,适合求导和优化。
-
拓扑灵活:不依赖网格结构,可表示任意复杂或变化的拓扑。
-
布尔操作简单:体素级别直接取 min/max 可进行并集/交集。
-
可用于重建:如深度图重建、场景扫描等。
但于此同时,相比其他表征方式,SDF
也是最难以获取的一种方式,主要缺点有:
-
表面渲染需显式提取:如 Marching Cubes 算法提取 0 等值面,计算量大。
-
训练困难:神经表示可能难以精确表达细节、薄层结构。
-
不适合传统图形流水线:需要显式转换成 mesh 进行渲染。
和其他的一些方法的比较:
表示方法 | 类型 | 核心思想 | 优势 | 劣势 |
---|---|---|---|---|
SDF | 隐式表示 | 用函数 $f(\mathbf{x})=0$ 定义曲面 | 光滑、连续、易于布尔运算、支持拓扑变化 | 表面提取成本高(如需 Marching Cubes),细节难控制 |
Mesh(三角网格) | 显式表示 | 顶点 + 面组成表面 | 高效渲染、表达精确、图形硬件兼容 | 不利于拓扑变化,难以表达复杂曲面 |
Point Cloud | 显式散点表示 | 表面以离散点集合表示 | 易采集(如激光扫描),灵活,快速 | 缺乏拓扑信息,表面重建困难 |
Voxel Grid | 显式体素表示 | 三维空间分割为小立方体 | 可并行计算、支持布尔和物理模拟 | 内存消耗大,分辨率受限 |
体表达
有些时候除去关注表面信息以及渲染结果之外,还需要关注一些额外的信息,如一个玻璃杯的透明如何表达,以及物体和真实世界的交互等,这样就涉及到了许多的物理参数。而一个真实物体的某个物体特性不可能处处均相等,这就不得不逼迫我们对物体整个进行建模。对整个 三维空间中的体素(Voxel)或函数值 进行建模,不仅包含物体表面,还包含物体内部,甚至可以表示“透明/密度/材料”等属性,这种方式称之为体表达。常见的形式有:
表示类型 | 描述 |
---|---|
体素网格(Voxel Grid) | 3D 网格中的每个体素为一个立方体,类似 3D 像素 |
TSDF(Truncated Signed Distance Function) | 每个体素存储离表面最近的有符号距离,常用于 KinectFusion |
NeRF 场景体积函数 | 每个空间坐标映射为颜色 + 密度,表示连续空间的光场 |
Octree 表示 | 用分层体素(空间八叉树)高效建模稀疏区域,提高内存利用率 |
Voxel 体素与 Octree
3D GS Splatting
高斯球
混合表达,博采众长
既然表征方式如此之多,各有千秋,那么我们能否借助多种表征方式,实现更加完整全面的表达呢?
新表征:借助不同视锥的表征
该种表征方式来源于近期的一篇论文:MASH: Masked Anchored SpHerical Distances for 3D Shape Representation and Generation。
三维生成发展现状与研究问题
还没写完,占个楼