3D网格布尔运算开源库

3D网格布尔运算开源库

3D网格布尔运算开源库

网格的布尔运算广泛应用于建筑、医学导航软件、游戏和电影动画等应用场景中,3D模型的编辑软件,3D Max、Maya以及Blender就广泛应用网格的布尔运算于构建新的模型。

常用的开源库

开源库的名称应用范围实验结果BooleanOperation API下载地址
VTK生物医学领域计算速度中等,但是非常不稳定,cpu利用效率低vtkBooleanOperationPolyDataFilterhttps://vtk.org/download/
VTKbool生物医学领域计算速度很慢,比较稳定,cpu利用效率比较低vtkPolyDataBooleanFilterhttps://github.com/zippy84/vtkbool
CGAL计算机图形处理库计算速度最快,稳定性比VTK稍强,cpu利用效率中等corefine_and_compute_differencehttps://www.cgal.org/download.html
Cork(使用的最为广泛)Blender设计;建筑;CloudCompare,开源的几何处理库生物医学领域计算速度很快,比CGAL慢,比libigl封装的CGAL快,稳定性较好,不会崩(遇到not solid的物体)程序不会崩,但是无法结束,使用的内存一直递增,原始版本为单核计算,CPU利用率较低。compute Differencec
omputeUnionc
omputeIntersection
原始版本-https://github.com/gilbo/cork
多线程版本-https://github.com/stephanfr/Cork
Blender版本-https://github.com/dfelinto/cork-on-blender
libigl计算机图形处理库计算速度比较快,稳定性比较强,CPU利用率100%igl::copyleft::cgal::mesh_boolean
igl::copyleft::cork::mesh_boolean
https://github.com/libigl/libigl
MEPP2计算机图形处理库,处理3D网格和点云的数据库类似于Cork,计算速度较快,稳定性较好https://projet.liris.cnrs.fr/mepp/mepp2/index.html
QuickCSG(免费但是不公开代码)专门处理网格布尔运算的库,只有exe程序,不公开源代码计算速度非常快,稳定性非常好,非封闭的曲面也可以进行计算,但是生成的曲面碎片化比较明显http://morpheo.inrialpes.fr/static/QuickCSG/
trimesh计算机图形学库,布尔运算使用的是OpenSCAD和Blender作为后端base.intersection(cuts, engine=‘scad’)https://github.com/mikedh/trimesh
CassiopeeCFD图形处理库,用于网格的布尔运算http://elsa.onera.fr/Cassiopee/Userguide.html

Cork的评价

Cork的需要输入的模型为Solid的,也就是网格模型需要是流形的,对非流形网格( non-manifold)非常敏感。流形网格包含两个情况,自相交的和非封闭的。可以使用CGAL将非流形网格转为流形网格,(需要注意CGAL不能加载部分off文件,而meshlab、MEPP等软件可以加载)Cork的多线程版本比原始版本稳定性稍低些,需要线程无法结束导致崩溃的问题。多线程版本的计算时间减少70%左右,运行消耗的内存空间提升为原始版本的3倍左右,并行效率较好。
多线程版本
在这里插入图片描述
原始版本
在这里插入图片描述

QuickCSG的效果与评价

前几次的运算,效果比较好,运算速度非常快,不到1S,生成的网格(绿色区域)也比较好
在这里插入图片描述
但是,第四次运算的时候,出现断面的情况,生成的网格面与原始网格面并不相连接
在这里插入图片描述

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
三角网格布尔运算是将两个或多个三角网格相互组合并生成一个新的三角网格的方法。常见的三角网格布尔运算包括求交、做差、取并等操作。下面是使用C++实现三角网格布尔运算,并用OpenGl实现可视化的简单步骤: 1. 读取三角网格模型数据,存储为顶点数组和三角形索引数组; 2. 实现布尔运算的算法,例如求交、做差、取并等操作; 3. 根据运算结果生成新的顶点数组和三角形索引数组; 4. 使用OpenGL渲染生成的三角网格模型。 下面是一个简单的示例代码,实现了求交运算: ```c++ #include <iostream> #include <vector> #include <algorithm> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> struct Triangle { int v1, v2, v3; }; class Mesh { public: std::vector<glm::vec3> vertices; std::vector<Triangle> triangles; }; // 求交运算 Mesh intersection(const Mesh& m1, const Mesh& m2) { Mesh result; // TODO: 实现求交运算 return result; } int main(int argc, char** argv) { // 读取两个三角网格模型数据 Mesh mesh1, mesh2; // TODO: 读取模型数据 // 进行求交运算 Mesh result = intersection(mesh1, mesh2); // 渲染生成的三角网格模型 // TODO: 使用OpenGL渲染 return 0; } ``` 需要注意的是,三角网格布尔运算是一个高级的计算机图形学问题,实现起来比较复杂,需要考虑很多特殊情况。因此,上述示例代码只是一个简单的框架,具体实现还需要根据实际情况进行调整和完善。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值