What & How & Why

Scatter

Scatters new points randomly across a surface or through a volume.
Ver 19.5


Overview

  • Scatter 可以将点按照一个较为统一的图案分布到指定的 surface 和 Volume 中。对于 Volume 来说,Scatter 会按照 Volume 中对应的密度来分布点(负值处不会分布点。)
  • Scatter 的应用范围很广,可以将几何体转化为被拷贝的对象,可以作为粒子源,也可以做为破碎的点的基础,或者用于辐照度的计算。
  • Scatter 中可以通过密度(density)属性来控制点的分布。我们可以通过控制 density 的权重,或者使用基于 density 的贴图来控制分布。

tips

  • Force total Count 表示拷贝的点数量不变,但被拷贝物体的大小(@pscale)会根据点的分布而改变
  • Density Scale 意味着被拷贝物体的大小不变,但拷贝点的总数量会发生变化

scatterscatter and align 中都支持导出正确的 pscale,该 pscale 基于最大的 relax iteration点的总数计算。当 relax iteration 关闭时,导出的 pscale 无法被正确计算。

常用参数

Options

Generate
By Density点将会基于 Density 来分配。Density 通过单位长度(Curve),单位面积(Surface)或者单位体积(Volume)来计算。
Count per Primitive按照 Count per Prim Attribute 提供的点的总数来分布点。点的 relaxation 将以 Primitive 为单位计算。
In Texture Space此种方法下,点会先分布到 texture space 中(一个正方形),然后会基于 uv 属性选取任何处于同一个位置的点。
Density Attribute使用 Density 属性来控制点的分布(需要通过 By Density)来生成点。

当使用 point / vertex 的 density 属性的时候,Houdini 会使用线性插值的方法处理 density。这种情况下对使用 paint 节点非常有利。

该属性会在 Force Total Count 点选的情况下采用点的相对密度(也就是相对于总数的密度)来进行计算,而不是根据点的绝对密度分布来进行计算。
Override Prim Area当启用Generate by density 的时候,点选该选项表示使用特殊的值或者 primitive 的属性代替 primitive 的面积来决定每个 primitive 生成点的数量。

打个比方,指定该值为 1,则代表使用 Density scale 或者 density attribute(可选)来决定每个 primitive 生成点的数量。该数量取决于global / primitive seeds。这与 count per primitive 可以让每个 primitive 生成指定数量的点是不一样的。
Scatter on Voxels Independently当启用该选项后,每一个 voxel 将被独立的进行 scatter,因此改变 volume 中某个区域的 density 将不会影响其他区域点的生成(但点的数量会改变,relax iteration 也会持续将靠近的点推到离彼此更远的位置)。

该选项不能保证可以生成指定数量的点,因此 Force Total Count 是不能与该选项一起使用的。
Force Total Count只能用于 Generate by density,指定生成的具体点的数量。关闭该选项会使用 density 或者 primitive 的面积大小来控制点的生成。上述条件的改变可能会造成点的闪烁。
Density Texture如果使用贴图空间来生成点,那么点的 density 将受到 density scale 相乘 的影响。同时,因为 Max Relax Radius 将处于贴图空间中,这个值应该设置为非常小。(原因请查阅 Max Relax Radius)。

Texture map Scale 造成的变形会影响点在物理空间中的相对密度。这是因为 Houdini 首先将点分布在 texture space 中,然后再根据 uv 属性选择出现在相同区域的点。当然,如果点都分布在同一个 local (比如一个几何体),就不会有以上的问题。

Count per Prim Attribute选择该选项后,该选项会接收一个整型的数据(不管是整数还是整数属性的名称)用于表示每个 primitive 上的点的总数。
Max Points该选项可以控制可生成点的最大数量。该选项可以辅助 Force total count 使用。出于某些原因,我们可能会生成比我们指定数量更多的点,而该情况会导致某些错误或者场景崩溃。通过设置 Max points, Houdini 会在生成的点超过允许最大数量的情况下只使用最大数量的点生成类似我们定义的分布;同时,Houdini 会警告告知多少点会生成。

当使用 texture 生成点时,Max points 控制的是单位(unit)texture space 中的最大点数量;也就是说,重复的 texture map 不会计算到该限制中。
Primitive Seed Attribute该选项可以在 Generate by density 的过程中为该过程添加额外的随机 seed。这些额外的随机 seed 用于决定每个 primitive 上生成的点的数量,以及用于生成每个 Primitive上的点。

