Table of Contents

粒子更新器

中级 美术 程序员

粒子生成后,在消失之前可以随时间发生变化。更新器(Updater) 随时间作用于所有存活的粒子,改变位置、速度、颜色等属性。例如,重力以恒定速率更新粒子的速度,使其加速飞向地面。

Stride 具有多种内置更新器。自定义粒子示例演示了如何向引擎添加更新器。

通用属性

多个属性在许多更新器中是通用的。

media/particles-reference-updaters-11.png

属性 描述
Debug draw 绘制调试线框形状以显示更新器的边界。此功能仅适用于编辑器,运行游戏时会被忽略。
Position inheritance 继承粒子系统组件的位置,如 Transform 字段中所定义
Position offset 模块的额外平移。如果它继承了父级的位置,这会应用在继承的位置之上。
Rotation inheritance 继承粒子系统组件的旋转,如 Transform 字段中所定义
Rotation offset 模块的额外旋转。如果它继承了父级的旋转,这会应用在继承的旋转之上。
Scale inheritance 继承粒子系统组件的均匀缩放,如 Transform 字段中所定义。
Scale offset 模块的额外缩放。如果它继承了父级的缩放,这会应用在继承的缩放之上。

碰撞体(Collider)

media/particles-reference-updaters-5.gif

碰撞体(Collider) 是一个更新器,当粒子与预定义形状碰撞时改变粒子的位置和速度。

media/particles-reference-updaters-3.png

属性 描述
Shape 粒子与之碰撞的形状(球体、圆柱体、盒体或圆环体)
Is hollow 禁用时,形状是实心的,粒子会从它上面弹开。启用时,形状像容器一样是中空的,粒子会留在体积内部。
Kill particles 启用时,粒子在与形状碰撞时立即被销毁。
Restitution 恢复系数是粒子相对于碰撞前速度所保留的速度。在此更新器中,我们将恢复系数用作仅垂直方向的速度。它不影响沿表面的速度。
Friction 粒子与形状碰撞时损失的水平速度。它只影响沿表面的速度,不会改变粒子弹起的高度。

力场(Force field)

media/particles-reference-updaters-6.gif

力场(Force field) 由一个包围形状和若干力向量定义,这些力向量基于粒子相对于包围形状的位置对粒子起作用。

media/particles-reference-updaters-1.png

属性 描述
Shape 包围形状(球体、圆柱体、盒体或圆环体)
Falloff 衰减是一个简单的线性函数,它决定施加在粒子上的力的强度。它基于粒子到中心的距离。Strength inside(内部强度)是当粒子位于中心 falloff start 距离以内时适用的强度比例。Strength outside(外部强度)是当粒子距离中心超过 falloff end 时适用的强度比例。两个值都相对于包围形状的大小;中间的值在两个强度之间插值。中心处的值仍然可以为 0,使力仅在包围形状外部起作用。
Energy conservation 粒子保留的力能量的部分。保留的能量存储为粒子速度,导致速度逐渐增加。未保留的能量直接作用于粒子的位置,并在力消失时损失。
Directed force 使粒子沿力场中心轴(通常为向上)移动的向量力
Vortex force 使用右手定则旋转,使粒子绕力场中心轴移动的力
Repulsive force 使粒子远离力场中心或(如果为负值)向中心移动的力
Fixed force 使粒子沿固定的、不旋转不缩放的轴移动的力

衰减

衰减(falloff) 是力的强度基于粒子到形状中心距离的变化。衰减是相对距离的函数,其中距离 0 为中心,1 为形状的边界,大于 1 表示粒子在形状外部。

比衰减起点更近的粒子始终受 Strength Inside 系数影响。比衰减终点更远的粒子始终受 Strength Outside 系数影响。

介于两者之间的粒子的系数呈线性变化:

media/particles-reference-updaters-2.png

例如,如果包围形状是半径为 10m 的球体,距其中心 1m 以内(0.1 x 10m)的粒子将受到全力移动。超过 1m 距离后,强度线性下降,直到在 9m 距离处(0.9 x 10m)变为零。此后,力不再影响粒子。

包围形状

球体

media/particles-reference-updaters-7.png

图片许可:CC-BY-SA 4.0,球体图片来自 "Sphere wireframe" 作品,作者 Geek3,采用 CC-BY-SA 3.0

当包围形状为球体时,衰减距离基于粒子到球心的径向距离。如果球体被缩放为椭球体,该距离也会相应缩放。该距离相对于半径,1.0 为球体表面。

