2D 粒子系统

简介

粒子系统用于模拟复杂的物理效果,例如火花、火焰、魔法粒子、烟雾、薄雾等。

这个想法是以固定的间隔发射具有固定的寿命的 “粒子”. 在其生命周期中, 每个粒子都具有相同的基本行为. 让每个粒子变得不同并提供整体更加 “有机” 外观的是与各个参数相关的 “随机性”. 实质上, 创建粒子系统意味着设置基本物理参数, 然后为它们添加随机性.

粒子节点

Godot 为 2D 粒子提供了两个不同的节点: GPUParticles2DCPUParticles2D 。 GPUParticles2D 更先进,使用 GPU 来处理粒子效果。 CPUParticles2D 是 CPU 驱动的选项,其功能与 GPUParticles2D 几乎相同,但在使用大量粒子时性能较低。 另一方面,CPUParticles2D 在低端系统或 GPU 瓶颈情况下可能表现更好。

虽然 GPUParticles2D 是通过 ParticleProcessMaterial(还可以使用自定义着色器)进行配置的,不过匹配的选项是通过 CPUParticles2D 中的节点属性提供的(除了轨迹设置)。

你可以通过在检查其中点击节点,选择 2D 视口,然后在视口顶部的工具栏中选择 GPUParticles2D > 转换为CPUParticles2D ,将 GPUParticles2D 节点转换为 CPUParticles2D 节点。

../../_images/particles_convert.webp

本教程的其余部分将使用 GPUParticles2D 节点。 首先,将 GPUParticles2D 节点添加到场景中。 创建该节点后,你会注意到仅创建了一个白点,并且场景停靠栏中的 GPUParticles2D 节点旁边有一个警告图标。 这是因为节点需要 ParticleProcessMaterial 才能发挥作用。

ParticleProcessMaterial

要将处理材质添加到粒子节点,请转到检查器面板中的 处理材质 。单击 材质 旁边的框,然后从下拉菜单中选择 新建 ParticleProcessMaterial

../../_images/particles_material.png

你的 GPUParticles2D 节点现在应该可以向下发射白点了。

../../_images/particles1.png

Texture (纹理)

粒子系统可以使用单个纹理或动画 翻页 (filpbook)。翻页是一种纹理,其中包含可以回放或在发射期间随机选择的多个动画帧。翻页相当于粒子的精灵表。

纹理通过 Texture 属性设置:

../../_images/particles2.png

使用动画翻页

粒子翻页适合再现复杂的效果,如烟雾、火焰、爆炸。它们还可以通过使每个粒子使用不同的纹理,来引入随机纹理变化。你可以在线寻找现成的粒子翻页图,或使用外部工具预渲染它们,例如`Blender <https://www.blender.org/>`__ 或 EmberGen

使用翻页纹理的粒子系统示例

使用翻页纹理的粒子系统示例

相比起单个纹理,使用动画翻页需要额外的配置。出于演示目的,我们将使用这 5 列 7 行的纹理(右键单击并选择 另存为… ):

屏幕翻页纹理示例

作者:JoesAlotofthings (CC BY 4.0)

要使用动画翻页,你必须在 GPUParticles2D(或 CPUParticles2D)节点的 Material 部分中创建一个新的 CanvasItemMaterial:

在粒子节点检查器的底部创建一个 CanvasItemMaterial

在粒子节点检查器的底部创建一个 CanvasItemMaterial

在这个 CanvasItemMaterial 中,启用 Particle Animation ,并将 H FramesV Frames 分别设置为翻页纹理中的列数和行数:

为示例翻页纹理配置 CanvasItemMaterial

为示例翻页纹理配置 CanvasItemMaterial

完成此操作后,ParticleProcessMaterial(对于 GPUParticles2D)或 CPUParticles2D 检查器中的 动画部分 将生效。

小技巧

如果你的翻页纹理是黑色背景而不是透明背景,你还需要将混合模式设置为 Add 而不是 Mix 才能使它正确地显示。或者,你也可以修改纹理以使它在图像编辑器中有透明背景。在 GIMP 中,可以使用 Color > Color to Alpha 菜单来完成此操作。

时间参数

Lifetime(寿命)

每个粒子存活的时间(以秒为单位). 生命周期结束时, 会创建一个新粒子来替换它.

寿命:0.5

../../_images/paranim14.gif

寿命:4.0

../../_images/paranim15.gif

