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

news/2024/12/28 4:30:23 标签: blender, 源码阅读, 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.niftyadmin.cn/n/5802354.html

相关文章

《一文读懂卷积网络CNN:原理、模型与应用全解析》

《一文读懂卷积网络CNN&#xff1a;原理、模型与应用全解析》 一、CNN 基本原理大揭秘&#xff08;一&#xff09;从人类视觉到 CNN 灵感&#xff08;二&#xff09;核心组件详解 二、经典 CNN 模型巡礼&#xff08;一&#xff09;LeNet-5&#xff1a;开山鼻祖&#xff08;二&a…

git更改当前项目的远程仓库,保留原始仓库提交记录提交到新仓库

在开发过程中&#xff0c;有时需要将当前项目的远程仓库切换到另一个新的远程仓库&#xff0c;同时保留所有原始的提交记录。以下是详细的步骤和最佳实践&#xff0c;确保你能够顺利完成这一操作。 更改当前项目的远程仓库 1.查看当前的远程仓库 确认当前项目的远程仓库地址。…

【AI系列】从零开始学习大模型GPT (1)- Build a Large Language Model (From Scratch)

Build a Large Language Model 背景文章第1章&#xff1a;理解大型语言模型什么是LLMs?什么是Transformer&#xff1f;什么是BERT和GPT?GPT的架构设计构建GPT有哪些步骤&#xff1f; 第2章&#xff1a;处理文本数据第3章&#xff1a;编码Attention机制第4章&#xff1a;从零实…

Rust : tokio中select!

关于tokio的select宏&#xff0c;有不少的用途。包括超时和竞态选择等。 关于select宏需要关注&#xff0c;相关的异步条件&#xff0c;会同时执行&#xff0c;只是当有一个最早完成时&#xff0c;会执行“抛弃”和“对应”策略。 说明&#xff1a;对本文以下素材的来源表示感…

中科岩创桥梁自动化监测解决方案

行业现状 2021年3月1日&#xff0c;根据《公路长大桥梁结构健康监测系统建设实施方案》文件要求对“公路在役和在建单孔跨径500米以上的悬索桥、单孔跨径300米以上的斜拉桥、单孔跨径160米以上的梁桥和单孔跨径200米以上的拱桥”建设结构健康监测系统并力争2023年12月底前&…

笔记:一次oracle 集群日志维护

说明 数据库alert日志报 Tue Dec 24 22:01:43 2024 Thread 2 cannot allocate new log, sequence 19717分析 日志切换时发现下一组日志处于active状态&#xff0c;该问题往往是因为日志组及日志大小分配不合理导致&#xff0c;需对日志组进行调整 操作 1&#xff0c;查看 …

HTML 画布:创意与技术的融合

HTML 画布:创意与技术的融合 HTML 画布(<canvas>)元素是现代网页设计中的一个强大工具,它为开发者提供了一个空白画布,可以在上面通过JavaScript绘制图形、图像和动画。这种技术不仅为网页增添了视觉吸引力,还极大地丰富了用户的交互体验。本文将深入探讨HTML画布…

硬件开发笔记(三十二):TPS54331电源设计(五):原理图BOM表导出、元器件封装核对

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144753092 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…