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

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

HeightField Project

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

HeightField Blur

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

HeightField Remap

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

HeightField Distort

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

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

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)做交互,例如相加,相减等

这里列出几个比较常用的Mask混合方式

Combine with Existing

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

HeightField MaskClear

清除指定Mask

Heightfield DrawMask

直接手绘Mask,但是这个工具的绘制方式非常奇怪,是基于套索的模式,初次体验,不是很趁手

HeightField Paint

功能同Heightfield DrawMask,但这个节点才是更符合日常使用习惯的笔刷模式

image-20240619234348064

实用节点

HeightField Resample

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

HeightField Visualize

可视化Layer。当我们自定义了一些Layer之后,Houdini默认是不会像mask那样显示出来的,就需要借助此节点做可视化,着色顺序是高层级覆盖低层级

HeightField Layer

指定两个高度场数据操作

Heightfield CopyLayer

拷贝Layer,一般新建Layer就会使用此节点

image-20240619234702973

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节点中


Q:Houdini自带的文档浏览器很不好用,我想把它替换成Google Chrome或者本地任何浏览器,来享受强大的浏览器翻译插件,应该怎么处理

A:找到环境变量文件,一般位于C:\Users\Administrator\Documents\houdini19.0\houdini.env,加入一行 HOUDINI_EXTERNAL_HELP_BROWSER = 1,重启Houdini即可