One Shot (一次性)

启用后,GPUParticles2D 节点将一次发射其所有粒子,之后将不再发射。

Preprocess(预处理)

粒子系统从没有粒子被发射开始, 然后开始发射. 当加载场景如火炬, 雾等系统时可能会带来不便, 因为它会在进入场景的那一刻开始发射. 预处理用于让系统在第一次实际绘制之前处理给定的秒数.

Speed Scale(速度比例)

速度比例具有默认值 1 , 用于调整粒子系统的速度. 降低值会使粒子变慢, 而增加值会使粒子更快.

Explosiveness(爆炸性)

如果有10个寿命为 1 的粒子, 则意味着粒子将每0.1秒发射一次. 爆炸性参数改变了这一点, 并迫使粒子一起发射. 范围是:

  • 0: 定期发射粒子(默认值).

  • 1: 同时发射所有粒子.

中间的值也是允许的. 此功能对于创建爆炸或突然爆发的粒子非常有用:

../../_images/paranim18.gif

Randomness(随机性)

所有物理参数都可以随机化. 随机值范围从 01 . 随机化参数的公式为:

  1. initial_value = param_value + param_value * randomness

Fixed FPS(固定帧率)

此设置可用于将粒子系统设置为以固定的帧率渲染. 例如, 将值更改为 2 将使粒子以每秒2帧的速度渲染. 请注意, 这不会减慢粒子系统本身的速度.

Fract Delta

这可用于打开或关闭Fract Delta.

绘图参数

Visibility Rect(可见性区域)

可见性矩形控制粒子在屏幕上的可见性. 如果此矩形位于视口之外, 则引擎将不会在屏幕上渲染粒子.

矩形的 WH 属性分别控制其宽度和高度. XY 属性控制矩形左上角相对于粒子发射器的位置.

可以使用 2d 视图上方的工具栏让 Godot 自动生成可见性矩形。 为此,请选择 GPUParticles2D 节点并单击 粒子 > 生成可见性矩形 。 Godot 将模拟 Particles2D 节点发射粒子几秒钟,并设置矩形以适合粒子所占据的表面。

你可以使用 Generation Time (sec) 选项控制发射持续时间. 最大值为25秒. 如果你需要更多时间让粒子移动, 你可以暂时更改Particles2D节点上的 preprocess 时间.

Local Coords(局部坐标)

默认情况下, 此选项处于启用状态, 这意味着粒子发射的空间是相对于节点来算的. 如果移动节点, 则所有粒子会随之移动:

../../_images/paranim20.gif

如果禁用, 粒子将发射到全局空间, 这意味着如果移动节点, 则已发射的粒子不会受到影响:

../../_images/paranim21.gif

Draw Order(绘图顺序)

这可以控制绘制单个粒子的顺序. Index 表示粒子根据它们的发射顺序被绘制(默认). Lifetime 表示它们按照剩余寿命的顺序被绘制.

ParticleProcessMaterial 设置

方向

这是粒子发射的基础方向. 默认值是 Vector3(1,0,0) , 它使粒子向右发射. 然而, 在默认的重力设置下, 粒子会直线下降.

../../_images/direction1.png

为了让这个属性作用更明显, 你需要一个大于0的 初始速度(initial velocity) . 这里, 我们把初始速度设为40. 你会注意到粒子向右发射, 然后受重力作用下降.

../../_images/direction2.png

Spread(铺开角度)

此参数是以度为单位的角度, 它会被随机加减到基础 Direction 上. 180 的铺开角度将向所有方向发射(+/- 180).

../../_images/paranim3.gif

Flatness(平直度)

这个属性只对3D粒子有用.

Gravity(重力)

应用于每个粒子上的重力.

../../_images/paranim7.gif

Initial Velocity(初始速度)

初始速度是粒子发射的速度(单位为像素/秒)。以后可以通过重力或其他加速度来修改速度(后述)。

../../_images/paranim4.gif

Angular Velocity(角速度)

角速度是应用于粒子的初始角速度.

Spin Velocity(旋转速度)

旋转速度是粒子围绕其中心转动的速度(以度/秒为单位).

../../_images/paranim5.gif

Orbit Velocity(环绕速度)

环绕速度速度用于使粒子绕它们的中心转动.

../../_images/paranim6.gif

Linear Acceleration(线性加速度)

应用于每个粒子的线性加速度.

