What & How & Why

Boolean

使用 Boolean 的指定方式来组合两个几何体,或者用于找两个多边体之间的相交部分。
Ver 19.5


Overview

Boolean 的主要操作有:

  • Boolean 操作:(比如 union, intersect, subtract 等等)在两个“实心”的物体中发生的操作
  • Shattering 操作:用于切割 surface
  • 在两个模型的交界处创建 Polylines
  • 检测相交部分,并对其创建组。

输入的模型可以指定为 “实心(solid)”,或者是“表面(surface)”。处理的方法就是字面上的意思:当做实心体处理或者当成平面处理。

Boolean 的时候一定要确认输入端的几何体类型。测试中 polygon 与 polygon mesh 就不能很好的 boolean。

Boolean operations

Solid / Solid

Boolean 的操作示意图如下:

Solid / Surface

  • Union / Subtract 的时候,如果是部分相交,相交部分的 surface 会变成 double wall ,也就是没有体积,两个面重合在一起的形式(Subtract 的例子在下面。)
  • 从 solid 中 Subtract surface,如果两者只有部分相交,那么相交部分会得到一个看上去像线段的几何体(也就是之前说的 double wall,表现为 corner 处有多个点)。详情看下图(注意 point 的数量)
  • 在测试 Shattering 的过程中得到了与 Subtract 同样的结果,但点的数量是唯一的,与帮助上有冲突。FIXME

Surface / Surface

Schematic views

下图中,Double wall 表现为有厚度的线,原点表示有多个点。

Other Mode

Custom

该操作只用于各种重合的、或者是同心的几何体(比如 box 套 box,自我相交的几何体之类的)。Custom 允许用户自定义 depth 来分离出指定的区域。

这里的 depth 指的是几何体内某一点要达到几何体最外部所需要穿过的 surface 的最少层数。下图是例子:

Detect

该模式会直接为几何体的相交部分创建一个组或者属性。

Resolve

一般用于内部测试,也可以用于快速生成四面体(Tetrahedralize)。其效果与 Union 相同,但输出的是三角化的几何体和 surface。

Tips & Notes

Boolean 对 Solid 的要求

在对 Solid 对象进行 Boolean 操作时,我们需要保证 Solid 的质量:

  • Solid 应该是封闭的(closed)、气密的(airtight)。
  • Solid 的所有法线必须指向外部
  • Solid 不能包含 “non-manifold edges”,也就是 solid 中没有边被两个或以上的 polygon 分享。

必须要强调的是最后一点:如果有该种类型的边存在,会导致算法错误判断 Solid 的外部和内部。当然,这种情况下 Houdini 会提供一个警告,警告中会描述出现问题的组。

Solid 的其他事项
  • 不含逻辑矛盾的 open surface 也可以作为 solid. 比如一个没有共享边的 mesh 面(比如用于切割破碎的 gird)可以看做是一个 solid。
  • 如果使用 open surface 作为 solid 产生了不确定的问题,出现问题的边会被红色高亮。

Boolean 的可视化

有几种不同的方法可以可视化 Boolean 后的结果:

  • 使用 viewport 中的 group-list 选项。
  • 使用 Assemble + Color
  • 使用 Exploded View Node(这个很好用,推荐)

Boolean 的使用技巧

  • Boolean 不但可以对两个几何体进行操作,也可以对一个几何体中的不同组进行操作(通过 Set A / B 选项控制)。
  • 在没有指定 Set 的情况下,如果使用同一个几何体连接 Boolean 的两个输入口,那么 Boolean 会对几何体自身进行操作。

Boolean 和属性

Boolean 会对 points / vertex 属性进行插值操作,而对 primitive 属性进行复制操作。

Boolean 和精度

因为 Boolean 采用浮点数进行计算,因此计算的结果永远是个近似值。因此,某些行为是没有必要的,比如试图将一个球体均分(将切割用的 plane 精确的放置到球体的“赤道” 上。)

同样因为精度问题,即便是上述的边对齐(看上去重合)了,这两条边之间也会有细小的缝隙。好消息是, Boolean 会自动将其修复。

Boolean 在处理拥有超高细节的几何体的过程中会出现一些未知的问题,尤其是我们连续使用不同的 Boolean 对几何体操作的时候。这种情况下因为精度问题很可能导致几何体与自身产生相交。如果出现了问题,我们可以通过两种方式来尝试修复:

  • 将上游的 Boolean 中的 Assume seam polygons are flat 选项关闭。
  • 如果不管用,设置 Detriangulate 的选项为 Only unchanged polygons

技术上来说,精度的问题会导致非三角的 polygon 都不是平面(除非基于坐标)。因此先对输入的几何体进行三角面化是可以保证该几何体是“纯平”(perfect-flat)的。而在最后我们设置 Detriangulate 进行还原即可。

但三角化同时也带来一个副作用:会在我们想要“弄平”的几何体上产生一个小的“褶皱”。即便是我们最后对几何体去三角化,也会留下一个额外的点在“褶皱”处。这个问题可以通过 Assume seam polygons are flat 选项解决。

上述的问题是因为在实现上,Boolean 的精度是任意的。具体的说,Boolean 在创建输出的时候会当前几何体做一个“快照”。这个快照实际上做的工作就是保存了当前精度下几何体中 point 的信息(当前的精度是任意的),再将这些信息转化成了低精度的浮点数。而这种转化会导致几何体原有的随机精度覆盖掉浮点数的精度,而这种精度的改变会导致几何体自身与自身的相交(非常微小)。这种情况会在选项 Assume seam polygons are flat 开启的时候变得尤其明显;因此我们可以关闭该选项解决上述的问题。

常用参数

ParametersUsage
Remove self-intersections自动修复 surface 的穿模 / 重叠的问题。
DetriangulateBoolean 会在开始将输入的几何体三角化。这个选项用于将三角化的几何体还原,以便匹配输入的源几何体。
Detriangulate:All Polygons通过合并相邻的三角面还原几何体。
Detriangulate:Only Unchanged Polygons如果输入的几何体没有被 Boolean 切割,那么还原该几何体(方法同上)
Assume seam polygons are flat该选项会忽略去三角化(Detriangulate)过程中的精度差异。不过该差异会导致在 Boolean 处理高细节几何体的过程中出现自身相交()的问题,因此这种情况下最好关掉(当然关掉会导致输出的几何体中会有更多的三角面)
Unique Points Along Seams沿着 seam 将几何体的 surface 切割成几个 polygon,每个 polygon 都有自己独立的 points。该选项可以用于防止处于 seam 范围的点属性的 blending。
Collapse tiny seam-adjacent edges因为精度问题,通常情况下我们是不能精准的对齐几何体的;而这种细微的差异会导致用于对齐的边之前会有缝隙,这将会导致输出的几何体会有额外的边。该选项可以自动合并对齐的边,防止上述问题的产生。(不推荐关闭)
Edge length threshold边合并的最大距离,就像 distance 之于 fuse 一样。