BambuStudio学习笔记:MeshBoolean类

markdown 复制代码
# MeshBoolean.hpp 代码分析

## 功能概述
本头文件提供三维网格布尔运算功能,支持差集、并集、交集操作。实现基于CGAL和Mcut两种底层库,包含数据结构转换、运算接口及辅助功能。

## 核心结构

### 数据结构
```cpp
using EigenMesh = std::pair<Eigen::MatrixXd, Eigen::MatrixXi>; // Eigen矩阵存储网格
struct CGALMesh; // CGAL网格抽象(使用PIMPL模式)
struct McutMesh;  // Mcut网格抽象

智能指针管理

cpp 复制代码
// CGAL网格指针(RAII管理)
using CGALMeshPtr = std::unique_ptr<CGALMesh, CGALMeshDeleter>;

// Mcut网格指针
using McutMeshPtr = std::unique_ptr<McutMesh, McutMeshDeleter>;

主要功能模块

数据转换接口

转换方向 函数
Eigen ↔ TriangleMesh eigen_to_triangle_mesh() triangle_mesh_to_eigen()
TriangleMesh ↔ CGAL triangle_mesh_to_cgal() cgal_to_triangle_mesh()
TriangleMesh ↔ Mcut triangle_mesh_to_mcut() mcut_to_triangle_mesh()

布尔运算接口

cpp 复制代码
// 基础运算类型
void minus(A, B);    // 差集 A - B
void plus(A, B);     // 并集 A ∪ B 
void intersect(A, B);// 交集 A ∩ B

// 支持数据类型重载
• TriangleMesh
• indexed_triangle_set
• CGALMesh
• McutMesh

高级功能

cpp 复制代码
// 网格分割与合并
std::vector<TriangleMesh> segment(...); // 网格分割
TriangleMesh merge(...);               // 多网格合并

// 网格分析
bool does_self_intersect(...);    // 自相交检测
bool does_bound_a_volume(...);    // 闭合体积检查
bool empty(...);                  // 空网格检测

实现细节

双引擎架构

输入网格 CGAL引擎 Mcut引擎 精确布尔运算 高效大规模运算 结果网格

CGAL引擎特点:

  • 基于计算几何算法库
  • 支持复杂拓扑结构
  • 提供自相交检测等高级功能

Mcut引擎特点:

  • 处理大规模网格高效
  • 支持多体积布尔运算
  • 单独make_boolean接口

关键设计模式

  1. PIMPL模式:

    • 隐藏CGAL/Mcut具体实现
    • 减少头文件依赖
    cpp 复制代码
    struct CGALMesh; // 前置声明
    struct CGALMeshDeleter; // 定制删除器
  2. RAII资源管理:

    cpp 复制代码
    CGALMeshPtr ptr = triangle_mesh_to_cgal(...);
    // 自动调用删除器释放资源
  3. 多态接口设计:

    cpp 复制代码
    // 统一接口支持不同数据结构
    void minus(TriangleMesh&, const TriangleMesh&);
    void minus(CGALMesh&, CGALMesh&);

性能优化

数据转换优化

  • 避免深拷贝:转换函数直接操作原始网格数据
  • 矩阵存储优化:Eigen矩阵列优先存储提升缓存利用率

运算选择策略

场景 推荐引擎
高精度要求 CGAL
大规模网格 Mcut
多体积运算 Mcut

使用示例

基本布尔差集

cpp 复制代码
TriangleMesh A, B;
MeshBoolean::minus(A, B); // A = A - B

多引擎运算

cpp 复制代码
// 使用CGAL检测自相交
if (!MeshBoolean::cgal::does_self_intersect(A)) {
    // 使用Mcut执行布尔运算
    McutMeshPtr mA = MeshBoolean::mcut::triangle_mesh_to_mcut(A);
    McutMeshPtr mB = MeshBoolean::mcut::triangle_mesh_to_mcut(B);
    MeshBoolean::mcut::do_boolean(*mA, *mB, "difference");
}

扩展接口

自定义网格处理

cpp 复制代码
// 添加网格光滑处理
void smooth(CGALMesh& mesh, double factor) {
    // 调用CGAL平滑算法
}

进阶分析

cpp 复制代码
// 计算网格体积
double calculate_volume(const CGALMesh& mesh) {
    // 使用CGAL体积计算功能
}

注意事项

  1. 精度控制:

    • CGAL使用精确数值计算
    • Mcut适合工程级精度
  2. 内存管理:

    • 避免大规模网格多次转换
    • 及时释放McutMesh资源
  3. 异常处理:

    cpp 复制代码
    try {
        MeshBoolean::minus(A, B);
    } catch (const std::exception& e) {
        // 处理布尔运算失败
    }
相关推荐
无心水1 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd1 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Zhao-Jichao4 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李4 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga6 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd6 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白7 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李8 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Zhao-Jichao10 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记
lisw0511 小时前
作为人类代理的大语言模型及其角色分类!
人工智能·学习·语言模型