返回行业情报

Houdini空间殖民算法制作循环烟雾爆发

Merging Space Colonization Solver with Pyro Simulation to Create Looping Smoke Bursts

3D与动态设计师Karlis Stigis分享如何用Houdini的空间殖民算法生成分支网络,结合Pyro烟雾模拟制作出循环爆发的烟雾球效果。文章详细讲解了从点云生成分支路径、通过VEX循环实现搜索-连接-推进逻辑、提取速度方向、到体积场转换的完整流程,并利用外层循环生成十个网络变体实现动态切换。

深度解读

这篇文章的核心判断是:Houdini的Space Colonization Solver(空间殖民求解器)本质上不是一个"树木生成器",而是一套可复用的生长逻辑框架——Karlis Stigis用它驱动Pyro烟雾模拟,把静态的分支结构转化为循环爆发的动态视觉,证明了这套算法的真正价值在于它输出的方向场和距离场,而非几何体本身。

这个效果到底是什么

Karlis Stigis是驻纽伦堡的3D与动态设计师,背景是纯艺术、视觉传达和平面设计。他的Instagram账号被黑客入侵并最终封禁,这成为他重新发布第一条内容的动机——他想做一个在视觉上与"重生"押韵的东西。最终结果是一个类似循环系统的分支结构,里面流动的不是血液,而是某种无形且短暂的东西:创造力的力量。

技术上的关键突破在于:他没有把Space Colonization当作终点,而是当作起点。分支网络生成后,他从中提取速度属性(velocity)和距离属性(dist),再把这两样东西喂给Pyro模拟,让烟雾沿着分支方向爆发、扩散、循环。

Space Colonization算法本身

这套方法直接受Entagma的VEX教程和2007年论文《Modeling Trees with a Space Colonization Algorithm》启发,作者是Adam Runions、Brendan Lane和Przemyslaw Prusinkiewicz。但Stigis做了一个关键改动:他连接的是已存在的点,而不是从平均吸引方向生成新的生长位置。

具体流程分三步循环:

Search:活跃点在固定半径内寻找未使用的邻居点。

Connect:每个邻居选择最近的提议父节点,两者之间建立一条线。

Advance:新连接的点变为活跃,上一代停止搜索。

每个子节点只有一个父节点,但一个父节点可以有多个子节点。用group追踪未使用、活跃和已选中的点,用候选父节点列表解决竞争连接。当没有可达的未使用点时,生长停止。

绿色是起点,橙色是活跃点及其搜索半径,红色是已连接的点,白色是未使用的点。

控制分支形态的两个参数

改变搜索距离和候选限制会产生完全不同的结构。更大的半径允许更长的连接;候选限制控制每个活跃点能提议多少个邻居。同样的点布局,四组不同的分支规则就能长出四种形态。

这意味着:如果你在做产品可视化或广告动画,不需要重新生成点云,只需要调这两个参数,就能在同一套基础几何上迭代出多种分支风格。对从业者来说,这是效率上的直接收益。

实现细节:四个Wrangle的循环

整个循环用四个Wrangle节点实现:INIT、find_neighbours、connect_logic、set_groups。INIT只运行一次,其余三个重复执行。

INIT把起始点标记为活跃,其余点标记为自由。每个点一开始有自己的`__id`;连接后的子节点会继承父节点的ID。

find_neighbours记录候选父节点,并把被提议的邻居标记为selected。这个版本请求的是`Pts Max + 1`个候选,所以显示值为3时实际允许最多4个。

connect_logic选择最近的候选父节点,继承其`__id`,并创建连接段。

set_groups遍历`__infected`和`__selected`,让当前活跃点退役,清空它们的父节点列表,把selected点变为下一轮的活跃点。

应用到圆柱体内的点云上,这会从每个起始点产生一簇扩散的集群。按`__id`着色就能区分不同集群,也能单独隔离出某一个。

从分支到路径:Edge Transport与方向计算

结构完成后,Edge Transport几何节点测量从起始组沿分支的距离,存储为`dist`,并启用全局归一化。这样就能区分靠近根部的点和远离根部的点。

此时每两个连接点之间的段还是独立的primitive。PolyPath把它们合并成连续路径,然后重采样、融合重合点、用Group Transfer恢复起始组、平滑网络使其更有机。

处理链的最后一步是`direction_calc`,它写入速度属性。比较相邻的`dist`值可以确定向外方向:把指向`dist`更大邻居的向量归一化,写入该邻居的`v`属性。Edge Transport提供`dist`,Wrangle把顺序转化为向外的方向向量。

外层循环:十个网络变体

为了便于管理,Stigis把整个逻辑打包成HDA。分支逻辑不变,资产只是让下一步更容易操作。

他把Space Colonization放进另一个循环里,每次迭代选择不同的随机起始组。内层循环生长一个网络,外层循环生成十个变体,每个单独打包以便后续选择。

动画过程中,他一次选择一个网络。在变体之间切换会改变提供给烟雾的方向,让运动更有动态感、更少重复。Blast节点里的表达式以递增速率切换网络。关键帧会提供更精确的时间控制,但表达式对这个作品来说已经够用。

发射点与体积场

解包选中的网络后,他从起始组中随机选择分支簇中心附近的点。这些是主要发射器:烟雾可以从这些点沿分支向各个方向扩散。网络中另外一些点制造更小的爆发,它们的随机种子每两帧变化一次。

他在这些点上复制小球体,然后用Points from Volume填充,给每个发射器一些体积。

Pyro Source给发射点添加密度和温度,把Particle Separation链接到Points from Volume中的同一参数。经过实验,他最终把Density Scale定为10。

Volume Rasterize Attributes把密度和温度从点属性转换为体积场。对于速度,他直接把另一个Volume Rasterize Attributes节点连接到解包后的路径,把Attributes设为`v`。这样就把方向向量沿整个网络栅格化了。最后合并密度、温度和`v`,连接到Pyro的第一个输入。

所以这对行业意味着什么

这套工作流揭示了一个更广泛的趋势:程序化生成工具正在从"生成最终资产"转向"生成驱动其他模拟的数据场"。Space Colonization在这里不产出树,它产出的是方向场和距离场,这些场反过来控制烟雾、火焰、粒子等动态元素的行为。

对VFX和动态设计从业者来说,这意味着你需要重新理解Houdini节点的角色分工。几何节点不再只是建模工具,它们是数据生成器;Pyro不再只是火焰模拟器,它是场驱动系统。把两者接起来的关键,是理解`v`和`dist`这类属性如何在不同的求解器之间传递语义。

对广告和品牌视觉来说,这种技术的吸引力在于:它能在同一个基础结构上快速迭代出多个变体,每个变体都有不同的运动质感,而切换成本几乎为零。这在需要快速出多个方案、或者需要长时间循环播放而不显重复的场景里,是直接的生产力优势。

Stigis的案例还说明了一件事:个人创作者的技术深度,往往来自对某个具体问题的执念——他的执念是"重生"这个视觉概念,技术只是实现它的手段。这种从概念出发、反向推导技术路径的工作方式,比从工具出发找应用场景,更容易做出有辨识度的作品。

其
视觉探索Houdini空间殖民算法Pyro烟雾模拟VEX程序化生成