本文档系统讲解三维模型处理五大任务的经典方法与流派,从功能、方法、步骤、 示例、重难点代码、分析、总结(优劣与适用场景) 七个维度展开。 每个主题均配原理公式、可运行 Python 代码与演示图(
code/demo28–32*.py,全部实测通过)。衔接:本文是
三维识别-经典示例与代码.md(点线面体原理)与图形学与AI基础.md(CG×AI 数学底座)的工程全景版。
1. 三维模型识别与分类
1.1 功能
判断"这个三维物体是什么类别"(ModelNet40 的 40 类)。是三维理解最基础的任务, 输出类别概率。
1.2 三大表示流派
三维数据有三种主流表示,各衍生出一派方法:
| 流派 | 输入表示 | 代表方法 | 核心思想 |
|---|---|---|---|
| 视图法 | 多张 2D 投影图 | MVCNN, GVCNN | 用成熟 2D CNN,多视图特征融合 |
| 体素法 | 3D 体素网格 | 3DShapeNets, VoxNet | 3D 卷积,直观但计算量大 |
| 点云法 | 无序点集 | PointNet, PointNet++, PointMLP | 直接吃点,MLP 逐点 + 全局池化 |

1.3 经典方法(可运行)
形状描述子 + 分类器:用 PCA 特征值、紧凑度等几何描述子表示形状,喂给 SVM。
def descriptor(pc):
"""PCA 形状描述子: 3 特征值归一化 + 紧凑度 + 扁平度."""
c = pc.mean(0)
ev = np.sort(np.maximum(np.linalg.eigvalsh(np.cov((pc - c).T)), 1e-6))[::-1]
ev = ev / ev.sum()
compact = pc.std(0).mean()
flat = float(ev[0]) / (float(ev[2]) + 1e-6)
return np.concatenate([ev, [compact, flat]])
from sklearn.svm import SVC
svm = SVC(kernel='rbf').fit(X_train, y_train) # 3 类测试 acc = 1.00
PointNet 核心(深度学习,点云流派开山):逐点 MLP + 全局 MaxPool 聚合—— 关键是不变式:置换不变。
class PointNet(nn.Module):
def __init__(self, num_classes=40):
super().__init__()
self.mlp = nn.Sequential(
nn.Conv1d(3, 64, 1), nn.ReLU(), # 逐点升维
nn.Conv1d(64, 128, 1), nn.ReLU(),
nn.Conv1d(128, 1024, 1), nn.ReLU())
self.head = nn.Linear(1024, num_classes)
def forward(self, x): # x: (B, N, 3)
x = x.transpose(1, 2) # (B, 3, N)
x = self.mlp(x)
x = x.max(dim=2)[0] # 全局 MaxPool → 置换不变
return self.head(x)
1.4 分析
- 视图法:吃 2D CNN 红利,但需要渲染管线,丢失几何细节。
- 体素法:直观、3D 卷积天然,但分辨率受
O(n³)限制(体素法代表 VoxNet 仅 83%)。 - 点云法:直接、参数少,PointMLP 达 93.7%(当前点云分类 SOTA 之一)。
1.5 总结
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 形状描述子 | 可解释、快、无需训练 | 表达力弱,复杂形状不行 | 简单几何分类、特征检索 |
| 视图法 | 吃 2D 红利,效果好 | 渲染开销、几何信息损失 | 有现成多视图渲染的任务 |
| 体素法 | 结构规整、CNN 直接可用 | 计算量大、分辨率受限 | 低分辨率、内存充裕 |
| 点云法 | 直接高效、参数少、SOTA | 无序性处理复杂 | 实时点云识别、嵌入式 |
2. 三维模型分割
2.1 功能
把点云/网格划分成语义或实例区域:语义分割(给每点类别)、实例分割(区分个体)、 部件分割(ShapeNetPart 的"飞机→机翼/机身")。
2.2 经典方法(区域生长,可运行)
核心思想:从种子点出发,向几何一致(法向相似、距离近)的邻域生长,聚成区域。

