Houdini中HeightField相关节点在地形生成中占据了非常重要的地位,虽然可以在Houdini里右键节点-Helper查看详细的官方文档,但未对整个HeightField系统有一个宏观认识的情况下,也不知道要用哪些节点。所以单独开篇文章来记录常用的HeightField几点以及使用心得

(但HeightField手册又何必只是HeightField手册^ ^ _)

基础高度场操作

HeightField

基础的高度场节点,用于指定高度场的大小,细分/模拟粒度等基础信息

这个节点用于生成两个 2D volume 基元:height体积和mask体积,具有给定的分辨率和初始值,这些基元可以由其他地形节点进行修改。

height体积 是一个 2D 网格,表示地图上每个点的地形距离地面平面的距离(这些值可以为负)。

mask体积 可以用作其他地形工具的“mask”输入。它指定了地形节点的效果应该应用于哪些区域:mask值为 0 的区域不受节点影响,掩模值为 1 的区域完全受节点影响。地形节点允许你绘制mask或从地形信息中生成mask(例如,阴影落在哪里,或低于某个高度的区域)。

如果将这个节点的输出几何体连接到地形节点的第一个输入,它将对高度体积进行操作。如果将这个节点的输出连接到地形节点的“mask”输入,它将使用mask体积来缩放效果。

注意: 应该将 Houdini 单位视为米,当你输入比例和初始高度时。高度场工具和 Houdini 动力学假定单位为米。

  • Orientation:2D 体积在世界空间中的初始轴对齐方式。默认设置为 ZX,与“地面”平面对齐。
  • Sampling:体素中心应该位于给定大小的何处,相对于给定大小的中心。当 Height Field Convert 转换为多边形时,这些是生成的点的位置。
  • Initial Height:height体积的初始值,单位为米。默认值为 0。
  • Initial Mask:mask体积的初始值。默认值为 0。
  • Division Mode:将体积分辨率设置为sample数或grid距离。
    • By Axis:按轴细分
    • By Size:按大小细分
  • Grid Samples:当 Division Mode 为“By Axis”时,每个轴上的网格点数。
  • Grid Spacing:当 Division Mode 为“By Size”时,网格点之间的距离,单位为米。
  • Uniform Scale:缩放体素的大小。
  • Size:体素的宽度和高度,单位为米。
  • Center:体素的中心位置,以世界空间为单位。

需要注意的是,Houdini的HeightField边缘部分会把 1/2 的Grid单位留空,比如我们一个32x32的HeightField,Grid Space为1时,那么边缘0.5位置都是空的,为2时,边缘1位置都是空的,图示如下:

橙色线是HeightField的真实边缘,而右边mesh是真正渲染的体素区域,Grid Spacing为2,所以相隔了1单位

这也是为什么我们对地形切分的时候,要预留出一些长度出来

image-20231029160033325

HeightField Pattern

提供一些基础的高度场形变模板,例如阶梯状,星形等,并且可以在此基础上进行扭曲操作

HeightField Noise

对高度场赋予基于噪声的形变,内置很多噪声类型,通常用于快速生成基础地形,并且可以在此基础上进行扭曲操作

Amplitude(波幅)

指的是该节点用于控制地形高度的噪声或变动的幅度。该参数影响噪声对地形的影响程度,从而决定了地形表面上山峰、河流、山谷等细节的大小和强度。通过调整该参数,您可以控制噪声对地形高度的影响程度。较小的值将导致轻微的地形变化,而较大的值将产生更强烈的高度变化。

Element Size(元素尺寸)

用于控制噪声的频率或细节级别。它影响噪声在地形上的变化频率,从而决定了噪声产生的特征大小和密度。

性能影响:较小的元素大小将产生更多的噪声细节,因此可能会增加渲染或模拟的计算负担。较大的元素大小可以用于加快计算速度,但可能会牺牲一些细节。

