当一辆汽车奔跑在一条满是灰尘的溪谷时,它会碰到各种各样的凹凸地,水沟,岩石和沙地,每次碰撞的结果就是:汽车不仅改变一点点方向,而且汽车踢起的尘土和碎片数量都会不同,利用noise和rand功能,你可以很容易地模拟这种随意的变化。
不是随便用一个数字发生器就可以得到声音功能的值,将声音功能视为一个预定的曲线,可以无限延伸,这个曲线在它的值里有各种各样的声音,但声音平滑插入,声音功能回到什么样的值依赖于你在曲线哪里取样。如果你给声音功能取10的值:

如果你给声音功能取10.01的值:
print(noise(10.01));
…cg/image/回到-0.474992的值
参数表达式里:
flEmitter.rate=$rate $rateRand*$rate*noise(frame)
…我们用“帧”作为声音输入,所以,每个帧的声音功能回到一个新的值。
既然帧以每帧的整数增加,来自声音功能的结果可能变化很大。如果你想从声音功能那里获得一个更加平滑的数字流,那就用“time”来代替“frame”。
一样的输入值,声音功能返回的值也一样,所以,每个发射器需要用不同的输入值。
在表达式编辑器里,增加:
frEmitter.rate=$rate $rateRand*$rate*noise(frame 100)
blEmitter.rate=$rate $rateRand*$rate*noise(frame 200)
brEmitter.rate=$rate $rateRand*$rate*noise(frame 300)
现在每个rates参数都是从声音曲线不同部分取样,回放时候,你会看见粒子的轨迹有点更加随意稀少了。
参数rates任何明显的提高都表示模拟轮胎碰到了凹凸块或者是岩石。发生碰撞的时候,粒子方向突然随意改变,就好像刚刚发生了一场小的爆炸。
因为声音功能对同样的输入总是返回到同样的值,所以,我们检查rates参数的一个突然变化并添加一些随意性到发射速度上。
在表达式编辑器里,添加:
float$flChange=noise(frame)-noise(frame-1);
float$flChange=noise(frame)-noise(frame-1);
float$frChange=noise(frame 100)-noise(frame 100-1);
float$blChange=noise(frame 200)-noise(frame 200-1);
float$flChange=noise(frame 300)-noise(frame 300-1);
float$randomSpeed=100;
flEmitter.randomDirection=$randomSpeed*linstep(0.1,0.5,$flChange);
frEmitter.randomDirection=$randomSpeed*linstep(0.1,0.5,$frChange);
blEmitter.randomDirection=$randomSpeed*linstep(0.1,0.5,$blChange);
brEmitter.randomDirection=$randomSpeed*linstep(0.1,0.5,$brChange)
回放时,你会看在尘土轨迹甚至有更大的随意性,一些粒子飘浮空中,其他一些粒子保持静止状态。