Qt Quick 粒子系统(十一):行为影响器——游走、湍流与年龄
目录
- 一、粒子的行为模式
- 二、开发环境与版本说明
- 三、原理分析:三种行为影响器
- 3.1 三种影响器对比
- 3.2 Wander:随机游走
- 3.3 Turbulence:湍流
- 3.4 Age:年龄控制
- 四、代码实现
- 4.1 Affector_Wander.qml:随机游走
- 4.2 Affector_Turbulence.qml:湍流
- 4.3 Affector_Age.qml:年龄控制
- 五、运行效果
- 六、适用边界与限制条件
- 七、总结
一、粒子的行为模式
上一篇讲了三种物理影响器——重力、摩擦、吸引,它们模拟经典力学的力场效果。但粒子的行为不仅限于物理力:雪花需要左右飘动(随机游走),火焰需要剧烈扰动(湍流),某些粒子需要提前消亡(年龄控制)。
本文讲解三种行为影响器:Wander(随机游走)、Turbulence(湍流)、Age(年龄控制)。它们控制的是粒子"怎么动、什么时候死"。
二、开发环境与版本说明
本文所有代码基于以下环境验证(验证日期:2026-06-17):
- Qt 版本:6.8.2
- 编译器:MinGW 64-bit
- 操作系统:Windows 11
- 构建工具:CMake 3.29
三、原理分析:三种行为影响器
3.1 三种影响器对比
| 影响器 | 作用 | 核心属性 | 典型场景 |
|---|---|---|---|
| Wander | 随机游走 | xVariance、yVariance、pace | 布朗运动、雪花飘动 |
| Turbulence | 湍流扰动 | strength(扰动强度)、noiseSource(噪声图) | 火焰、烟雾、水流 |
| Age | 年龄控制 | lifeLeft(剩余生命)、advancePosition | 加速消亡、冻结效果 |
3.2 Wander:随机游走
Wander 对粒子施加随机的位置偏移,模拟布朗运动。三个核心属性:
xVariance:x 方向的最大随机偏移量yVariance:y 方向的最大随机偏移量pace:每秒最大属性变化量(控制游走速度)
Wander 的数学模型是:每帧在[-xVariance, +xVariance]和[-yVariance, +yVariance]范围内随机选择目标位置,然后以pace像素/秒的速度向目标移动。xVariance/yVariance控制游走范围,pace控制游走频率。
3.3 Turbulence:湍流
Turbulence 使用噪声图(如 Perlin 噪声)生成流体力,对粒子施加复杂的扰动。两个核心属性:
strength:扰动强度,力的大小与 strength 成正比noiseSource:噪声图 URL,不提供时使用默认噪声图
Turbulence 需要固定尺寸——0×0 的 Turbulence 不会影响任何粒子。噪声图会被缩放到 Turbulence 的尺寸,使用 curl(旋度)生成力向量。
3.4 Age:年龄控制
Age 修改粒子的"年龄",让粒子跳到生命周期的指定位置。两个核心属性:
lifeLeft:设置粒子的剩余生命(毫秒)。粒子会跳到"生命还剩 lifeLeft 毫秒"的状态advancePosition:是否同时推进位置/速度/加速度
advancePosition的区别:
true(默认):位置、速度、加速度都会推进到对应时间点的状态——粒子会"瞬移"到新位置false:只推进外观属性(如透明度、大小),位置不变——粒子在原地"老化"
Age 也被称为"Kill 影响器"——默认参数(lifeLeft: 0)会立即杀死所有受影响的粒子。
四、代码实现
4.1 Affector_Wander.qml:随机游走
Emitter { anchors.centerIn: parent width: 1; height: 1 emitRate: 60 lifeSpan: 10000 size: 10 velocity: PointDirection { x: 0; y: 0 xVariation: 50 yVariation: 50 } } Wander { system: particleSystem xVariance: 200 yVariance: 200 pace: 200 }xVariance: 200, yVariance: 200:粒子在 ±200 像素范围内随机游走。设为 0 时该方向不受影响。
pace: 200:每秒最大变化 200 像素。pace 越大,粒子"抖动"越快;pace 越小,粒子缓慢漂移。
Emitter 的初始速度几乎为 0(x: 0, y: 0),粒子主要靠 Wander 运动。lifeSpan: 10000(10 秒)让粒子有足够时间展示游走行为。
4.2 Affector_Turbulence.qml:湍流
Emitter { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter width: 1; height: 1 emitRate: 100 lifeSpan: 10000 size: 16 velocity: AngleDirection { angle: 0 angleVariation: 15 magnitude: 250 magnitudeVariation: 100 } } Turbulence { system: particleSystem anchors.centerIn: parent width: 256 height: 256 strength: 300 noiseSource: "qrc:/images/perlin_noise.png" }strength: 300:扰动强度。strength 越大,粒子轨迹越混乱。示例中支持切换 100-2000 的不同强度。
noiseSource:指向一张 Perlin 噪声图。噪声图的质量直接影响湍流效果——平滑的黑白噪声图效果最好。不提供时使用默认噪声图。
作用区域:Turbulence 只在 256×256 的矩形区域内生效。粒子进入区域后受湍流扰动,离开区域后恢复原有运动。代码中用半透明蓝色边框可视化了区域范围。
4.3 Affector_Age.qml:年龄控制
Emitter { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter width: 1; height: 1 emitRate: 80 lifeSpan: 6000 size: 12 velocity: PointDirection { x: 120 xVariation: 30 } } Age { system: particleSystem x: parent.width / 2 - 100 width: 20 height: parent.height lifeLeft: 500 advancePosition: false }lifeLeft: 500:粒子穿过 Age 区域后,剩余生命被设为 500ms。原本还有 6 秒寿命的粒子,穿过区域后只剩 0.5 秒。
advancePosition: false:只推进外观属性(透明度、大小等),位置不变。粒子在原地快速"老化"——如果设为 true,粒子会"瞬移"到 0.5 秒后的位置。
视觉效果:粒子从左侧向右发射,穿过页面中央的红色垂直区域后,剩余生命骤减,在区域右侧快速消亡。代码中用半透明红色边框可视化了区域范围。
五、运行效果
Affector_Wander.qml:紫色星形粒子从中心缓慢扩散,在空间中大幅随机游走,形成布朗运动效果。
Affector_Turbulence.qml:蓝色星形粒子从左侧向右发射,穿过页面中央的蓝色区域时受强烈湍流扰动,轨迹变得混乱。可通过按钮切换不同强度。
Affector_Age.qml:红色星形粒子从左侧向右发射,穿过页面中央的红色区域后,生命周期被加速消耗,在区域右侧快速消亡。
六、适用边界与限制条件
- Wander 的 xVariance/yVariance 设为 0 时该方向不受影响:只设 xVariance 不设 yVariance,粒子只在水平方向游走
- Turbulence 需要固定尺寸:0×0 的 Turbulence 不会影响任何粒子,必须设 width 和 height
- Turbulence 的噪声图质量影响效果:平滑的黑白噪声图(如 Perlin 噪声)效果最好,粗糙的噪声图会产生不自然的扰动
- Age 的 lifeLeft 为 0 时立即杀死粒子:这是默认行为,也称为"Kill 影响器"
- Age 的 advancePosition 影响很大:true 时粒子会瞬移,false 时粒子在原地老化——视觉效果完全不同
七、总结
三种行为影响器对应三种粒子行为模式:Wander 是随机游走(雪花飘动),Turbulence 是湍流扰动(火焰、烟雾),Age 是年龄控制(加速消亡)。选型依据:漂浮用 Wander,扰动用 Turbulence,消亡控制用 Age。
下一篇讲解尾迹发射器——TrailEmitter 如何让运动粒子留下尾迹。
资源下载:qml_particlesystem —— 包含完整的、可运行的代码
系列目录
- 上一篇:Qt Quick 粒子系统(十):物理影响器——重力、摩擦与吸引
- 本文:Qt Quick 粒子系统(十一):行为影响器——游走、湍流与年龄
- 下一篇:Qt Quick 粒子系统(十二):尾迹发射器