Noise Setting(噪声设置)

  1. Fractal:决定是否在较大的噪声上进行多次迭代,每次迭代会添加较小规模的噪声。这样的效果被称为分形噪声。
    • None
      • 选择None类型时,HeightField Fractal节点不会添加任何额外的噪声到基本噪声上。
      • 这将产生一个简单的噪声效果,地形将呈现较为平滑的表面。
    • Standard
      • Standard类型会在基本噪声上添加伪随机噪声。
      • 这是最常用的分形类型,通过添加随机性的噪声,可以在地形上生成自然的起伏和细节。
    • Terrain
      • Terrain类型与Standard类型相似,也会在基本噪声上添加噪声,但会在山谷(低处)中抑制噪声。
      • 这种类型产生的地形看起来更像真实的地形,因为山谷地区通常会更平缓。
    • Hybrid Terrain
      • Hybrid Terrain类型是在Terrain类型基础上增加了更多的尖锐噪声。
      • 这种类型会在地形的山谷中产生更锐利的特征,使地形看起来更加多样和复杂。
    • Flow
      • Flow类型可以用于模拟流动效果,如水流或火焰。
      • 当选择Flow类型时,可以使用Flow Rotation参数来控制“涡旋”的旋转程度。
  2. Max Octaves(最大迭代次数):限制分形噪声的迭代次数,即迭代的层数。
  3. Lacunarity(等差增量率):分形迭代之间的频率增量,决定细节级别的变化。注意,可以使用负值。
  4. Roughness(粗糙度):分形噪声的粗糙度,决定噪声的细腻程度。
  5. Flow Rotation(流动旋转):在噪声类型为"Flow"时,控制“涡旋”的旋转程度(0到1之间)。"Flow"类型噪声可以用于创建流动效果。

Post Processing(后处理)

  1. Fold(折叠)
    • Fold选项会将噪声输出的值限制为绝对值。
    • 这意味着所有的噪声值都将变成正数,消除了负数值的影响。
  2. Complement(取反)
    • Complement选项会将噪声输出的值进行颠倒,即输出值等于 1 减去噪声值。
    • 这将产生一个与原始噪声相反的地形效果。
  3. Gain(增益)
    • Gain选项用于增加或减小噪声输出的对比度,参数范围是从 0 到 1 之间。
    • 较小的Gain值会降低噪声的对比度,使地形变得平缓。
    • 较大的Gain值会增加噪声的对比度,使地形变得更陡峭和波动。
  4. Bias(偏置)
    • Bias选项用于将噪声输出向上或向下移动,参数范围是从 0 到 1 之间。
    • 较小的Bias值会将噪声输出向下偏置,使地形更加平坦。
    • 较大的Bias值会将噪声输出向上偏置,使地形更加陡峭。
  5. Clipping Minimum(下截断)
    • Clipping Minimum选项用于限制噪声输出的最小值。任何小于该值的噪声都会被截断。
    • 这将产生一个在某个最小高度以下没有变化的地形,即地形被剪切在某个最小高度上。
  6. Clipping Maximum(上截断)
    • Clipping Maximum选项用于限制噪声输出的最大值。任何大于该值的噪声都会被截断。
    • 这将产生一个在某个最大高度以上没有变化的地形,即地形被剪切在某个最大高度上。

通过在HeightField Fractal节点的Post Processing参数中选择不同的处理选项,您可以进一步调整噪声输出,控制地形的对比度、形态和范围,从而得到更精确地满足需求的地形效果。

