Houdini 与程序化生成

Houdini 基础

🩷 学习资源与其他外网资源

💚 基础介绍

专有名词解释

  • HDA:Houdini的数字资产。如果掉了,需要去左上角的Asset -> Install Asset Library。封装好的工具、程序化模型。
  • USD:Universal Scene Description,它是一种通用场景描述格式,由皮克斯开发的。简单来说,就是用来在不同软件和工具之间交换和共享 3D 数据的,能让多个部门协同工作,而且还支持非破坏性编辑呢。
  • 烘焙(Baking): 是一种将高精度模型的细节信息(如光影、纹理、材质属性等)计算并存储到低精度模型对应的纹理贴图上的技术流程。其核心目的是在保证视觉效果的前提下,降低模型在实时渲染(如游戏运行、交互场景)中的计算压力。
  • Houdini 是 Y 轴向上的右手坐标系
Houdini 坐标系
  • .bgeo:Houdini 早期版本常用的独立几何文件
  • .hip(Houdini Project):Houdini 的工程文件格式,保存了场景中所有节点、参数、连接关系和视图布局。它本质上是一个文本文件,可以用文本编辑器打开查看。还有一个加密变体 .hipnc(Non-Commercial),用于非商业版 Houdini 保存的工程
  • $HIP/geo:经常会看到$HIP这种路径表示,代表当前选择的工作项目的根目录。
  • VOP Network(VEX Operator Network):可视化编程环境,把 VEX 代码的逻辑变成节点连线的方式,不用手写代码就能创建着色器、材质和几何体操作。和 Attribute Wrangle 做的是同一件事,只是交互方式不同。
  • VDB:开源跨平台格式,稀疏体积格式。Houdini支持最好。最小单位是体素(Voxel,3D空间最小的立体小方搁置)
  • Polygon(多边形):用顶点(Vertex)和边(Edge)围成的平面片(通常是三角形或四边形)来表示 3D 形体。多个多边形拼在一起构成网格(Mesh),就是最常见的 3D 模型格式。Polygon 模型的特点是精确可控,适合游戏和实时渲染,但表面是分段的平面,需要足够多的面才能看起来光滑。
  • NURBS(Non-Uniform Rational B-Splines,非均匀有理 B 样条):用数学公式和控制点来定义光滑曲面。不需要很多面片就能表示极其平滑的曲线和曲面,常用于工业设计(CAD)、汽车建模等需要精确曲面的领域。缺点是不如 Polygon 灵活,难以做布尔运算、变形等复杂操作。类似于贝塞尔曲线。

简单记:Polygon 是用小平面拼出来的,面越多越光滑;NURBS 是用数学公式算出来的,天然就是光滑曲面。 在 Houdini 里,Sphere 节点的 Primitive Type 可以选择用哪种方式生成球体。

节点类型

Houdini 里每种任务有自己独立的上下文(Context),每个上下文对应不同类型的节点:

上下文 路径前缀 处理什么 典型节点
SOP(Surface Operator) /obj/geo1/ 几何体建模 line, sweep, fuse, copytopoints, wrangle
OBJ(Object) /obj/ 场景中的物体容器、相机 geo, cam, light
LOP(Lighting Operator) /stage/ 灯光、材质、USD 场景 karmarendersettings, materiallibrary
ROP(Render Output Operator) /out/ 渲染输出 mantra, karma, rop_fbx
COP(Composite Operator) /img/ 图像合成处理 类似 Photoshop 的节点
CHOP(Channel Operator) /chop/ 动画曲线、音频通道 运动数据、程序化动画
TOP(Task Operator) /tasks/ 任务调度、批处理 批量渲染、数据处理流水线
VOP(VEX Operator) 嵌套在 SOP/LOP 内 可视化编程 VEX attribvop
DOP(Dynamics Operator) /obj/dopnet1/ 动力学模拟 粒子、流体、布料、刚体

简单记:SOP 建模型,LOP 打灯光上材质,ROP 输出渲染,DOP 做模拟。 这些上下文对应 Houdini 界面上不同的 Network View——切换到 /stage 就能看到 LOP 节点,切换到 /out 就能看到 ROP 节点,本质上是同一个编辑器,只是工作在不同的层级。