def region_grow(pc, normals, th_angle=0.3, th_dist=0.1, min_size=50):
"""区域生长: 法向夹角 + 到平面距离约束."""
labels = np.full(len(pc), -1)
nn = NearestNeighbors(n_neighbors=20).fit(pc)
_, idx_all = nn.kneighbors(pc)
label = 0
for seed in range(len(pc)):
if labels[seed] != -1: continue
queue, labels[seed] = [seed], label
count = 0
while queue:
cur = queue.pop(); count += 1
for nb in idx_all[cur]:
if labels[nb] != -1: continue
if np.abs(np.dot(normals[cur], normals[nb])) > np.cos(th_angle):
if np.abs((pc[nb]-pc[seed]) @ normals[seed]) < th_dist:
labels[nb] = label; queue.append(nb)
if count < min_size: labels[labels==label] = -1
label += 1
return labels
2.3 深度学习流派
- PointNet++:分层(FPS + 局部聚合)分割,是点云分割基线。
- 语义分割:每个点输出类别概率(类似分类头作用于每个点)。
- 图割/超体素:把点云聚成超体素再图分割。
2.4 总结
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 区域生长 | 简单、可解释、无监督 | 对噪声/阈值敏感 | 平面/曲面分割、点云预处理 |
| 超体素+图割 | 鲁棒、考虑全局 | 超参数多、慢 | 大规模场景分割 |
| 深度学习分割 | 精度高、语义 | 需标注数据 | 自动驾驶、零件语义分割 |
3. 快速建模(三维重建)
3.1 功能
从多张照片/单张图恢复三维模型。传统几何方法(SfM/MVS/ICP)与神经方法(NeRF/3DGS)。
3.2 经典方法(可运行)
多视图三角化(SfM):多个视角下同名点 → 三角化恢复 3D 坐标。
def triangulate(views, uvs):
"""多视图 DLT 三角化: 每个点解 AX=0."""
rec = []
for k in range(len(true)):
A = []
for P, uv in zip(views, uvs):
u, v = uv[k]
A.append(u * P[2] - P[0]); A.append(v * P[2] - P[1])
_, _, Vt = np.linalg.svd(np.array(A))
X = Vt[-1]; rec.append(X[:3] / X[3]) # 4视图误差 0.0007
return np.array(rec)
ICP 配准:把多片部分点云对齐拼成完整模型(最近邻 + Kabsch 最小二乘刚体变换)。
def icp(src, tgt, iters=50):
nn = NearestNeighbors(n_neighbors=1).fit(tgt)
src_cur = src.copy()
for _ in range(iters):
_, idx = nn.kneighbors(src_cur); corr = tgt[idx[:, 0]]
cs, ct = src_cur.mean(0), corr.mean(0)
U, S, Vt = np.linalg.svd((src_cur-cs).T @ (corr-ct))
R = Vt.T @ U.T
if np.linalg.det(R) < 0: R[:, -1] *= -1
t = ct - R @ cs
src_cur = (R @ src_cur.T).T + t
return src_cur, T # 误差 0.38 → 0.03

3.3 神经方法(NeRF / 3DGS)
- NeRF:神经网络表示场景(颜色+密度),体渲染合成新视图,从多视图照片学出连续场景。
- 3D Gaussian Splatting:用可微高斯集合替代网络,快几个数量级,实时渲染。
3.4 总结
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SfM/MVS | 精确、可解释、无需训练 | 需多视图、特征匹配易失败 | 摄影测量、文物重建 |
| ICP | 简单、成熟 | 需良好初始位姿、局部最优 | 配准拼接、SLAM 后端 |
| NeRF | 连续、照片级、可新视角 | 慢、需密集多视图、算力高 | 高质量重建、虚拟场景 |
| 3DGS | 实时、高质量 | 显存大、训练需多视图 | 实时渲染、数字人 |
4. 自动化建模
4.1 功能
用参数/规则/生成模型自动创建三维模型,无需手工建模。
4.2 程序化建模(可运行)
用数学规则生成形状(旋转体、挤出、分形)——"参数 → 模型"。