Distortion(扭曲)

  1. Enable Lattice Warp(启用格点变形):
    • 当启用该选项时,HeightField Fractal节点会在标准噪声上添加“stringiness”或“wiriness”(细长或蜿蜒)效果。
    • 这将增加噪声的复杂性,使地形具有更加曲折的特征。
  2. Accumulate Lattice Warp(累积格点变形):
    • 当格点变形开启时,启用此选项将在每次迭代(音阶)添加分形噪声时累积变形效果。
    • 这使得格点变形效果在不同迭代层次上叠加,增强了细节和复杂性。
  3. Lattice Warp(格点变形强度):
    • 该参数控制添加到噪声上的“stringiness”或“wiriness”的强度。
    • 较高的格点变形强度将产生更强烈的细长效果,而较低的强度将减少该效果。
  4. Freq(频率):
    • 该参数控制“stringiness”或“wiriness”的频率,即细长的特征的数量。
    • 较高的频率将产生更多、更密集的细长特征,而较低的频率将产生较少、较宽松的特征。
  5. Enable Gradient Warp(启用梯度变形):
    • 当启用该选项时,HeightField Fractal节点会通过加宽噪声的峰谷来改变噪声形状。
    • 这将增加地形的细节,使地形具有更加复杂的起伏。
  6. Accumulate Gradient Warp(累积梯度变形):
    • 当梯度变形开启时,启用此选项将在每次迭代(音阶)添加分形噪声时累积梯度变形效果。
    • 这使得梯度变形效果在不同迭代层次上叠加,增强了细节和复杂性。
  7. Gradient Warp(梯度变形强度):
    • 该参数控制加宽噪声峰谷的强度。
    • 较高的梯度变形强度将使噪声峰谷更加宽广,而较低的强度将减少该效果。

HeightField Project

将一个几何图形投影到高度场上

HeightField Blur

对高度场进行模糊处理,使其更加平滑

HeightField Remap

重映射高度场的数值,通常用于控制和修改指定数值的范围

HeightField Distort

对高度场的指定数值执行扭曲操作

与 “Heightfield Noise” 节点不同。“Heightfield Noise” 节点用于将高度值上下变化,而 “HeightField Displace” 节点则通过将现有值通过噪声场进行迁移,将它们移动到新的位置。这类似于像Photoshop中的滤镜会通过扭曲现有像素来改变图像的方式。

扭曲图层(Distort Layers)

指定要操作的图层模式,通常为高度或 * (全部)。

蒙版图层(Mask Layer)

如果将蒙版体积连接到此节点的第二个输入,这将指定要用于掩盖此节点效果的第二个输入中的哪个体积,通常为蒙版。单击“添加蒙版绘制”按钮可直接在视口中绘制蒙版(这会自动在第二个输入中添加一个绘制节点)。

螺旋噪声(Curl Noise)

使用螺旋噪声创建扭曲效果。在较大的振幅下,这可以创建有趣的螺旋特征。如果关闭此选项,则节点使用抗锯齿噪声。

振幅(Amplitude)

扭曲的程度。较大的值会更大程度地移动、拉伸和旋转现有特征。在使用较大的振幅值时,应考虑增加子步骤。否则,整个大尺度变化会一次应用,可能会造成混乱。

元素大小(Element Size)

最低频噪声波峰之间的距离。

元素缩放(Element Scale)

在三个主轴上的各向异性缩放噪声。

偏移(Offset)

噪声函数的世界空间偏移。

粗糙度(Roughness)

分形粗糙度。

最大迭代次数(Max Octaves)

要添加到基本噪声输出的扭曲迭代次数。添加的迭代次数越多,输出越“详细”。

子步进数(Substeps)

将总期望振幅按此数量分割,并逐步应用。这允许更细微的细节和较小的变化,但速度较慢。通常,随着振幅的增加,您通常会增加子步骤,以防止大尺度变化造成混乱。

HeightField Tile Split

对HeightField按tile进行拆分

  1. Voxel Padding(体素填充): 在tile边界上添加的重叠区域的大小,以体素为单位。当你将tile拆分处理时,可以通过添加一些额外的体素来确保tile之间有重叠,以防止显示上的裂缝或其他问题。
  2. Tile Lower Overlap(tile负方向重叠): 当提取tile时,在负方向上,每个tile将以这么多体素的重叠区域与其相邻的tile重叠。
  3. Tile Upper Overlap(tile正方向重叠): 当提取tile时,在正方向上,每个tile将以这么多体素的重叠区域与其相邻的tile重叠。

