【Blender】【源码详解】BLI_mesh_boolean 实现详解

1. 背景:

最近因为项目需要,需要阅读 Blender 中关于 mesh boolean 的源码;因此,对 blender 中的 mesh boolean 源码进行解读;
Github 上源码下载很慢,一般使用 Gitee: gitee Blender 源码

2. Mesh Boolean 核心源码位置:

Blender 的 mesh boolean 的源码,主要在工程:blenlib 这个工程中 的 BLI_mesh_boolean.h 文件中;
BoolOpType 主要包含:Intersect: 交;Union: 并; Difference: 差三种模式;

/*** Enum values after BOOLEAN_NONE need to match BMESH_ISECT_BOOLEAN_... values in* `editmesh_intersect.cc`.*/
enum class BoolOpType {None = -1,/* Aligned with #BooleanModifierOp. */Intersect = 0,Union = 1,Difference = 2,
};

3. 核心函数

核心函数:boolean_mesh 以及 boolean_trimesh 这两个函数;boolean_trimesh 调用的是 boolean_mesh 实现,输入参数 IMesh 需要是三角面片;

IMesh boolean_mesh(IMesh &imesh,BoolOpType op,int nshapes,FunctionRef<int(int)> shape_fn,bool use_self,bool hole_tolerant,IMesh *imesh_triangulated,IMeshArena *arena);

boolean_mesh 的文件注释如:
对网格 pm_in 执行布尔运算运算。
布尔运算具有 \a nshapes 输入形状。每个网格都是输入网格的不相交子集。shape_fn 参数在应用于输入面参数时,表示它位于哪个形状中(应该是从 -1 到 : 如果为 -1,则它不是任何形状的一部分)。

use_self 参数表示函数是否应该假设相同形状的
面相交 - 如果参数为 true,则会找到此类自交集。
有时调用者已经进行了三角剖分;
如果是这样,则 *pm_triangulated 包含一个三角剖分:如果非 null,则它包含一个三角形网格
,每个三角形的 orig_field 表示该三角形属于 pm 中的哪个面。
pm 参数不是因为我们可以填充它的顶点(用于调试)。pm_triangulated 参数也是如此。
输出 #IMesh 将具有其原始字段映射回输入网格中的
面和边的面

4. 核心函数实现分析:

boolean_mesh 的具体实现步骤:

step 1: 如果输入参数 imesh_triangulated 为 null, 则对 imesh 进行三角面片化

our_triangulation = triangulate_polymesh(imesh, arena);

 IMesh *tm_in = imesh_triangulated;IMesh our_triangulation;if (tm_in == nullptr) {our_triangulation = triangulate_polymesh(imesh, arena);tm_in = &our_triangulation;}
step2: 执行 boolean_trimesh 函数
IMesh tm_out = boolean_trimesh(*tm_in, op, nshapes, shape_fn, use_self, hole_tolerant, arena);
step3: 对三角面片进行后处理

布尔函数对三角形 #IMesh 进行操作,并生成一个
IMesh 作为输出Triangle;这个函数通过删除任何可能的三角剖分边(可以识别,是因为它们将具有 NO_INDEX 的原始边。并非所有三角剖分边都可以删除:如果它们最终真实的输入边,那么我们需要保留它。此外,有些是使输出满足所必需的“valid #BMesh(有效)”属性:我们无法生成它们,或者具有多个不相连的边界(例如,带有孔的面)。

 IMesh ans = polymesh_from_trimesh_with_dissolve(tm_out, imesh, arena);

6. boolean_trimesh 原理分析:

IMesh boolean_trimesh(IMesh &tm_in,
BoolOpType op,
int nshapes,
FunctionRef<int(int)> shape_fn,
bool use_self,
bool hole_tolerant,
IMeshArena *arena);

} // namespace blender::meshintersect

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

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

相关文章

qcow2镜像大小压缩

