Boolean operations between triangle meshes

Boolean operations between triangle meshes

eryar@163.com

Abstract. Boolean operations is one of basic and well known on 3D models. The operations are widely used in computer graphics, game, CAD, EDA. The blog introduce the function in some open source program. 

Key Words. Boolean Operations, Mesh, Triangle Mesh Boolean Operations,

1.Introduction

OpenCASCADE提供了基于BREP体的Boolean Operations,但是如果Topo体中只包含三角网格信息的话,是不支持布尔运算的。典型的例子就是由STL导入生成的模型在OpenCASCADE中是不能进行布尔运算。

有一些开源库提供了基于三角网格的布尔运算的功能。如MeshLab、Cork等。本文主要就来介绍一下这两个库中的基于三角网格的布尔运算功能。

wps_clip_image-6945

Figure 1. Boolean Operation cut between Cylinder and Torus mesh

基于网格有布尔运算主要应用于没有几何信息的模型,如游戏、3D打印中的网格模型。

2.MeshLab CSG

MeshLab中提供了网格的布尔运算功能,源码在filter_csg中。程序界面如下图所示:

wps_clip_image-25211

Figure 2. CSG Operation in MeshLab

下图所示为两个网格球的公共部分Intersection的结果:

wps_clip_image-31437

Figure 3. Intersection between sphere meshes

由上图可以看出,经过布尔运算后,网格变密了。

wps_clip_image-5546

Figure 4. Union between sphere meshes

上图所示为两个网格球的合并union结果。合并后的网格也变密了。

wps_clip_image-19657

Figure 5. Difference between sphere meshes

3.Cork 

Cork是一个小巧的用于网格布尔运算的开源库(LGPL),可以从如下地址下载:

https://github.com/gilbo/cork

下面使用cork编译出来的程序来测试下前面两个球的网格。在Windows中可以编译一个测试的应用程序,可以输入命令来测试效果:

wps_clip_image-14008

Figure 6. Cork help info

将测试文件ballA.off和ballB.off复制到编译出来的程序wincork相同的文件夹中,分别输入以下命令来得到相应的布尔运算结果:

F:\Mesh\cork\win\wincork\>wincork -union balla.off ballb.off union.off

F:\Mesh\cork\win\wincork\>wincork -diff balla.off ballb.off diff.off

F:\Mesh\cork\win\wincork\>wincork -isct balla.off ballb.off isct.off

然后将生成的union.off、diff.off和isct.off在MeshLab中打开如下图所示:

wps_clip_image-6071

Figure 7. Union between two sphere meshes

wps_clip_image-29249

Figure 8. Difference between two sphere meshes

wps_clip_image-7233

Figure 9. Intersection between two sphere meshes

从上面结果可以看出cork库得到的结果网格效果好,没有加密。

4. Conclusion

基于网格的布尔运算也是三维建模中一个基本功能,一些开源库提供了对网格进行布尔运算的支持。如MeshLab, Cork, CGAL等。

本文通过在MeshLab和Cork中对两个球的网格进行布尔运算,对比运算的结果,发现使用Cork得到的网格没有加密,数据量会小一些。

由于OpenCASCADE目前的版本不支持基于网格的布尔运算,在其官网上提供了一个功能请求:https://tracker.dev.opencascade.org/view.php?id=29776

wps_clip_image-7484

转载于:https://www.cnblogs.com/opencascade/p/Boolean_Operations_Mesh.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
booleanBoolean是Java中的两种数据类型。boolean是基本数据类型,用于表示逻辑值,只能取true或false。而BooleanBoolean类的包装器,用于封装boolean值,并提供了一些额外的功能。 当把代码中的第一行的Boolean改为boolean后,代码可以正常运行。这是因为boolean是基本数据类型,不需要被实例化,直接赋值即可。而Boolean需要被实例化后才能使用。 Boolean的构造方法包括一个接受boolean值的构造方法和一个接受字符串的构造方法。接受boolean值的构造方法用于将boolean值封装为Boolean对象,而接受字符串的构造方法会将字符串解析为boolean值,并将其封装为Boolean对象。 在创建Boolean对象时,默认情况下其值为null,而创建boolean类型的对象时,默认值为false。 综上所述,boolean是基本数据类型,用于表示逻辑值,只能取true或false;而BooleanBoolean类的包装器类型,用于封装boolean值,并提供了一些额外的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java 中 Booleanboolean 的区别](https://blog.csdn.net/jiaweilovemingming/article/details/123993069)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java 中 Booleanboolean的区别](https://blog.csdn.net/mkii_hong/article/details/106109387)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值