上述类型的区别就是,Voxel Padding是四方向全填充重叠体素,而Tile Lower/Upper Overlap是指定某个方向填充

注意,以上的正负方向是由tile切分后结果index决定的,例如3*3分块后,中间的tile,正方向为5,7tile,负方向为0,3tile

这些参数用于控制在使用"Houdini Height Field Tile Split"节点时,tile之间如何重叠以及如何在拼接tile时保持合适的重叠区域。通过调整这些参数,你可以在处理高度场数据时获得更好的结果,确保在分割和拼接tile时不会出现不连续或不匹配的情况。

需要注意的是Tile Upper Overlap默认就给了1,因为我们上面提到了HeightField边缘部分会把 1/2 的Grid单位留空,所以默认留了一位,如果Tile Upper Overlap为0,分割的tile是有缝隙的

一般情况下重叠区域不需要,也不能给太多,因为通过HeightField Tile Splice拼接的时候,对于重叠的体素部分,是直接连接的,并没有任何混合插值处理,所以默认情况下,留出1体素重叠量给HeightField Tile Splice即可

image-20230816235832676

HeightField Tile Splice

寻思半天也没寻思出来这玩意应该怎么用,直到我把两个tile merge到一起,然后连接到这个节点,才打开新世界大门。。。,不过官方也没有演示如何通过HeightField Tile Splice将分割好的tile拼接在一起,下面是将所有tile重新拼接到一起的一个示例:

image-20230822000140821

其中Heightfield_tilesplit1节点的Tile Number Channel需要为

1
detail('../foreach_count1', "iteration", 0)

即取得foreach_count1节点的名为iteration的detail值

最终将所有结果Merge起来,通过HeightField TileSplice节点进行无缝拼接

特定高度场效果模拟

HeightField Terrace

将高度场的指定高度范围的高度变化处理成梯田的形式

HeightField Erode

高度场侵蚀模拟,可以模拟雨水,风力,热力等自然侵蚀,包含非常多的参数供调整

HeightField Slump

高度场沉积模拟,可以模拟地形的沉积效果(例如四面环山的坑洼之地长年累月沉积成平坦的盆地),用于描述泥土,岩石在外力作用下的自然沉淀效果

HeightField FlowField和HeightField Slump共同作用下的结果

高度场中的Mask数据操作

上述内容大部分都是在操作高度场中的Height数据,但高度场还有一个重要数据:Mask

HeightField MaskNoise

对高度场的指定Mask赋予基于噪声的形变

HeightField MaskBlur

对高度场的制定Mask进行模糊处理,使其更加平滑

HeightField MaskByFeature

为Mask提供多种基于地形的操作方式,常用于隔离山峰和山谷、确定覆盖雪的区域以及植被可以生长的区域

HeightField MaskByObject

基于几何图形的投影确定一个Mask,并可以与当前已有的Mask(Input)做交互,例如相加,相减等

Combine with Existing

  • Replace: 清除现有蒙版并用新蒙版替换。
  • Add: 将此蒙版中的值添加到任何现有蒙版中。
  • Subtract: 从任何现有蒙版中减去此蒙版中的值。
  • Difference: 将蒙版值设置为旧蒙版与此蒙版之间的差异。
  • Multiply: 将旧蒙版的值乘以此蒙版中的值。这可能对“缩放”现有值并保留空白区域很有用。
  • Maximum: 将蒙版值设置为旧蒙版和此蒙版中的最大值。
  • Minimum: 将蒙版值设置为旧蒙版和此蒙版中的最小值。
  • Blend: 通过一定的混合量混合旧蒙版和此蒙版。

混合量: 在“Combine with Existing”为“Blend”的情况下,用于混合旧蒙版与您绘制内容的量。值为0保留现有蒙版,值为1用新蒙版替换,值为0.5在旧蒙版和新蒙版之间均匀混合。