文件夹结构

Houdini 项目文件夹结构
  • abc:常存 Alembic 缓存文件,用于在不同软件间交换动画、模型等数据,方便跨软件流程协作 。
  • audio:存放音频素材,像音效、配乐,给视觉内容配音频时取用 。
  • backup:备份文件夹,存工程关键节点、文件的历史版本,防止操作失误丢失数据 。
  • comp:用于合成相关,存后期合成文件(如 Nuke 脚本、AE 工程),整合渲染层、校色等 。
  • desk:可能是桌面端(或工作区)临时文件、配置,存交互操作产生的临时数据 。
  • flip:多和 FLIP 流体模拟有关,存流体模拟的缓存、参数、中间结果,如液体飞溅效果数据 。
  • geo:核心之一,存几何数据,像模型(点、面、体)、地形、碰撞体,是场景搭建基础 。
  • hda:存 Houdini 数字资产(HDA),将节点网络封装成可复用模块,方便团队或跨项目共享 。
  • render:渲染输出文件夹,存最终渲染序列帧、静帧,也可能有渲染层、预合成文件 。
  • scripts:放各类脚本,如 Python、Hscript,用于自动化流程(批处理、节点控制、数据读写) 。
  • sim:广义模拟文件夹,除流体,还存刚体、柔体、布料等模拟的缓存、参数,如物体碰撞、布料飘动数据 。
  • tex:纹理文件夹,存材质纹理( diffuse、normal、roughness 贴图 ),给模型赋予外观用 。
  • video:存参考视频、剪辑素材,或用于测试的渲染小视频,辅助创意、节奏把控 。

UI 简介

👈 建模部分

  • 工具架(Shelf)
Shelf 工具架
  • ↲(回车) 进入编辑模式,按 Esc 退出编辑模式,进入观察模式
选择模式示意图
  • 1:模型外面
  • 2:模型里面
  • 3:动态选择模式,主要用于针对动力学相关对象进行选择操作

👉 节点编辑器(Network View)

  • 其他的节点面板
Houdini 节点面板
  • ch(Channel):主要用于处理通道数据,比如动画关键帧曲线、音频波形数据等。

  • img(Image):用于图像相关的处理,像合成图像、调整图像颜色、添加特效等操作。

  • mat(Material):主要负责材质的创建和编辑。

  • obj(Object):是物体级别操作的核心面板,用于创建、编辑和管理 3D 物体

  • out(Output):主要用于定义渲染输出设置。

  • shop(Shader):与材质的着色器编写和编辑有关,比 mat 节点更底层和灵活。

  • stage(Stage):用于管理场景的整体布局和资源。

  • tasks(Tasks):用于任务管理,比如设置渲染任务的优先级、分配渲染资源、监控渲染任务的进度等。

  • 未加载状态与加载状态

节点未加载状态 节点加载状态
- 右边:显示、布线显示 - 左边:Bypass 禁用节点、信息节点、冻结节点 - 按住 **Shift** 可以同时点亮两个模型 - 按住 **Alt** 可以复制 - 按住 **Y + 鼠标** 可以快速断线 - 如果需要一次性连接多个模型,可以选择多个模型后拖动其中一个的连接点到目标连接处 - 按住鼠标中键可以修改数值
节点功能图标
* 👇前面两个是给节点添加描述。第三个是换节点背景。最后一个是创建一个Subnet(子网格,相当于UE的节点整合功能)

image-20260506143401303

  • 👇Template:半透明当参考版;Display: 显示;Render:渲染时用谁;(和 Display 分开设置的好处:视口里看着是一个简化版,但渲染时用另一个精细版。Display 是给视口看的,Render 是给最终渲染器看的);
  • Lock:锁住缓存,不再重算;Bypass:临时跳过这个节点;

image-20260506190250271

🗑️ 其他

  • Houdini Console
Houdini Console

快捷键

🌐 全局

  • D 可以调出任意窗口的显示设置
  • 可以在任意界面按 D 设置当前页面内容。教程作者改了两个地方:把 Viewport -> Scene 下面的 Antialias Samples 调到最高,同时把背景换成了黑色。

🖇️ 节点面板

  • P 显示节点细节
  • Tab(节点面板)能够快速调出所有节点

