八叉树CSG布尔运算

news2024/9/22 9:47:55

1. 前言

布尔运算是几何内核的核心话题之一,又分为二维布尔运算和三维布尔运算,其中三维布尔运算技术难度较高,缘之空间维度的提升。

根据实现的理论不同,三维布尔运算又分为B-Rep布尔运算、CSG布尔运算、三角网格布尔运算等方法,其背后的理论与几何数据结构紧密联系,如B-Rep方式表达的几何体往往采用B-Rep布尔运算方法进行造型,CSG方式表达的几何体造型过程又离不开CSG布尔运算,在一些场合中又离不开三角网格布尔运算…

本文就三角网格布尔运算进行介绍。

2. 概述

三角网格布尔运算有多种理论支撑实现,比如BSP网格布尔运算方法、八叉树网格布尔运算等,同样,不同的方法有其特点及适用范围。

BSP网格布尔运算依赖于较为严格的实体规范表达,即参与运算的几何实体需要是闭合的、规整的,如果出现不闭合的几何实体,运算可能出错,比如对一颗网格化表达的树进行布尔就会出错,得到意想不到的造型效果。如果实体内部由有其他元素时也会出现上述问题,比如大坝内部有其他多种围挡等建造元素时。
图2.1:网格化表达的树

八叉树布尔运算适用性较好,缘于其较好的鲁棒性——对于不规整几何体的兼容处理能力。当然并不是说这种方法对任意网格数据均能“正确的”进行布尔运算,这里的良好的鲁棒性指的是网格数据规范的情况下,比如遵循正面的三角面索引顺序为逆时针方式等基础规范。

八叉树布尔运算应用范围较广,一些基于CSG方式表达的几何内核采用CSG-OctTree网格布尔运算,当然基于B-Rep方式表达的几何内核也可以采用八叉树布尔运算,根据其需要。(如果OCC支持网格布尔运算,会有很多人大喜之)

3. 内容

3.1 八叉树表达

需要将参与运算的几何实体进行八叉树空间划分和归属,这里有一些技巧。
图3.1.1:meshA构造的八叉树
图3.1.2:meshB构造的八叉树

上图中叶子节点为什么大小不一样?不同节点由于其所涉及的三角面数量不一样,进行了不同程度的细化,也可以说是自适应细化。

3.2 标记传递

几何实体将空间分割,叶子节点被区分为几何体内(in)、几何体外(out)、几何体切割(cut)三种情况,而cut情况进一步的得到parts in& parts out,聪明的你大概已经知道接下来要怎么做了,那将是下节内容要讲的。怎么知道是该标记为in、out、cut呢?

首先我们知道树叶子节点为cut的情况,简单来说就是有三角面“经过”该叶子节点所处空间时,此叶子节点即被标记为cut,进而我们标记了所有cut类型的叶子节点;

对标记为cut的叶子节点进行切割,得出parts in& parts out部分,进一步可以标记所处空间的6个面(将其标记为in、out或cut),这里的面标记非常重要,它是标记传递的源动力;

下面以meshB对应的八叉树为例进行说明,
图3.2.1:标记为cut的叶子节点中的“part in”部分

由标记为cut的叶子节点出发进行标记传递,即由其空间的6个面进行出发进行面标记传递,相邻空间的相邻面是标记传递的对象;一般来说可以这样进行传递:由cut类型的叶子节点出发标记其兄弟姐妹(另外7个叶子节点),进一步和其兄弟姐妹一起共同标记他们的父节点;

这样一颗八叉树表达的网格实体被标记完成,所有的节点(叶子节点及祖先节点)均被进行了有效标记。也就是我们得到了整个全覆盖空间的标记,试想,如果给你一个三角面,是否可以快速判断它是在这个八叉树空间中是in、out或cut?聪明的你已经想到了,可以用被标记的八叉树去“切割”另一颗八叉树,无论其有没有被标记!我们将在下一节中继续娓娓道来。
图3.2.2:标记为cut的叶子节点切割三角面

图3.2.3:标记为in的叶子节点
图3.2.4:标记为out的叶子节点(视图1)

我们从底部来看下标记为out的叶子节点,
图3.2.5:标记为out的叶子节点(视图2)

当然此过程有很多细节需要去考虑,有一些处理技巧,由于篇幅所限(作者懒~),不再展开。

我们来看整体效果,

meshA构造的八叉树如下,
图3.2.6:被标记的八叉树(meshA构造)

meshA构造的八叉树在标记后的效果如下,
图3.2.7:被标记的八叉树(meshA构造)
图3.2.8:被标记的八叉树(meshB构造)
图3.2.9:被标记的八叉树(meshB构造)

3.3 布尔运算

对于参数布尔运算的网格实体meshA和meshB,经过上述过程,我们得到了两颗对应的八叉树octTreeA和octTreeB,且它们均被成功标记;

octTreeA切割octTreeB,可以得到meshB在meshA中的部分(meshA_out_meshB)、meshB在meshA外的部分(meshA_in_meshB);
同样用octTreeB切割octTreeA,我们可以得到meshB_out_meshA、meshB_in_meshA;

这就是布尔运算的过程。

3.4 获取结果

不知不觉就来到了获取结果的阶段,怎么获取结果呢?如果你有一定的几何理论基础,你可能已经知道答案了。

对上述四部分进⾏组合即可得到交、并、差结果。如求交运算为将meshA_in_meshB和meshB_in_meshA组合,A减B运算为先将meshB_in_meshA取反,再与meshA_out_meshB组合。

表3.4.1 运算结果

运算类型组合备注
A∩B“meshA_in_meshB” + “meshB_in_meshA”
A∪B“meshA_out_meshB” + “meshB_out_meshA”
A-B“meshA_out_meshB” + ~“meshB_in_meshA”~为取反,此处为取反面
B-A“meshB_out_meshA” + ~“meshA_in_meshB”~为取反,此处为取反面