关闭该选项后,primitive 的 seed 由 primitive number 决定。使用 primitive number 作为 seed 可以保证比较一致的 scattering,也就是说,在这种情况下添加或删除一些编号比较小的 primitive 不会对整个细节造成较大影响。
Randomize Point Order这种情况点的分布基于 By density 的默认设置分布(也就是单位控制分布)

Relax Iteration 可以防止点过度的靠近,保证点与点直接的相对距离。迭代越多,点的分布越均匀

Relax Iterations当启用该选项的时候,生成的点将被 “relax”,也就是说,每个点都会互相的推开彼此,避免彼此聚集在一起。这种“relax” 是渐变的,其目的是避免在该过程中出现一些混乱的状况;同时,通过渐变的控制 “relax” 也可以让我们可以轻松的控制我们需要的 “relax” 的量。

更多的迭代次数会导致点更加分离。(注:良好的点的分布一般被称为 Blue Noise)。

在使用 Density 生成点时,为了更好的保持密度的变化,通常点的半径(注:该半径应该指 “relax” 的影响范围,也就是点会互相 push 的范围)与密度有如下的关系:
  • 对于 curve,点的半径与密度呈反比
  • 对于 surface,点的半径与密度的平方呈反比
  • 对于 volume,点的半径与密度的立方呈反比

因为有这样反比的关系,因此我们必须考虑点半径的大小。在实际应用的情况下,某些点的 “relax” 半径会非常大(比如使用 texture 作为 density 的源,texture 中的黑色区域将导致该区域的点的半径趋近于无限大),这种情况下会导致对应的密度无限趋近于 $0$。因此,我们必须通过正确的设置 Max Relax Radius ,来限制这些具有非常大 “relax” 半径的点把其他的点推的过远。

如果选择 Generate in Texture space, 那么 “relax” 的范围会处于 texture space 中,因此在 seam (比如正方体两个面的交界处) 的位置,点会更集中一些。

如果选择 Generate in Count per Primitive,那么每一个 primitive 的点只会对该 primitive 内的点进行互相的 push (也就是按 primitive 为单位进行 “relax”),从而保证每一个 primitive 中生成固定的点的数量(对 volume primitive 同样适用)。

对于 curve,Houdini 可能需要几千次迭代才能使 curve 上生成的点均匀分布。除此之外,curve 也遵循 Primitive 之间 “relax” 互不干涉的原则。

如果 primitive 的种类不同(比如curve、surface、volume 和 四面体(tetrahedra)),那么任意一个 primitive 上的点的 “relax” 都不能影响其他 primitive 上的点的分布。

Scale Radii By该选项会在 points relaxing 完成之前应用到点上。如果该值小于 $1$,会导致点聚集的区域变得更多;而该值等于 $0$ 的时候没有任何 point relax 存在。当该值大于 $1$ 时,将使 relax 的值最终趋近于收敛(也就是趋近一个值)。

Max Relax Radius 将在 Scaling 后结束。Radius 属性将会反映最后的半径值。
Max Relax Radius该选项的内容请参考 Relax Iterations sections。需要注意的是,该选项关闭并不意味着 Relax 半径的上限就不存在了。具体的处理参考如下:
  • 普通列表项目如果通过几何体来生成点,那么Relax radius 的上限是输入几何体的-Bounding Box的-对角线的-一半。
  • 如果使用 texture 生成点,那么该上限为 $1$。
Prim Num Attribute该选项会输出一个属性。该属性会标明生成的点属于哪个 primitive。考略到 relaxation 后会有点会被推离对应的 primitive,该属性会在 relaxation 完成后计算并且输出。
Prim UVW Attribute该属性会标明生成的点在对应 primitive 中的坐标。该属性计算优先级同上。该属性和 Prim Num Attribute 共同使用可以为 Attribute Interpolate 提供信息(一般来说用于 points stick on the deform geometry。 )
Output Attribute
Output Density Attribute输出生成点的密度属性。使用 Texture 生成的点会输出 Texture space 中的密度,其他的恢输出 物理空间中的密度。
Output Radius Attribute输出生成点对应的 relax 半径属性。该属性将在 relaxation 结束后决定。

该属性是在 relaxation 的过程中交由点使用的半径。 如果不使用 texture 生成点,并且不使用 texture space 输出点的密度,那么该属性表示的半径就是基于物理空间的。

如果该半径的值超过了 Max Relax Radius 的值,则该半径的值会被限制在 Max Relax Radius 的值以内。如果没有达到 Max Relax Radius 规定的上限,则根据生成点的几何体的类型,该半径与密度的比例为:
  • curve: 0.5 / density
  • surface: 0.537 / sqrt(density)
  • volume: 0.561/cbrt(density)