💫 操作技巧

  • U 退出节点
  • I 进入节点
  • O 节点定位
  • Shift+O 新建一个描述框

表达式

  • $HIP:相对于 Hip 文件的位置

各种节点

功能

  • Merge:将多个输入的几何体物理合并为一个整体,是真正意义上的”合在一起”。
  • Group Create:只是给几何体中的点/面打标签(创建一个命名的选择集),并不会合并几何体。它只传递第一个输入的几何体,第二个输入仅用作边界框参考。

简单记:合并几何体用 Merge,命名选择集用 Group Create。想接合两个分支的模型,应该用 Merge。

“边界框参考”是什么意思?Group Create 的一种常见用法是:用一个物体的范围去框选另一个物体的点。

  • VOP Network(类型名 attribvop):可视化编程节点,双击进去可以自由添加、删除、连线子节点,完全自定义逻辑。类型名带 vop 的就是这类。VEX的节点版
  • 封装型节点(如 attribadjustfloat):内部也有节点结构,但是封装锁定好的,只能通过外部参数面板调节,不能改内部结构。这类节点本质是官方做好的 HDA,存放在 Houdini 安装目录的 otls 文件夹中。自己也可以通过选中节点 → Create Subnet → Create Digital Asset 来封装自己的 HDA。
  • File Cache:它的核心作用就是把计算结果存到硬盘上,以后直接从硬盘读取,不再重新计算。如果开 Load from Disk = 读存档,也就是说,上游节点不管怎么变,在 FileCache这边都不会改变。
  • Clean:清理几何体的拓扑问题,比如零面积的退化面、重叠的点、反转的法线、无效的边等。程序化建模中经常产生这些”脏数据”,Clean 就是把它们修好。
  • Fuse:把距离足够近的多个点”焊”成一个点。多边形经过布尔运算、VDB 转换等操作后,本来连在一起的边可能裂开——顶点位置几乎一样但实际是独立的点。Fuse 通过设置一个距离阈值(如 0.01)把这些”几乎重合”的点合并。
”引用节点实例(淡绿色)”/
  • 这种淡绿色的节点代表的是从其他地方引用过来的实例,而不是独立创建的节点。
”Null ”Null
  • Null 就是一个空节点,不对数据做任何处理。它的存在纯粹是组织/标记用途。可以配合着Object Merge节点实现跨节点的”远距离抓取”,根据节点名字作为参数进行引用。

UV

  • autouv:有些模型在变形之后,原来的 uv不适用了,所以要重新使用一下。

树干

  • Curve:用来画曲线的节点。但是作者说他更倾向于使用 add 这个节点,因为这个节点可以更精确地控制每一个点的位置。然后进到Polygons页面里,将这些节点调成 by group 连成一起。
  • copy and transform/transform:这两个节点可以用来调整模型的整体位置。
  • Resample 是把曲线从 NURBS 或 Bezier 曲线转换为 Polygon 曲线的节点。主要用来做曲线细分,重采用的功能。
  • Sweep:拿一个截面形状沿着路径曲线”扫”过去,生成管状几何体(把一个线变成有体积的)。

  • mountain:Mountain 节点使用程序化噪声对几何体表面进行随机位移,让光滑的球体变成不规则的有机形态。

VDB

这三类节点通常形成循环:多边形 → [VDB from Polygons] → VDB体积 → [VDB Combine] → 处理后的VDB → [Convert VDB] → 多边形。之所以要绕一圈 VDB 而不是直接在多边形上做布尔,是因为多边形布尔容易出破面、翻转法线等问题,而 VDB 布尔永远干净。

  • VDB from Polygons:把多边形网格转换成 VDB 体积(SDF 或 Fog)。可以理解为把一个实心 3D 模型”体素化”——记录每个小方块(体素)距离模型表面的距离。很多操作(布尔切割、碰撞检测、模拟)在体积空间里做比在多边形上做更方便、更稳定。
  • VDB Combine:对两个 VDB 做布尔运算(合并、相减、相交等)。比如:树的 VDB 减去某个形状的 VDB = 树上被挖了个洞。
  • Convert VDB:把 VDB 体积转回多边形网格。和 VDB from Polygons 正好反过来。VDB 做完布尔/变形等操作后,最终还是需要转回多边形才能渲染、贴材质。
  • Delete Small Parts(Labs):删除几何体中太小的碎片/孤立小岛。VDB 布尔、噪声变形等操作后经常产生肉眼几乎看不见的微小碎片,这个节点把它们清理掉。