Radial Acceleration(径向加速度)

如果此加速度为正, 则粒子会向远离发射中心加速. 如果是负的, 他们会被加速吸进去.

../../_images/paranim8.gif

Tangential Acceleration(切向加速度)

该加速度会使用从粒子到中心点的切向量, 结合径向加速度可以做出很酷炫的效果.

../../_images/paranim9.gif

Damping(阻尼)

阻尼选项会对颗粒施加摩擦力, 迫使它们停止. 它特别适用于火花或爆炸, 火花或爆炸通常以高线速度开始, 然后在他们隐去时停下来.

../../_images/paranim10.gif

Angle(角度)

确定粒子的初始角度(以度为单位). 该参数通常在随机化后会有用.

../../_images/paranim11.gif

Scale(大小)

确定粒子的初始大小.

../../_images/paranim12.gif

Color

用于改变发射出来的粒子颜色.

Hue Variation(色相变化)

Variation 值设置的是应用于每个粒子的初始色调变化. Variation Rand 值控制色调变化的随机性比率.

动画

备注

仅当 GPUParticles2D 或 CPUParticles2D 节点上使用的 CanvasItemMaterial 已进行 相应配置 时,粒子翻页动画才有效。

如要将粒子翻页设置为线性播放,请将 Speed MinSpeed Max 值设置为 1:

设置粒子动画以便在粒子生命周期内播放

设置粒子动画以便在粒子生命周期内播放

默认情况下,循环功能是禁用的。如果粒子在其生命周期结束之前播放完毕,则粒子将继续使用翻页的最后一帧(根据翻页纹理的设计方式,这一帧可能是完全透明的)。如果启用循环,粒子的动画将循环回到第一帧并重复播放。

根据精灵表包含的图像数量以及粒子的存活时间情况,你的动画可能看起来会并不流畅。粒子的存活时间、动画速度和精灵表中图像数量之间的关系是这样的:

备注

当动画速度为 1.0 时,动画将在粒子生命周期结束时,播放到序列中的最后一个图像。

\[Animation\ FPS = \frac{Number\ of\ images}{Lifetime}\]

如果你希望将粒子翻页用作每个粒子的随机粒子纹理源,请将速度值保持为 0 ,并将 Offset Max 设置为 1:

设置粒子动画以实现发射时的随机偏移

设置粒子动画以实现发射时的随机偏移

请注意,GPUParticles2D 节点的 Fixed FPS 也会影响动画播放。为了动画播放流畅,建议将其设置为 0,以便在每个渲染帧上模拟粒子。如果这个设置不适合你的用例,请将 Fixed FPS 设置为等于翻页动画使用的有效帧速率(请参阅上面的公式)。

发射形状

ParticleProcessMaterials 允许你设置发射蒙版,它决定发射粒子的区域和方向。 这些可以从项目中的纹理生成。

在设置了 ParticleProcessMaterial,并且选择了 GPUParticles2D 节点。 工具栏中就会出现“粒子”菜单:

../../_images/emission_shapes1.png

打开它, 选择”加载 Emission Mask(发射遮挡)”:

../../_images/emission_shapes2.png

然后选择你想要用作遮挡的纹理:

../../_images/emission_shapes3.png

会出现一个具有多个设置的对话框.

发射遮罩

纹理可以生成三种类型的发射遮挡:

  • Solid Pixels(实心像素): 粒子将从纹理的任何区域产生, 透明区域除外.

../../_images/emission_mask_solid.gif

  • Border Pixels(边界像素): 粒子将从纹理的外边缘产生.

../../_images/emission_mask_border.gif

  • Directed Border Pixels(定向边界像素): 类似于边界像素, 在遮罩中添加额外的信息, 使粒子能够从边缘发射出去. 请注意, 想要使用它, 需要设置一个 初始速度.

../../_images/emission_mask_directed_border.gif

发射色彩

Capture from Pixel 会使粒子在其产生点处继承遮挡材质的颜色.

在单击“确定”后,将生成遮罩并将其设置为 Emission Shape 下的 ParticleProcessMaterial:

../../_images/emission_shapes4.png

这个部分所有提到的值, “加载Emission Mask(发射遮挡)”菜单都会自动生成, 所以通常他们放着不管就可以了.

备注

不应该直接添加图像到 Point TextureColor Texture 中. 应该始终使用”加载Emisson Mask(发射遮挡)”菜单.