Method

  • Project: 假设第二个输入是表面几何体,将其“投影”到地形上以创建蒙版。
  • Fog Volume: 假设第二个输入是雾体体积,在与地形相交的位置创建蒙版。
  • SDF Volume: 假设第二个输入是SDF体积,在与地形相交的位置创建蒙版。

Masking by Geometry

控制在投影模式下,将几何体投影到地形的方向。

  • Either Side: 如果几何体在地形的上方或下方,高度场将被遮罩。
  • Above Heightfield: 如果几何体在高度场上方,即几何体将向下投影到地形上,高度场将被遮罩。
  • Below Heightfield: 如果几何体在高度场下方,即几何体将向上投影到地形上,高度场将被遮罩。

以下是使用Markdown格式排版的内容:

最大距离

  • 当方法为“project”时,在判断投影未命中高度场之前的最大投影距离。

密度

  • 几何体投影/相交时设置蒙版层的值。

模糊方法

控制如何模糊蒙版边缘。仅当模糊半径大于0时可见。

  • 模糊: 高斯模糊。
  • 盒状模糊: 更快速的模糊。
  • 扩展: 不进行模糊,扩展绘制的形状。
  • 收缩: 不进行模糊,收缩绘制的形状。

模糊半径

模糊/扩展/收缩填充形状边缘的程度(取决于模糊方法)。值为0没有效果。

超采样

在投影时,发送额外的光线,这些光线会被随机扰动(“抖动”),并使用指定的光线合并器(Ray Combiner)进行组合。当模型存在小间隙或孔时,光线可能会错过,这时超采样很有用。

样本数

要发送的样本光线数量。如果设置为大于1,将从当前体素的中心发送一条光线,而额外光线的起始点将散布在中心周围。这些碰撞返回的距离按照Ray Combiner指定的方式进行组合。仅当Jitter值不为0时,此效果可见。

抖动

控制额外光线可以变化的程度,以体素为单位进行指定。抖动值为1意味着额外光线可以与当前体素的中心相隔多达1个体素,而抖动值为0.5指定光线与中心只相隔半个体素。抖动值为0没有效果。

光线合并器

控制如何将每条光线的碰撞距离合并为单个距离。

  • 平均: 平均距离以创建最终距离。
  • 中位数: 最终距离为中位数距离。这通常可以很好地平滑掉模型间隙造成的尖峰。
  • 最短距离: 最短光线决定最终距离。
  • 最长距离: 最长光线决定最终距离。

种子

设置随机数生成器的种子。不同的种子会产生不同的光线集,因此可以调整以最小化由间隙和孔造成的尖峰。

HeightField MaskClear

清除指定Mask

实用节点

HeightField Resample

重采样高度场,用于更改细分大小

HeightField Visualize

可视化高度场

HeightField Layer

指定两个高度场数据操作

HeightField Scatter

对高度场进行撒点操作,提供很多操作参数,可以精确控制撒点区域

HeightField Output

将HeightField进行导出,有以下几个注意点:

  • 如果一个heightField存在多个Volume,此节点只会处理第一个image-20230830002559370,所以要么通过HeightField Splice进行Merge,要么就分Tile导出
  • 在进行导出的时候,需要确保Houdini当前帧数正确,否则会出现导出结果为空的情况,例如帧数为0

其他

Q:对于Houdini中一些非常耗时的模拟流程,有什么办法将其缓存,而不是每次打开Houdini都进行模拟吗?

A:File Cache 节点


Q:如何查看节点提供给Python脚本调用的API及其内部实现

A:右键节点-Edit Extra Sections Source Code,即可查看源代码,不过这些API一般是没法通过Python直接调用的,例如FileCache的Save To Disk按钮,是点击后通过回调单独调用一个python脚本实现的,所以通过hou.node(node_name)获取节点实例后是没法调用相关API的,只能手动将实现复制一份到自定义Python节点中