马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |