---
title: "PCL 贪婪投影三角化：从有向点云生成局部网格"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/pcl-greedy-projection-triangulation/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/08-图形学与三维重构/PCL贪婪投影三角化表面重建（转载）.md"
content_hash: 611f57ae8e3493a68a3b3a555f6169b7242efccd088794619a6f2d03d6f760dd
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# PCL 贪婪投影三角化：从有向点云生成局部网格

> **note · 来源与许可**
> 旧稿是 2014 年 CSDN 文章转载，导出内容未保留明确转载许可，故原转载已移入私有来源归档。本文是依据 PCL 官方教程重新编写的独立摘要；示例接口以 PCL 当前文档为准。PCL 项目使用 BSD 许可证。

## 算法适用条件

`GreedyProjectionTriangulation`（GP3）把点与法线投影到局部切平面，在邻域中逐步连接三角形。它适合局部平滑、采样较均匀且法线可靠的无组织点云。

它不是通用“点云一键变网格”方案。以下情况容易失败：

- 噪声和离群点较多；
- 法线方向不一致；
- 密度突变、大孔洞或遮挡严重；
- 薄壁两侧距离小于搜索尺度；
- 尖锐边缘被平滑或误连接。

## 基本流程

1. 清理离群点，并视情况使用 MLS 平滑。
2. 估计法线并统一方向。
3. 将坐标与法线合并为 `pcl::PointNormal`。
4. 配置搜索半径、邻居数量、角度约束和 `mu`。
5. 生成 `pcl::PolygonMesh` 并检查连通分量与点状态。

```cpp
#include <pcl/point_types.h>
#include <pcl/search/kdtree.h>
#include <pcl/surface/gp3.h>

pcl::PointCloud<pcl::PointNormal>::Ptr cloud(
    new pcl::PointCloud<pcl::PointNormal>);

pcl::search::KdTree<pcl::PointNormal>::Ptr tree(
    new pcl::search::KdTree<pcl::PointNormal>);
tree->setInputCloud(cloud);

pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
gp3.setInputCloud(cloud);
gp3.setSearchMethod(tree);
gp3.setSearchRadius(0.03);          // 按点间距与几何尺度确定
gp3.setMu(2.5);                    // 候选搜索半径的自适应系数
gp3.setMaximumNearestNeighbors(100);
gp3.setMaximumSurfaceAngle(M_PI / 4);
gp3.setMinimumAngle(M_PI / 18);
gp3.setMaximumAngle(2 * M_PI / 3);
gp3.setNormalConsistency(false);   // 取决于法线方向是否已统一

pcl::PolygonMesh mesh;
gp3.reconstruct(mesh);
```

示例数值来自官方教程的演示配置，不是所有数据集的推荐值。

## 调参思路

- 先估计近邻距离分布，再设置 `searchRadius`，避免直接照搬绝对数值。
- `mu` 让搜索尺度随最近邻距离变化，但无法修复极端密度差异。
- 邻居上限过低可能形成孔洞，过高会增加错误连接和计算量。
- 表面角与三角形最小/最大角约束用于抑制跨折角连接和瘦长三角形。
- 若法线方向已一致，可根据数据含义配置 `normalConsistency`；设置错误可能导致连接缺失或方向异常。

## 结果校验

- 可视化三角形法线、边长和最小角分布。
- 检查薄壁、边界、孔洞和不同连通分量。
- 比较网格到原始点云的距离，防止平滑后几何漂移。
- 对后续需要封闭流形的任务，额外执行拓扑修复；GP3 不保证自动得到水密网格。

## 参考资料

- [PCL 官方教程：Fast triangulation of unordered point clouds](https://pointclouds.org/documentation/tutorials/greedy_projection.html)
- [PCL BSD License](https://github.com/PointCloudLibrary/pcl/blob/master/LICENSE.txt)
