Houdini 版本:20.5.278
SideFXLabs 版本:20.5.253
开篇:泰坦计划
这个笔记是泰坦计划的学习记录,这里是第一章节电缆的基本资产内容制作笔记,对应视频的第一章,1、2、3、部分的内容。
泰坦计划是Houdini官方推出的、上千艺术家参与的开放项目;内容包含Houdini以及联动UE的方方面面。
- Houdini官方介绍:Project Titan | SideFX
- UE新闻:“泰坦计划”示例游戏现已推出:探索这个巨大的开放世界
第一部分:电缆
制作目标


省流
- 基于一根
line | 线通过sweep | 扫描节点生成主体电缆的基础; - 然后再次扫描,生成更细小的装饰性电缆;
- 接着通过模拟呈现自然下垂的效果;
- 最后清理多余的点,减少消耗。
重要知识点:
- 自动处理间距,避免生成的主电缆重叠:使用
Connect Adjacent Pieces | 连接相邻部分,获取电缆之间的间距,将其赋予pscale属性。 - 自定义Vex代码调整
- 删除小于一定大小的主电缆。
- 手动调整
pscale缩放。
- 利用循环,生成随机次要电缆
- 随机选择主电缆:
Labs Random Selection随机选择。 - 生成环绕的次要电缆:使用
foreach循环创建次要电缆。 - 随机次要电缆大小:通过备用输入获取循环次数,作为随机种子。
- 随机选择主电缆:
Vellum Constraints | 布料约束模拟相关。- 模型优化:
Subdivide | 几何细分节点:平滑模拟结果。Facet | 面片节点:不影响形状的前提下减少顶点。- 使用不同的扫描参数,减少次要电缆顶点消耗
小知识点汇总
- switch 切换流程
- split 进行分流
- facet 删除共线的顶点
一、创建主电缆
自动处理间距,避免生成的主电缆重叠

自定义Vex代码调整属性
使用 Attribute Promote | 属性提升 节点,通过 VEX 代码手动调整两个属性。
这里调整了两个效果:
- 删除小于一定大小的主电缆。
- 缩放主电缆。

Vex代码:
if(@pscale < chf('MinPscale')) // 如果生成的管道大小小于设定值(MinPscale值)
removeprim(0, @primnum, 1); // 删除该管道
@pscale *= ch("scale"); // 调整 pscale 缩放
这里的缩放可以同步控制 主管道的大小 和 次要管道的环绕半径。
注意!关于 pscale (1/2):
属性
pscale主要影响了两个参数:
- 最终渲染的管道粗细
- 模拟时的碰撞体积大小
二、创建次要电缆
1、随机选择主电缆
有 SideFXLabs 的帮助,这个操作会很简单。
使用 Labs Random Selection 节点即可:

2、循环创建次要电缆
通过 For each 可以搜索出循环节点,与普通节点不同,这是一个必须组合才能产生作用的节点。
- Block Begin:设置循环类型,获取循环数据等。
- Block End:设置循环次数、循环增量等。

创建 For-Each 节点,将创建次要电缆作为循环体,以便批量创建。

2、随机次要电缆 pscale 属性
使用 备用输入 获取循环次数作为随机种子
创建备用参数

引用参数作为随机种子
核心代码:detail,返回一个细节属性(detail attribute)的值。
detail(-1, iteration, 0);
- 1:表示备用输入
- iteration:即引用的变量的值
- 0:属性索引

VEX代码
// attribcreate2
rand(detail(-1, iteration, 0) - 1)
// 用循环次数做索引,直接通过 rand 函数生成随机数
// sweep2
detail(-1, "iteration", 0) * 5 // Roll
(detail(-1, "iteration", 0) + 1) * 2 // Full Twists
// Full Twists 参数必须 “+ 1”,为了避免生成值为“0”(显示为直线,没有环绕)
三、布料模拟
无论什么时候,模拟阶段都是重头戏,因为需要调整大量参数,当模拟时对参数不了解会导致调节时无从下手。
模拟前准备