本文拟对qcow2进行压缩进行简单介绍 背景 qcow2镜像在使用一段时间后&#xff0c;总是会不断膨胀变大&#xff0c;所以在导出分享时一般都需要进行压缩以缩减占用空间。 清除空洞 qcow2方式也有稀疏的问题&#xff0c;在磁盘级别上看&#xff0c;镜像会有大量连续的相同空洞…

达梦 本地编码:PG_GBK, 导入文件编码:PG_UTF8错误

问题 达梦 本地编码&#xff1a;PG_GBK, 导入文件编码&#xff1a;PG_UTF8错误 解决 右键管理服务器 查看配置 新建一个数据库实例&#xff0c;配置跟之前的保持一致 新建一个用户&#xff0c;跟以前的用户名一样 在用户上&#xff0c;右键导入&#xff0c;选择dmp的位置 导…

深度学习卷积神经网络CNN之MobileNet模型网络模型详解说明(超详细理论篇)

1.MobileNet背景 2.MobileNet V1论文 3. MobileNett改进史 4. MobileNet模型结构 5. 特点&#xff08;超详细创新、优缺点及新知识点&#xff09; 一、MobileNet背景 随着移动设备的普及&#xff0c;深度学习模型的应用场景逐渐扩展至移动端和嵌入式设备。然而&#xff0c;传统…

垂起固定翼无人机大面积森林草原巡检技术详解

垂起固定翼无人机大面积森林草原巡检技术是一种高效、精准的监测手段&#xff0c;以下是对该技术的详细解析&#xff1a; 一、垂起固定翼无人机技术特点 垂起固定翼无人机结合了多旋翼和固定翼无人机的优点&#xff0c;具备垂直起降、飞行距离长、速度快、高度高等特点。这种无…

kubernates实战

使用k8s来部署tomcat 1、创建一个部署&#xff0c;并指定镜像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod状态 kubectl get pods # 获取default名称空间下的pods kubectl get pods --all-namespaces # 获取所有名称空间下的pods kubect…

数据挖掘之认识数据

在数据挖掘过程中&#xff0c;数据的认识是非常重要的一步&#xff0c;它为后续的数据分析、建模、特征选择等工作奠定基础。以鸢尾花数据集&#xff08;Iris Dataset&#xff09;数据集之鸢尾花数据集&#xff08;Iris Dataset&#xff09;-CSDN博客为例&#xff0c;下面将介绍…

Java 优化springboot jar 内存 年轻代和老年代的比例 减少垃圾清理耗时 如调整 -XX:NewRatio

-XX:NewRatio 是 Java Virtual Machine (JVM) 的一个选项&#xff0c;用于调整 年轻代&#xff08;Young Generation&#xff09;和 老年代&#xff08;Old Generation&#xff09;之间的内存比例。 1. 含义 XX:NewRatioN 用于指定 老年代 与 年轻代 的内存比例。 N 的含义&…

统信UOS 1071 AI客户端接入本地大模型配置手册

文章来源&#xff1a;统信UOS 1071本地大模型配置手册 | 统信软件-知识分享平台 1. OS版本确认 1.1. 版本查看 要求&#xff1a;计算机&#xff0c;属性&#xff0c;查看版本&#xff08;1070,构建号> 101.100&#xff09; 2. UOS AI版本确认 UOS AI&#xff0c;设置&am…

定时任务——定时任务技术选型

摘要 本文深入探讨了定时任务调度系统的核心问题、技术选型&#xff0c;并对Quartz、Elastic-Job、XXL-Job、Spring Task/ScheduledExecutor、Apache Airflow和Kubernetes CronJob等开源定时任务框架进行了比较分析&#xff0c;包括它们的特点、适用场景和技术栈。文章还讨论了…

【ArcGIS Pro微课1000例】0064:栅格目录、栅格数据集、镶嵌数据集