定向力向量与球体的局部 Y 轴平行。排斥力向量从中心指向粒子。涡旋力向量在粒子位置处绕球体的 Y 轴旋转(使用右手定则)。

盒体

media/particles-reference-updaters-8.png

当包围形状为盒体时,衰减距离是 X、Y 和 Z 轴上三个距离中最长的一个。该距离相对于盒体的尺寸,1.0 为盒体表面。

定向力向量与盒体的局部 Y 轴平行。排斥力向量从中心指向粒子。涡旋力向量在粒子位置处绕盒体的 Y 轴旋转(使用右手定则)。

圆柱体

media/particles-reference-updaters-9.png

当包围形状为圆柱体时,衰减距离基于粒子到圆柱体局部 Y 轴的径向距离。粒子的高度(在 Y 轴上的位置)会被忽略,除非粒子在圆柱体外部,此时距离始终为 1。

定向力向量与圆柱体的局部 Y 轴平行。排斥力向量从圆柱体的局部 Y 轴指向粒子,因此排斥力始终是水平的。涡旋力向量在粒子位置处绕圆柱体的 Y 轴旋转(使用右手定则)。

圆环体

media/particles-reference-updaters-10.png

图片许可:GFDL,CC-BY-SA 4.0,圆环体图片来自 "A simple Torus" 作品,作者 Yassine Mrabet,采用 GFDL,CC-BY-SA 3.0

当包围形状为圆环体时,力场的性质会完全改变。衰减距离基于粒子到圆环体内圈(旋转轴,图中以红色显示)的径向距离,选择圆上离粒子最近的点。

定向力向量与离粒子最近点处的旋转轴相切。排斥力向量从轴指向粒子。涡旋力向量利用粒子相对于轴的位置绕定向力向量旋转(使用右手定则)。

虽然数学运算有点复杂,但使用圆环体力场并不复杂。试试看吧!

重力(Gravity)

重力更新器是一个简化的力,它以恒定的力向量(不缩放也不旋转)影响所有粒子,无论它们的位置如何。它是可编辑的,因此你可以在不同缩放和行为的项目中使用它。

media/particles-reference-updaters-4.png

重力忽略大多数属性(如偏移和继承),只使用以下属性:

属性 描述
Gravitational acceleration 定义所有受影响粒子加速度的重力向量。默认值与地球的平均重力相符。

由速度确定方向(Direction from speed)

由速度确定方向是一个后置更新器(post-updater),这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。

它没有属性,只是将粒子的方向更新为与其速度匹配。它使用粒子上一帧与当前位置之间的差值,并不直接依赖于速度。这意味着即使粒子自身的速度为 0,仅被外力移动,由速度确定方向也能正确解析。

方向不是归一化向量,它会改变其大小以匹配增量距离。它会覆盖任何先前的方向参数,例如来自初始化器的方向。

颜色动画(Color animation)

颜色动画是一个后置更新器,这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。

颜色动画通过在粒子的归一化存活时间(0 到 1)上采样一条曲线来更新粒子的 Color 字段。你可以设置第二条曲线,在这种情况下粒子的颜色会有细微变化。颜色动画会覆盖任何先前的颜色参数,例如初始颜色。

曲线值以 Vector4 给出,对应 RGBA,标准值介于 0 和 1 之间。大于 1 的值仅对 RGB 有效(不适用于 Alpha),可用于 HDR 渲染。

旋转动画(Rotation animation)

旋转动画是一个后置更新器,这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。它是严格的单轴旋转,用于面向公告板的粒子。

旋转动画通过在粒子的归一化存活时间(0 到 1)上采样一条曲线来更新粒子的 Rotation 字段。你可以设置第二条曲线,在这种情况下粒子的旋转会有细微变化。

旋转动画会覆盖任何先前的旋转参数,例如初始旋转。如果你需要叠加类型的动画,请检查 Shape Builder 是否支持它(在 Shape Builder 的属性中找到)。叠加动画不会保留在粒子字段中,也不会持久存在,但可以在粒子已有的任何字段之上应用。

大小动画(Size animation)

大小动画是一个后置更新器,这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。

这是严格的均匀大小。大小动画通过在粒子的归一化存活时间(0 到 1)上采样一条曲线来更新粒子的 Size 字段。你可以设置第二条曲线,在这种情况下粒子的大小会有细微变化。

大小动画会覆盖任何先前的大小参数,例如初始大小。如果你需要叠加类型的动画,请检查 Shape Builder 是否支持它(在 Shape Builder 属性中)。叠加动画不会保留在粒子字段中,也不会持久存在,但可以在粒子已有的任何字段之上应用。