======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 的操作示意图如下:
{{ vfx:houdini:sop:node:polygon:boolean-min_1_.png |}}
===Solid / Surface===
{{ vfx:houdini:sop:node:polygon:boolean_2_2-min.png |}}
* Union / Subtract 的时候,如果是**部分相交**,相交部分的 surface 会变成 double wall ,也就是没有体积,两个面重合在一起的形式(Subtract 的例子在下面。)
* 从 solid 中 Subtract surface,如果两者只有**部分相交**,那么相交部分会得到一个看上去像线段的几何体(也就是之前说的 double wall,表现为 corner 处有多个点)。详情看下图(注意 point 的数量)
* 在测试 Shattering 的过程中得到了与 Subtract 同样的结果,但点的数量是唯一的,与帮助上有冲突。FIXME
{{ vfx:houdini:sop:node:polygon:ss_subtract_1-min.png?400 |}}
===Surface / Surface===
{{ vfx:houdini:sop:node:polygon:boolean_3-min.png |}}
====Schematic views====
下图中,Double wall 表现为有厚度的线,原点表示有多个点。
{{ vfx:houdini:sop:node:polygon:scheme-min.png?600 |}}
====Other Mode====
===Custom===
该操作只用于各种重合的、或者是同心的几何体(比如 box 套 box,自我相交的几何体之类的)。//Custom// 允许用户自定义 ''depth'' 来分离出指定的区域。
\\
\\
这里的 ''depth'' 指的是几何体内某一点要达到几何体最外部所需要穿过的 surface 的**最少层数**。下图是例子:
{{ vfx:houdini:sop:node:polygon:depth-min-min.png |}}
===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'' 开启的时候变得尤其明显;因此我们可以关闭该选项解决上述的问题。
====常用参数====
^Parameters^Usage^
|Remove self-intersections|自动修复 surface 的穿模 / 重叠的问题。 |
|Detriangulate|Boolean 会在开始将输入的几何体三角化。这个选项用于将三角化的几何体还原,以便匹配输入的源几何体。|
|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 一样。 |