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

[复制链接]
发表于 2025-11-19 05:09:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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: 差三种模式;
  1. /**
  2. * Enum values after BOOLEAN_NONE need to match BMESH_ISECT_BOOLEAN_... values in
  3. * `editmesh_intersect.cc`.
  4. */
  5. enum class BoolOpType {
  6.   None = -1,
  7.   /* Aligned with #BooleanModifierOp. */
  8.   Intersect = 0,
  9.   Union = 1,
  10.   Difference = 2,
  11. };
复制代码
3. 焦点函数

焦点函数:boolean_mesh 以及 boolean_trimesh 这两个函数;boolean_trimesh 调用的是 boolean_mesh 实现,输入参数 IMesh 必要是三角面片;
  1. IMesh boolean_mesh(IMesh &imesh,
  2.                    BoolOpType op,
  3.                    int nshapes,
  4.                    FunctionRef<int(int)> shape_fn,
  5.                    bool use_self,
  6.                    bool hole_tolerant,
  7.                    IMesh *imesh_triangulated,
  8.                    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);
  1. IMesh *tm_in = imesh_triangulated;
  2. IMesh our_triangulation;
  3. if (tm_in == nullptr) {
  4.    our_triangulation = triangulate_polymesh(imesh, arena);
  5.    tm_in = &our_triangulation;
  6. }
复制代码
step2: 实验 boolean_trimesh 函数

  1. IMesh tm_out = boolean_trimesh(*tm_in, op, nshapes, shape_fn, use_self, hole_tolerant, arena);
复制代码
step3: 对三角面片举行后处置惩罚

布尔函数对三角形 #IMesh 举行操纵,并天生一个
IMesh 作为输出Triangle;这个函数通过删除任何大概的三角剖分边(可以辨认,是由于它们将具有 NO_INDEX 的原始边。并非全部三角剖分边都可以删除:假如它们终极真实的输入边,那么我们必要生存它。别的,有些是使输出满意所必须的“valid #BMesh(有用)”属性:我们无法天生它们,大概具有多个不相连的界限(比方,带有孔的面)。
  1. 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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表