第四章:变换与复制——从单个物体到千军万马

大家好,欢迎来到第四章。这一章我们聊点实在的——怎么让一个物体变成一堆,怎么让它们各就各位,怎么让它们看起来不那么死板。

说实话,我刚学Houdini那会儿,觉得复制节点就是个“复制粘贴”的升级版。后来在项目里做一片森林,才发现这里面的门道深着呢。你想想看,如果每棵树都一模一样,那画面得多假?

好,咱们开始。

4.1 Transform节点:移动、旋转、缩放

Transform节点,说白了就是给物体换个位置、转个方向、拉长或压扁。它是Houdini里最基础的变换工具,没有之一。

我个人习惯把Transform节点当作“定位器”来用。比如我要在场景里放一排路灯,先做一个路灯模型,然后用Transform把它挪到第一个位置,再复制、再挪……嗯,当然有更聪明的办法,我们后面会讲。

核心参数:

  • Translate (平移):X、Y、Z三个轴向上移动。单位是Houdini里的世界单位。
  • Rotate (旋转):绕X、Y、Z轴旋转。注意是度数,不是弧度。
  • Scale (缩放):沿各轴缩放。1.0是原始大小,2.0是两倍大。
  • Pivot (枢轴):变换的中心点。默认在原点,你可以把它挪到物体底部或任意位置。

我记得有一次做建筑群,需要把一栋楼旋转45度放在街角。直接旋转发现楼飘起来了——因为枢轴在原点,楼不在原点。后来我把Pivot设到楼底部的中心,一切就对了。这个坑,我替你们踩过了。

小技巧:按住Ctrl键拖动Transform的滑块,可以精细调节数值。按住Shift则是粗调。这个在微调位置时特别有用。

4.2 Copy节点:单个物体的复制

Copy节点,Houdini里最朴素的复制工具。它把一个输入复制成多个副本,每个副本可以单独控制变换。

你可能会问:“这不就是手动复制粘贴吗?” 嗯,差不多,但Copy节点有个好处——它不会真的创建一堆独立物体,而是生成一个“实例化”的结果。这意味着你修改原始物体,所有副本都会跟着变。这在迭代设计时太方便了。

举个例子:

// 创建一个球体
Sphere -> Copy

// 在Copy节点里设置Number为10
// 在Transform标签里设置Translate Y为1
// 这样你就得到了10个球,每个比前一个高1个单位

我在做楼梯的时候经常这么干。先做一个台阶,然后用Copy节点复制20个,每个台阶在Y轴偏移0.3米。楼梯就出来了。如果甲方说“台阶太高了”,我只需要改一个数值,所有台阶一起变。

注意:Copy节点的“Number”参数控制复制数量。如果你设成100,它会生成100个副本。但如果你不小心设成1000……嗯,你的电脑可能会开始风扇狂转。我曾经在演示时干过这事,场面一度很尴尬。

4.3 Copy to Points节点:让点来决定位置

这才是真正的“程序化复制”。Copy to Points节点,顾名思义——把物体复制到一组点上。每个点决定了副本的位置、朝向、甚至缩放。

为什么说它强大?因为你可以用任何方式生成点。网格上的点、曲线上的点、随机散布的点……然后让物体自动“长”到那些点上。

来看一个经典案例:

// 1. 创建一个网格平面
Grid -> Scatter (生成100个随机点)

// 2. 创建一个要复制的物体
Sphere (缩小到0.2)

// 3. 连接Copy to Points
Sphere -> Copy to Points (第二个输入接Scatter的点)

// 结果:100个小球随机分布在平面上

我个人觉得,Copy to Points是Houdini程序化建模的基石之一。你想想看,如果你有一片地形,在地形上撒点,然后把树模型复制到点上——一片森林就出来了。而且每棵树的位置、朝向都可以通过点的属性来控制。

关键点属性:

属性名 作用 示例值
@P 位置 (0, 1.5, 3)
@orient 朝向(四元数) {0, 0, 0, 1}
@scale 缩放 1.0
@pscale 统一缩放 0.5

这里有个坑:@orient是四元数,不是欧拉角。如果你直接给角度,物体会乱转。我刚开始就犯过这个错,复制出来的树东倒西歪,跟喝醉了似的。

4.4 随机变换与旋转:打破千篇一律

复制出来的物体如果一模一样,那叫“克隆”,不叫“程序化”。真正的程序化,是要让每个副本都有点不一样。

怎么做?用随机。

Houdini里实现随机变换有两种常见方式:

  1. 在Copy to Points之前,给点添加随机属性
  2. 使用Attribute Randomize节点

来看一个完整的例子:

// 生成点
Grid -> Scatter (200个点)

// 给点添加随机属性
Attribute Randomize:
  - 属性名: @pscale
  - 范围: 0.5 到 1.5
  - 分布: Uniform

Attribute Randomize:
  - 属性名: @orient
  - 类型: Quaternion
  - 范围: 0 到 360 (绕Y轴)

// 复制物体
Sphere -> Copy to Points (输入点)

// 结果:200个球,大小不一,朝向随机

嗯,这里要注意一点:随机不是乱来。你要控制随机范围。比如树的缩放,0.8到1.2之间比较自然。如果从0.1到10.0,那画面就太魔幻了。

我记得有个项目要做一片花海。花的大小、朝向、甚至颜色都要随机。我用Attribute Randomize给每个点分配了@pscale和@orient,然后用一个Color节点根据位置随机颜色。最后复制出来的花海,每一朵都不一样,甲方看了直说好。

进阶技巧:你可以用噪声(Noise)代替纯随机。噪声生成的数值是连续的,相邻点的值变化平滑,看起来更自然。比如地形上的树,用噪声控制大小,远处的树小一点,近处的大一点,效果比纯随机好得多。

知识体系总览

下面这张图,是我自己整理的本章知识结构。你可以把它当作一个思维导图来看:

变换与复制 Transform节点 移动 / 旋转 / 缩放 枢轴(Pivot)控制 Copy节点 实例化复制 数量控制 Copy to Points 点属性驱动位置 @P / @orient / @scale 随机变换与旋转 Attribute Randomize 噪声控制 vs 纯随机 核心思路:用点控制位置,用属性控制变化,用随机打破重复

这张图把本章四个核心知识点串起来了。从左到右,从基础到进阶。Transform是基本功,Copy是入门,Copy to Points是核心,随机变换是升华。你掌握了这条线,程序化建模的基本功就算打牢了。

好,这一章就到这里。内容不少,但都是实打实能用的东西。下次你在Houdini里复制物体时,想想今天讲的这些——别让它们长得一模一样。


公众号:蓝海资料掘金营,微信deep3321