1. 细分线段
创建模拟基础:使用 Resample | 点的重新采样 节点在原始线段上生成更多的点,这些点是模拟的基本单位。
注意:点的数量也会影响解算
当点数量多时:
pscale变小。- 绳索看上去更松弛:更容易耷拉下去,显得像是拉面一样。
2. 分组
使用 Groups | 群组 节点为主电缆和次要电缆打上标签,方便接下来进行区分。
3. 定住两端
为了让两端不要跟着一起下落,使用 Group by Range | 按范围分组 节点选取线段两端的点,命名为pin,作为解算中的 Pin Point 参数输入。
4. 分开调整参数
使用 Split | 分流 节点分开两股电缆,这个时候就用上上面分组产生的两个组了:
其中,要对次要电缆再次使用 Attribute Promote | 属性提升 节点进行精细调整:
@pscale *= ch("scale"); // 调整 pscale 缩放
这里会提供一些制作时用到的参数,并指出其如何影响结果。
Vellum Constraints | 布料约束 参数
| 分组 | 参数名称 | 功能 | 推荐值 |
|---|---|---|---|
| Constraint Type,约束类型 | 使用Houdini提供的模板,方便直接模拟类似物体 | String | |
| Geometry,几何 | |||
| Density,密度 | 相当于控制mass重量属性,越大越不容易被别的物体影响,同时也越容易被自己的拉伸 | ||
| Thickness,厚度 | 相当于调整pscale参数,也就是管道粗细 | ||
| Pin to Animation,固定到动画 | 决定在模拟时排除哪些点 | ||
| Pin Points,固定点 | 上面创建的pin | ||
| Stretch 拉伸弹簧 & Bend 弯曲弹簧 | 似乎不像参数名称那样方便调节,并不是很理解 | ||
| Stiffness,刚度 | |||
| Damping Ratio,阻尼比 | |||
| Rest Length Scale,静止长度比 | |||
| Rest Angle Scale,静止角度比 |
关于
Stretch | 拉伸弹簧&Bend | 弯曲弹簧具体是什么,可以看Constant康大佬的vellum原理教程01
Vellum Solver | 布料解算 解算设置
| 分组 | 参数名称 | 用途 | 推荐值 |
|---|---|---|---|
| reset simulation,重新解算 | 在使用time shift等节点时,刷新解算结果 | ||
| solver,解算 | |||
| substeps,子步 | 表示模拟精度,当出现穿模问题时可以提高这个值 | 4 | |
| forces,力量 | |||
| built-in wind drag,内置风阻(需要勾选built-in wind) | 空气阻力,当模拟时下落过快可以调高这个值 | 0.6 | |
| visualize,可视化 | |||
| thickness,厚度 | 可视化点的pscale值 |
注意!关于 pscale (2/2):
模拟时会限制 pscale 的最大大小:模拟过程的最小单位是点,碰撞体积也会按点为单位创建(见下图);为了避免碰撞体积穿插,会自动限制碰撞体积的最大大小(见下GIF,两端大小没有被缩放是因为被定住,排除出模拟范围了)


四、输出优化
使用 Subdivide Facet Sweep 节点,优化输出几何体的顶点数量

clean | 清理 删除多余属性
Clean的 Remove Attribs | 删除属性 参数,指定了删除哪些属性,这里填写:
* ^pscale
*:所有内容^pscale:除了pscale属性
facet | 平面 删除指定顶点
facet 可以根据自定义规则,对点、线、面等元素进行删除,这里的作用是:删除“模拟结束后,接近直线的部分的中间顶点”(当两个点接近成为一条直线时,删除中间的点,可以调整删除阈值,同时尽可能减少对外形的影响)。
勾选属性:Remove Inline Points | 删除共线点

Distance | 距离:决定了删除阈值,越小删除的点越少(对“共线”的要求越严格)
碎碎念
文章结构
这次笔记的目标是跟着走可以完成开头目标中的GIF效果,但结果看来很难,文字终究是比视频少了不少直观。
接下来会尝试只记录关键知识点,让文本更清晰的同时节约记录和排版时间,具体制作还是看视频吧。
改进方法
使用string模拟粗管道,一个参数影响了太多东西,不是很好:
大管子可以试试用 vellum tet softbody 模拟

浙公网安备 33010602011771号