🩵 操作

渲染不动 / 电脑卡死

点击某个节点的蓝眼睛(Display)时,Houdini 会从源头到该节点依次计算整条链路。Houdini 有增量缓存机制:已经算过的节点结果会缓存在内存里,下次只要上游没变,就直接用缓存,只计算新的一小段。

但如果直接跳到链路末尾的节点,中间所有节点都没有缓存,需要一口气全算。链路上如果包含大量 VDB 转换、UV 展开、Remesh、物理模拟(Vellum)等重操作,就会导致 CPU 跑满、内存爆满、C 盘被页面文件写满。

建议:不要直接点亮最终输出节点。从中间有 File Cache 的节点开始,逐个往下点亮,让 Houdini 利用增量缓存逐步计算。改了上游参数后,下游所有缓存会失效,需要重新计算。

基础操作

找不到的节点

可以用搜索功能找到对应没有 Cache 的文件

找不到节点时的搜索示意

HDA 文件丢失的问题

可以使用 Asset -> Install Asset Library

HDA 文件丢失处理

找不到某个节点

有可能是进入到了某个节点内部

进入节点内部示意

  • 还有一种情况是没有安装 SideFX Labs 这个官方的插件。

不同版本差别

Group 节点问题

在较新版本的 Houdini(18 以后)中,旧的通用 group 节点已被移除,取而代之的是一族更专业化的 Group 节点。在 Network Editor 中按 Tab 输入 group 即可看到所有可选的 Group 节点,其中最常用的如下:

节点 内部名称 用途
Group Create groupcreate 最常用的,按几何体/边界框/法线等创建组
Group Expression groupexpression 用 VEX 表达式创建组
Group by Range grouprange 按编号范围创建组
Group Paint grouppaint 用笔刷画组
Group Combine groupcombine 合并/交集/差集多个组
Group Promote grouppromote 在点/面/顶点之间转换组的类型
Group Transfer grouptransfer 从另一个几何体传递组
Group Invert groupinvert 反转组

如果你以前习惯用旧的 “Group” 节点,99% 的情况用 Group Create 就能替代。

公开 HDA 参数链接 UE

在 Houdini 中暴露参数

在 HDA 内部,把想要在 UE 中控制的参数**提升(Promote)**到 HDA 顶层:

  • 打开 HDA 的 Type Properties(右键节点 → Type Properties)
  • 切到 Parameters 标签页
  • 从左侧拖入需要的参数类型(Toggle、Float、String 等)
  • 然后在内部网络中,用 Channel Reference(鼠标中键拖拽)或 Copy Parameter / Paste Parameter Reference 把内部节点的参数引用到这些顶层参数上

参数组织建议

在 Type Properties 的 Parameters 标签里用 Folder 分组:

1
2
3
4
5
6
7
8
Main
├─ Spike Count (int)
├─ Spike Height (float)
├─ Add Ropes (toggle)
└─ Seed (float)
Supports
├─ Support Scale (float)
└─ Ground Offset (float)

这样在 UE 里参数也会按分组显示。

关键注意事项

要点 说明
输入几何体 HDA 的 input 会自动变成 UE 中的输入引脚,可以接入 UE 的静态网格体
曲线输入 如果 HDA 接受曲线输入,在 UE 中可以用 Pack 节点或直接画 Spline 传入
Output Node HDA 内部必须有 output 节点,输出才是有效的
属性命名 unreal_material 等 Houdini Engine 识别的属性名来传递材质信息
Bake 模式 UE 中生成结果可以选择 Output 作为 Static Mesh 或 Landscape 等

在 UE 中使用

  1. 在 UE 中安装 Houdini Engine for Unreal 插件
  2. .hda 文件放到 UE 项目的 Content 目录下
  3. 拖入场景,参数会自动出现在 Details 面板
  4. 调整参数后点击 Recook 或设置为自动 Recook