def lathe_mesh(a, b, nz=40, nt=40):
"""参数化旋转体: 母线 r(z) 绕 z 轴. 参数 a,b 控制形状."""
z = np.linspace(0, 1, nz)
r = a * (0.4 + 0.6 * np.sin(b * z * np.pi + 0.3) ** 2) # 母线
th = np.linspace(0, 2*np.pi, nt)
Z, T = np.meshgrid(z, th)
R = np.tile(r, (nt, 1))
return R*np.cos(T), R*np.sin(T), Z # 花瓶/杯子/铃铛
4.3 生成式建模(深度学习)
- VAE:编码器把形状压到隐空间,解码器从隐向量生成形状——隐空间即"形状语义"。
- 扩散模型(Diffusion):从噪声逐步去噪生成形状(3D Diffusion),当前 AIGC 主流。
- 程序化规则库:建筑/城市生成的规则系统(分形、L-system)。
4.4 总结
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 程序化建模 | 可控、可复现、零数据 | 手工写规则、表达有限 | 工业标准件、地形/城市 |
| 参数化建模 | 连续变形、可优化 | 参数语义需设计 | CAD 设计、产品变体 |
| VAE | 隐空间可插值 | 生成模糊 | 形状补全、风格迁移 |
| 扩散模型 | 质量高、多样性好 | 慢、算力大 | AIGC、概念设计 |
5. 模型分析
5.1 功能
分析模型的几何与拓扑性质:法向、曲率、拓扑结构(水密性)、特征统计。
5.2 经典方法(可运行)
法向估计(PCA 邻域)、曲率(有限差分)、拓扑(Euler 特征数)。

def compute_normals(pc, k=12):
"""PCA 法向估计: 邻域协方差最小特征向量."""
nn = NearestNeighbors(n_neighbors=k).fit(pc)
_, idx = nn.kneighbors(pc)
normals = np.zeros_like(pc)
for i, ni in enumerate(idx):
w, v = np.linalg.eigh(np.cov((pc[ni] - pc[i]).T))
normals[i] = v[:, np.argmin(w)]
return normals
Euler 特征数(拓扑分析核心):χ = V − E + F,封闭曲面 χ=2—— 用于验证网格是否"水密"(无洞、无边界边)。
# 二十面体: V=12, E=30, F=20 → χ = 12-30+20 = 2 ✓ (验证封闭)
E = len(set(tuple(sorted([f[i,j], f[i,(j+1)%3]])) for i in range(F) for j in range(3)))
euler = V - E + F # = 2
5.3 总结
| 分析项 | 方法 | 用途 |
|---|---|---|
| 法向 | PCA 邻域协方差 | 光照、分割、重建前处理 |
| 曲率 | 有限差分 / 特征分析 | 特征检测、简化、分割依据 |
| 拓扑 | Euler 特征 / Betti 数 | 水密性验证、拓扑结构理解 |
| 几何统计 | PCA 特征值、紧凑度 | 形状描述、检索、分类特征 |
6. 五大任务总对比
| 任务 | 输入 | 输出 | 经典流派 | 深度学习流派 | 核心难点 |
|---|---|---|---|---|---|
| 识别/分类 | 点云/视图/体素 | 类别 | 形状描述子+SVM | PointNet/PointMLP | 无序性、表示选择 |
| 分割 | 点云/网格 | 区域/语义标签 | 区域生长、图割 | PointNet++ | 边界、语义 |
| 快速建模 | 多视图/单图 | 3D 模型 | SfM/MVS/ICP | NeRF/3DGS | 深度恢复、遮挡 |
| 自动化建模 | 参数/噪声/规则 | 3D 模型 | 程序化/参数化 | VAE/Diffusion | 多样性、可控性 |
| 模型分析 | 模型本身 | 几何/拓扑属性 | PCA/曲率/Euler | 特征学习 | 可解释性 |
主线认识:五大任务共享同一个底层——"如何表示与编码三维几何"。 经典方法靠可解释的几何描述子(PCA/曲率/法向),深度方法靠可学习的表示(MLP/卷积/注意力)。 它们不是替代关系:经典方法提供可解释的几何先验与验证手段, 深度方法提供端到端的高精度;工业系统往往两者结合。
7. 附录:运行演示脚本
| 章节 | 脚本 | 输出图 |
|---|---|---|
| 1 识别/分类 | code/demo28_3d_classify.py | figures/fig3d_classify.png |
| 2 分割 | code/demo29_3d_segment.py | figures/fig3d_segment.png |
| 3 快速建模 | code/demo30_3d_reconstruct.py | figures/fig3d_reconstruct.png |
| 4 自动化建模 | code/demo31_3d_automodel.py | figures/fig3d_automodel.png |
| 5 模型分析 | code/demo32_3d_analysis.py | figures/fig3d_analysis.png |
# 依赖: numpy, scipy, scikit-learn, networkx, opencv-python, matplotlib
python demo28_3d_classify.py
python demo29_3d_segment.py
# ... 依次类推
衔接:本文的
3 快速建模深度部分(NeRF/3DGS)详见图形学与AI基础.md第 9 节;5 模型分析的拓扑(Euler 特征)与三维识别-经典示例与代码.md的"面识别"一脉相承。