一、栅格目录与栅格数据集 1. 定义 栅格目录:是一个用于管理和组织栅格数据集的结构,通常包含多个栅格数据集的元数据和索引信息。它相当于一个文件夹,里面可以存放多个栅格文件。可以将工作空间转栅格目录。 栅格数据集:是指单个的栅格数据文件,包含了具体的空间数据,…

Java基础 | 数据库的命名规范

数据库的命名规范 1. 基本原则2. 命名规范详解2.1 命名禁止项2.2 命名规范3. 通用字段规范4. 特殊表命名建议 1. 基本原则 统一性&#xff1a;全库采用一致的命名规范简洁性&#xff1a;在表达清晰的前提下尽量简短规范性&#xff1a;遵循数据库标准规范可读性&#xff1a;命名…

麒麟操作系统服务架构保姆级教程(二)sersync、lsync备份和NFS持久化存储

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 上篇文章我们说到rsync虽好&#xff0c;但是缺乏实时性&#xff0c;在实际应用中&#xff0c;咱们可以将rsync写进脚本&#xff0c;然后写进定时任务去备份&#xff0c;如果每天凌晨1&#xff1a;00…

青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程

青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程 一、并发编程并发编程的关键概念包括&#xff1a; 二、并发与并行并发编程&#xff08;Concurrency&#xff09;并行计算&#xff08;Parallelism&#xff09;区别 三、Go语言并发编程1. 协程&#xff08;Goroutine&am…

均值聚类算法

K-均值聚类算法是一种常用的无监督学习算法&#xff0c;用于将数据集划分为K个簇或聚类。它的基本思想是通过迭代将数据点分配到簇中&#xff0c;使得每个数据点都属于最近的簇中心&#xff0c;并且使得簇内的数据点之间的距离最小化。 算法步骤如下&#xff1a; 1. 初始化K个…

wtforms+flask_sqlalchemy在flask-admin视图下实现日期的修改与更新

背景&#xff1a; 在flask-admin 的modelview视图下实现自定义视图的表单修改/编辑是件不太那么容易的事情&#xff0c;特别是想不自定义前端view的情况下。 材料&#xff1a; wtformsflask_sqlalchemy 制作&#xff1a; 上代码 1、模型代码 from .exts import db from …

【AIGC-ChatGPT进阶副业提示词】末日生存指南 2.0:疯狂科学家的荒诞智慧

引言 在这个不断变化的世界中&#xff0c;末日似乎总是lurking在角落。但是&#xff0c;亲爱的幸存者们&#xff0c;不要害怕&#xff01;因为我&#xff0c;疯狂科学家2099&#xff0c;正在这里为你们带来最新版本的末日生存指南。这不是你祖母的应急手册&#xff0c;而是一本…

BiLSTM:深度学习中的双向长短期记忆网络

目录 ​编辑 1. BiLSTM原理 2. BiLSTM的应用案例 3. BiLSTM研究进展 4. BiLSTM技术挑战 5. BiLSTM未来趋势 6. BiLSTM的实际应用示例 6.1 数据准备 6.2 构建BiLSTM模型 6.3 训练模型 6.4 评估模型 6.5 可视化训练过程 7. 结论 在深度学习的浪潮中&#xff0c;BiLS…

Socket 收发内部拆包封包函数

在socket通信的时候&#xff0c;有时候数据比较大&#xff0c;内部缓存会溢出&#xff0c;导致发送或接收数据不正确。 针对这个情况&#xff0c;封装了一个接收和发送的底层函数&#xff0c;根据缓存大小批次发送和接收&#xff0c;内部有自己的缓冲区&#xff0c;测试情况良…

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件.

powershell美化

powershell美化 写在前面 除了安装命令&#xff0c;其他都是测试命令&#xff0c;后续再写进配置文件 安装主题控件 安装主题oh-my-posh&#xff0c;powershell中执行 winget install JanDeDobbeleer.OhMyPosh -s winget oh-my-posh init pwsh | Invoke-Expression # 查看…