本文档系统讲解三维模型处理五大任务的经典方法与流派,从功能、方法、步骤、 示例、重难点代码、分析、总结(优劣与适用场景) 七个维度展开。 每个主题均配原理公式、可运行 Python 代码与演示图(code/demo28–32*.py,全部实测通过)。

衔接:本文是 三维识别-经典示例与代码.md(点线面体原理)与 图形学与AI基础.md (CG×AI 数学底座)的工程全景版。


1. 三维模型识别与分类

1.1 功能

判断"这个三维物体是什么类别"(ModelNet40 的 40 类)。是三维理解最基础的任务, 输出类别概率。

1.2 三大表示流派

三维数据有三种主流表示,各衍生出一派方法:

流派输入表示代表方法核心思想
视图法多张 2D 投影图MVCNN, GVCNN用成熟 2D CNN,多视图特征融合
体素法3D 体素网格3DShapeNets, VoxNet3D 卷积,直观但计算量大
点云法无序点集PointNet, PointNet++, PointMLP直接吃点,MLP 逐点 + 全局池化

三维模型识别与分类
三维模型识别与分类

1.3 经典方法(可运行)

形状描述子 + 分类器:用 PCA 特征值、紧凑度等几何描述子表示形状,喂给 SVM。

Python
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 聚合—— 关键是不变式:置换不变。

Python
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 经典方法(区域生长,可运行)

核心思想:从种子点出发,向几何一致(法向相似、距离近)的邻域生长,聚成区域。

三维点云分割
三维点云分割

Python
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 坐标。

Python
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 最小二乘刚体变换)。

Python
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 程序化建模(可运行)

用数学规则生成形状(旋转体、挤出、分形)——"参数 → 模型"。

三维自动化建模
三维自动化建模

Python
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 特征数)。

三维模型分析
三维模型分析

Python
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—— 用于验证网格是否"水密"(无洞、无边界边)。

Python
# 二十面体: 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. 五大任务总对比

任务输入输出经典流派深度学习流派核心难点
识别/分类点云/视图/体素类别形状描述子+SVMPointNet/PointMLP无序性、表示选择
分割点云/网格区域/语义标签区域生长、图割PointNet++边界、语义
快速建模多视图/单图3D 模型SfM/MVS/ICPNeRF/3DGS深度恢复、遮挡
自动化建模参数/噪声/规则3D 模型程序化/参数化VAE/Diffusion多样性、可控性
模型分析模型本身几何/拓扑属性PCA/曲率/Euler特征学习可解释性

主线认识:五大任务共享同一个底层——"如何表示与编码三维几何"。 经典方法靠可解释的几何描述子(PCA/曲率/法向),深度方法靠可学习的表示(MLP/卷积/注意力)。 它们不是替代关系:经典方法提供可解释的几何先验与验证手段, 深度方法提供端到端的高精度;工业系统往往两者结合。


7. 附录:运行演示脚本

章节脚本输出图
1 识别/分类code/demo28_3d_classify.pyfigures/fig3d_classify.png
2 分割code/demo29_3d_segment.pyfigures/fig3d_segment.png
3 快速建模code/demo30_3d_reconstruct.pyfigures/fig3d_reconstruct.png
4 自动化建模code/demo31_3d_automodel.pyfigures/fig3d_automodel.png
5 模型分析code/demo32_3d_analysis.pyfigures/fig3d_analysis.png
Bash
# 依赖: 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 的"面识别"一脉相承。