BambuStudio学习笔记:MeshBoolean类

news/2025/3/6 21:48:52/
# MeshBoolean.hpp 代码分析## 功能概述
本头文件提供三维网格布尔运算功能,支持差集、并集、交集操作。实现基于CGAL和Mcut两种底层库,包含数据结构转换、运算接口及辅助功能。## 核心结构### 数据结构
```cpp
using EigenMesh = std::pair<Eigen::MatrixXd, Eigen::MatrixXi>; // Eigen矩阵存储网格
struct CGALMesh; // CGAL网格抽象(使用PIMPL模式)
struct McutMesh;  // Mcut网格抽象

智能指针管理

// CGAL网格指针(RAII管理)
using CGALMeshPtr = std::unique_ptr<CGALMesh, CGALMeshDeleter>;// Mcut网格指针
using McutMeshPtr = std::unique_ptr<McutMesh, McutMeshDeleter>;

主要功能模块

数据转换接口

转换方向函数
Eigen ↔ TriangleMesheigen_to_triangle_mesh()
triangle_mesh_to_eigen()
TriangleMesh ↔ CGALtriangle_mesh_to_cgal()
cgal_to_triangle_mesh()
TriangleMesh ↔ Mcuttriangle_mesh_to_mcut()
mcut_to_triangle_mesh()

布尔运算接口

// 基础运算类型
void minus(A, B);    // 差集 A - B
void plus(A, B);     // 并集 A ∪ B 
void intersect(A, B);// 交集 A ∩ B// 支持数据类型重载
• TriangleMesh
• indexed_triangle_set
• CGALMesh
• McutMesh

高级功能

// 网格分割与合并
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具体实现
    • 减少头文件依赖
    struct CGALMesh; // 前置声明
    struct CGALMeshDeleter; // 定制删除器
    
  2. RAII资源管理

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

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

性能优化

数据转换优化

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

运算选择策略

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

使用示例

基本布尔差集

TriangleMesh A, B;
MeshBoolean::minus(A, B); // A = A - B

多引擎运算

// 使用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");
}

扩展接口

自定义网格处理

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

进阶分析

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

注意事项

  1. 精度控制

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

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

    try {MeshBoolean::minus(A, B);
    } catch (const std::exception& e) {// 处理布尔运算失败
    }
    

http://www.ppmy.cn/news/1577183.html

相关文章

windows 利用nvm 管理node.js 2025最新版

1.首先在下载nvm 下载链接 2. 下载最新版本的nvm 3. 同意协议 注意&#xff1a;选择安装路径 之后一直下一步即可 可以取消勾选 open with Powershell 勾选后它会自动打开Powershell 这里选用cmd 输入以下命令查看是否安装成功 nvm version 查看已经安装的版本 我之前自…

如何用FFmpeg高效拉流(避坑指南)

FFmpeg作为音视频处理领域的“瑞士军刀”,其拉流功能在直播、监控、流媒体分析等场景中应用广泛。本文从实战角度出发,系统梳理FFmpeg拉流的核心工具链、协议适配技巧及高频踩坑点,助你快速掌握流媒体处理核心技能! 一、FFmpeg拉流工具链全解析 核心工具 ffplay:快速验证…

C++ 将jpg图片变成16位565bmp图片

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include<string> #include <atlimage.h>bool ConvertJpgTo16BitBmp565(const char* input_path, const char* output_path) {CImage …

deepseek在pycharm 中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm&#xff0c;如何接入deepseek是我们窥探ai代码编写的第一步&#xff0c;熟悉起来总没坏处。 1、官网安装pycharm社区版&#xff08;免费&#xff09;&#xff0c;如果需要安装专业版&#xff0c;需要另外找破解码。 2、安装Ollama…

(功能测试)第五章 APP性能测试 常用的APP命令格式 补充与总结

app性能测试 solopi 工具监控性能数据 实时监控所选项的各类数据的变化 性能测试就是记录性能数据 从而去分析是否是存在有异常 使用工具去监控数据 查看录制数据 可以持续使用两个小时去查看性能的使用情况 重点是对拿到的数据去进行分析 内存数据查看 性能指标有如下内容&a…

学习工具的一天之(burp)

第一呢一定是先下载 【Java环境】&#xff1a;Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…

物业管理系统源码 物业小程序源码

物业管理系统源码 物业小程序源码 一、基础信息管理 1. 房产信息管理 记录楼栋、单元、房间的详细信息&#xff08;面积、户型、产权等&#xff09;。 管理业主/租户的档案&#xff0c;包括联系方式、合同信息等。 2. 公共资源管理 管理停车场、电梯、绿化带、公…

DeepSeek开源大模型的市场策略:真实目的解析

根据第四期财经 DeepSeek单纯硬件成本就近百亿&#xff0c;那为什么要免费开源呢&#xff1f; 此博客深入分析大模型开源的市场策略&#xff0c;特别是DeepSeek的开源策略背后的真实目的。大模型的“开源”不同于传统软件开源&#xff0c;实际上是一种商业策略——免费给你挖半…