{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation/",
  "atlas": "https://www.pystone.net/?node=pcl-greedy-projection-triangulation#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation.md",
  "context": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:pcl-greedy-projection-triangulation",
  "slug": "pcl-greedy-projection-triangulation",
  "title": "PCL 贪婪投影三角化：从有向点云生成局部网格",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "PCL 贪婪投影三角化：从有向点云生成局部网格",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "611f57ae8e3493a68a3b3a555f6169b7242efccd088794619a6f2d03d6f760dd",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "PCL 贪婪投影三角化：从有向点云生成局部网格",
      "anchor": "pcl-贪婪投影三角化从有向点云生成局部网格",
      "citation": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation/#pcl-%E8%B4%AA%E5%A9%AA%E6%8A%95%E5%BD%B1%E4%B8%89%E8%A7%92%E5%8C%96%E4%BB%8E%E6%9C%89%E5%90%91%E7%82%B9%E4%BA%91%E7%94%9F%E6%88%90%E5%B1%80%E9%83%A8%E7%BD%91%E6%A0%BC"
    },
    {
      "depth": 2,
      "text": "算法适用条件",
      "anchor": "算法适用条件",
      "citation": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation/#%E7%AE%97%E6%B3%95%E9%80%82%E7%94%A8%E6%9D%A1%E4%BB%B6"
    },
    {
      "depth": 2,
      "text": "基本流程",
      "anchor": "基本流程",
      "citation": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation/#%E5%9F%BA%E6%9C%AC%E6%B5%81%E7%A8%8B"
    },
    {
      "depth": 2,
      "text": "调参思路",
      "anchor": "调参思路",
      "citation": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation/#%E8%B0%83%E5%8F%82%E6%80%9D%E8%B7%AF"
    },
    {
      "depth": 2,
      "text": "结果校验",
      "anchor": "结果校验",
      "citation": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation/#%E7%BB%93%E6%9E%9C%E6%A0%A1%E9%AA%8C"
    },
    {
      "depth": 2,
      "text": "参考资料",
      "anchor": "参考资料",
      "citation": "https://www.pystone.net/notes/pcl-greedy-projection-triangulation/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:graphics-and-3d-reconstruction",
      "title": "图形学与三维重构",
      "url": "https://www.pystone.net/notes/graphics-and-3d-reconstruction/",
      "atlas": "https://www.pystone.net/?node=graphics-and-3d-reconstruction#knowledge-atlas",
      "label": "图形学与三维重构",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "本层中的“PCL贪婪投影三角化表面重建（转载）”导航项",
      "citation": "https://www.pystone.net/notes/graphics-and-3d-reconstruction/#%E6%9C%AC%E5%B1%82"
    }
  ],
  "contentMarkdown": "# PCL 贪婪投影三角化：从有向点云生成局部网格\n\n> [!note] 来源与许可\n> 旧稿是 2014 年 CSDN 文章转载，导出内容未保留明确转载许可，故原转载已移入私有来源归档。本文是依据 PCL 官方教程重新编写的独立摘要；示例接口以 PCL 当前文档为准。PCL 项目使用 BSD 许可证。\n\n## 算法适用条件\n\n`GreedyProjectionTriangulation`（GP3）把点与法线投影到局部切平面，在邻域中逐步连接三角形。它适合局部平滑、采样较均匀且法线可靠的无组织点云。\n\n它不是通用“点云一键变网格”方案。以下情况容易失败：\n\n- 噪声和离群点较多；\n- 法线方向不一致；\n- 密度突变、大孔洞或遮挡严重；\n- 薄壁两侧距离小于搜索尺度；\n- 尖锐边缘被平滑或误连接。\n\n## 基本流程\n\n1. 清理离群点，并视情况使用 MLS 平滑。\n2. 估计法线并统一方向。\n3. 将坐标与法线合并为 `pcl::PointNormal`。\n4. 配置搜索半径、邻居数量、角度约束和 `mu`。\n5. 生成 `pcl::PolygonMesh` 并检查连通分量与点状态。\n\n```cpp\n#include <pcl/point_types.h>\n#include <pcl/search/kdtree.h>\n#include <pcl/surface/gp3.h>\n\npcl::PointCloud<pcl::PointNormal>::Ptr cloud(\n    new pcl::PointCloud<pcl::PointNormal>);\n\npcl::search::KdTree<pcl::PointNormal>::Ptr tree(\n    new pcl::search::KdTree<pcl::PointNormal>);\ntree->setInputCloud(cloud);\n\npcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;\ngp3.setInputCloud(cloud);\ngp3.setSearchMethod(tree);\ngp3.setSearchRadius(0.03);          // 按点间距与几何尺度确定\ngp3.setMu(2.5);                    // 候选搜索半径的自适应系数\ngp3.setMaximumNearestNeighbors(100);\ngp3.setMaximumSurfaceAngle(M_PI / 4);\ngp3.setMinimumAngle(M_PI / 18);\ngp3.setMaximumAngle(2 * M_PI / 3);\ngp3.setNormalConsistency(false);   // 取决于法线方向是否已统一\n\npcl::PolygonMesh mesh;\ngp3.reconstruct(mesh);\n```\n\n示例数值来自官方教程的演示配置，不是所有数据集的推荐值。\n\n## 调参思路\n\n- 先估计近邻距离分布，再设置 `searchRadius`，避免直接照搬绝对数值。\n- `mu` 让搜索尺度随最近邻距离变化，但无法修复极端密度差异。\n- 邻居上限过低可能形成孔洞，过高会增加错误连接和计算量。\n- 表面角与三角形最小/最大角约束用于抑制跨折角连接和瘦长三角形。\n- 若法线方向已一致，可根据数据含义配置 `normalConsistency`；设置错误可能导致连接缺失或方向异常。\n\n## 结果校验\n\n- 可视化三角形法线、边长和最小角分布。\n- 检查薄壁、边界、孔洞和不同连通分量。\n- 比较网格到原始点云的距离，防止平滑后几何漂移。\n- 对后续需要封闭流形的任务，额外执行拓扑修复；GP3 不保证自动得到水密网格。\n\n## 参考资料\n\n- [PCL 官方教程：Fast triangulation of unordered point clouds](https://pointclouds.org/documentation/tutorials/greedy_projection.html)\n- [PCL BSD License](https://github.com/PointCloudLibrary/pcl/blob/master/LICENSE.txt)\n"
}