4. 效果

图4.1:参与布尔运算的几何体meshA和meshB

为了方便理解原理,我把切割过程的面的轮廓边线画出来了,
图4.2:布尔运算效果

5. 同类库的效率和效果情况

同类库的效率和效果情况
图5.2:同类库的效率和效果情况

6. 写在后面

八叉树布尔运算需要用到大量的几何算法基础函数,学习和搭建基础几何库很重要;
此过程需要大量的工程实践和理论,处理多样的工程问题,如精度问题、边界情况等;
排版比较乱,详细在公众号文章中;
欢迎进行交流,公众号:geometrylib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL5.6.51安装

1 官网下载 MySQL :: Download MySQL Community Server (Archived Versions) 2 解压 3 配置环境 D:\MySQL\mysql-5.6.51-winx64\bin 把这个配置到path后面 4 启动 5 设置初始密码 set password for rootlocalhost password(123456); 6 登录mysql

【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)

目录 1.用队列实现栈oj题 对比 一、初始化 二、出栈 三、入栈 四、取队头元素: 2.用栈实现队列 一、定义 二、入队列 三、出队列 四、队头 五、判空 前言:如果想了解什么是栈和队列请参考上一篇文章进来一起把【数据结构】的【栈与队列】狠…

Cursor是什么?Cursor Pro Plus 如何订阅升级教程

一、Cursor是什么? Cursor 是一个基于 Visual Studio Code(VS Code)技术构建的高级代码编辑器,专为提高编程效率并更深度地整合 AI 功能而设计。它不仅继承了 VS Code 的强大功能和用户界面,还增加了专门针对 AI 支持…

Kafka3.6.0 linux 安装,非zk模式

1.下载 到kafka官网下载 2.上传到服务器指定位置 3.解压到指定目录,这里我放到/opt下 tar -xzvf kafka_2.13-3.6.0.tgz -C /opt/ 4.修改配置 因为我们不使用zookeeper,所以来到kafka装根目录的下的/config/kraft/ cd /opt/kafka_2.13-3.6.0/config…

前端HTML基础笔记

HTML(HyperText Markup Language,超文本标记语言)是一种用于创建网页的标准标记语言。它通过一系列的元素(或称为标签)来定义网页的结构和内容。HTML文档由一系列的元素组成,这些元素可以包含文本、图片、链…

伽罗华域GF的简单计算

伽罗华域(Galois Field),也称为有限域,是一个包含有限个元素的代数结构,满足加法、减法、乘法和除法(除以零除外)运算。伽罗华域在编码理论、密码学、数字信号处理等领域有广泛的应用。它以法国…

思科网络地址转换5

#网络安全技术实现# #任务五利用动态NAPT实现局域网访问Internet5# #1配置计算机的IP 地址、子网掩码和网关 #2配置路由器A的主机名称及其接口IP地址 Router>enable Router#conf t Router(config)#hostname Router-A Router-A(config)#int f0/0 Router-A(config-if)#i…

【Python报错已解决】 AttributeError: ‘move_to‘ requires a WebElement

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查元素选择器2.2 方法…

计算机毕业设计选题-基于python的企业人事管理系统【源码+文档+数据库】

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的企业人事管理系…

mycat双主高可用架构部署-MySQL5.7环境部署第一台

MySQL5.7服务器IP是192.168.31.209及192.168.31.210 1、192.168.31.209:3307实例部署 a、配置文件 mkdir -p /data/mysql/mysql3307/{data,logs} #创建MySQL数据及日志目录 vi /data/mysql/mysql3307/my3307.cnf #配置文件整理 [client] #password your_password port …

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 FeatureExtraction 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(calculateSmoothness())2. 标记遮挡点(markOcc…

堆-数组的堆化+优先队列(PriorityQueue)的使用

一、堆 1、什么是堆? 以完全二叉树的形式将元素存储到对应的数组位置上所形成的新数组 2、为什么要将数组变成堆? 当数组中的元素连续多次进行排序时会消耗大量的时间,将数组变成堆后通过堆排序的方式将会消耗更少的时间 二、接口 给堆…

python | 字符串字母大小写转换方法

在对字符串所含字母单词进行处理时,经常会对其格式进行转换统一。 python自带了一些判断和处理转换的方法。 一、字符串格式判断方法 islower():str.islower(),判断字符串是否全是小写,是返回True,不是返回False i…

Transiting from CUDA to HIP(三)

一、Workarounds 1. memcpyToSymbol 在 HIP (Heterogeneous-compute Interface for Portability) 中,hipMemcpyToSymbol 函数用于将数据从主机内存复制到设备上的全局内存或常量内存中,这样可以在设备端的内核中访问这些数据。这个功能特别有用&#x…

红黑树——封装map和set

概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平…

MySQL数据库介绍——初始数据库MySQL

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 目录 写在前面: 一.数据库基础知识 1.…

使用shell脚本安装mysql8,进行主从备份配置

思路 在3台主机上安装mysql进行主从备份配置 使用rpm包yum安装mysql 首先,我们要准备好安装文件,首先下载rpm包 wget -P "/opt/" https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm 然后执行安装(默认已配置…

1111111111111113

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

openwrt的旁路模式无法访问国内网站

防火墙: 常规设置-> 区域: lan-> wan :编辑 IP 动态伪装:勾选

【Qt线程】—— Qt线程详解

目录 (一)多线程的概述 (二)Qt线程的使用条件 (三)创建线程的方法 3.1 继承QTread,重写run()函数 3.1.1 为什么要重写 3.2 继承QObject 3.3 核心API介绍 3.4 关闭线程的使用方法 &…