Qt Quick 粒子系统(十三):基础案例——雪花、爆炸与银河
·
目录
一、从组件到效果
前十二篇讲了粒子系统的各个组件——Emitter、Shape、Direction、Variation、Affector、TrailEmitter。但单独的组件不能直接产生效果,真正的粒子效果是多个组件的组合。
本文拆解三个基础案例:雪花飘落、爆炸效果、银河背景,展示如何将前面学到的组件组合成完整的粒子效果。
二、开发环境与版本说明
本文所有代码基于以下环境验证(验证日期:2026-06-19):
- Qt 版本:6.8.2
- 编译器:MinGW 64-bit
- 操作系统:Windows 11
- 构建工具:CMake 3.29
运行要求:Qt 6.5+ 均可直接运行。
三、案例拆解
3.1 案例一:雪花飘落(Demo_Snowflake.qml)
需求分析:雪花从屏幕顶部飘落,有左右飘动效果,大小和透明度略有差异。
组件选型:
| 需求 | 组件选择 | 理由 |
|---|---|---|
| 雪花外观 | ImageParticle + snowflake.png | 雪花图片 + 旋转随机 |
| 顶部线性发射 | Emitter + width = 父容器宽度 | 雪花从整条顶部线落下 |
| 向下飘落 | AngleDirection angle=90 | 正下方 |
| 左右飘动 | Wander xVariance=30 | 随机水平偏移 |
| 大小差异 | sizeVariation=8 | 自然的大小变化 |
| 透明度差异 | alphaVariation=0.2 | 景深感 |
关键代码:
Emitter {
width: parent.width
height: 1
anchors.top: parent.top
emitRate: 30
lifeSpan: 4000
size: 16
sizeVariation: 8
velocity: AngleDirection {
angle: 90
angleVariation: 15
magnitude: 50
magnitudeVariation: 20
}
acceleration: PointDirection {
y: 20
xVariation: 10
}
}
Wander {
xVariance: 30
pace: 100
}
设计要点:
width: parent.width, height: 1:Emitter 是一条水平线,粒子从整条线段上均匀发射angle: 90, angleVariation: 15:基础方向向下,小范围偏移模拟自然飘落acceleration: PointDirection { y: 20 }:轻微的向下加速度,让雪花逐渐加速Wander { xVariance: 30, pace: 100 }:水平方向随机飘动,模拟风的效果
参数调优:
| 参数 | 当前值 | 调大效果 | 调小效果 |
|---|---|---|---|
| emitRate | 30 | 暴风雪(密集) | 稀疏飘雪 |
| magnitude | 50 | 快速下落 | 轻柔飘落 |
| xVariance | 30 | 强风效果 | 几乎垂直下落 |
| sizeVariation | 8 | 大小差异更明显 | 大小更均匀 |
3.2 案例二:爆炸效果(Demo_Explosion.qml)
需求分析:粒子从中心点向外爆发,逐渐消亡,定时重复。
组件选型:
| 需求 | 组件选择 | 理由 |
|---|---|---|
| 全向扩散 | AngleDirection angleVariation=360 | 360 度均匀扩散 |
| 脉冲发射 | Emitter.enabled=false + Timer + burst() | 定时触发一次性爆发 |
| 渐消效果 | endSize=4 | 消亡时缩小 |
| 颜色变化 | colorVariation=0.5 | 爆炸粒子颜色各异 |
| 重力下落 | acceleration: PointDirection { y: 50 } | 爆炸碎片受重力下落 |
关键代码:
Emitter {
id: explosionEmitter
anchors.centerIn: parent
emitRate: 1000
lifeSpan: 1000
size: 24
sizeVariation: 8
endSize: 4
velocity: AngleDirection {
angle: 0
angleVariation: 360
magnitude: 200
magnitudeVariation: 50
}
acceleration: PointDirection {
y: 50
}
onEmitParticles: explosionEmitter.enabled = false
}
Timer {
interval: 1500
running: root.isCurrentItem
repeat: true
onTriggered: {
explosionEmitter.enabled = true
explosionEmitter.burst(500)
}
}
设计要点:
emitRate: 1000:默认发射率很高,但enabled: false让 Emitter 默认不工作onEmitParticles: explosionEmitter.enabled = false:每次发射后立即禁用,确保只发射一次burst(500):一次性发射 500 个粒子,产生爆发效果Timer { interval: 1500 }:每 1.5 秒触发一次爆炸endSize: 4:粒子消亡时从 24 缩小到 4,产生渐消效果
参数调优:
| 参数 | 当前值 | 调大效果 | 调小效果 |
|---|---|---|---|
| burst(500) | 500 | 更密集的爆炸 | 稀疏爆炸 |
| magnitude | 200 | 爆炸范围更大 | 爆炸范围更小 |
| lifeSpan | 1000 | 粒子存活更久 | 快速消亡 |
| acceleration.y | 50 | 碎片下落更快 | 碎片漂浮更久 |
3.3 案例三:银河背景(Demo_Galaxy.qml)
需求分析:模拟星空背景,有普通星星和明亮星星两层,都有轻微漂移。
组件选型:
| 需求 | 组件选择 | 理由 |
|---|---|---|
| 普通星星 | ImageParticle + size=2 | 小而暗 |
| 明亮星星 | ImageParticle + groups=[“bright”] + size=20 | 大而亮 |
| 覆盖全屏 | Emitter width/height = 父容器尺寸 | 均匀分布 |
| 漂移效果 | Wander | 随机漂移 |
| 生命周期差异 | lifeSpanVariation | 星星闪烁感 |
关键代码:
// 普通星星
Emitter {
width: parent.width
height: parent.height
emitRate: 30
lifeSpan: 10000
lifeSpanVariation: 5000
size: 2
sizeVariation: 2
velocity: PointDirection { x: 0; y: 0 }
}
Wander {
xVariance: 100
yVariance: 100
pace: 80
}
// 明亮星星
Emitter {
group: "bright"
width: parent.width
height: parent.height
emitRate: 6
lifeSpan: 6000
lifeSpanVariation: 3000
size: 20
sizeVariation: 16
velocity: PointDirection { x: 0; y: 0 }
}
Wander {
groups: ["bright"]
xVariance: 80
yVariance: 80
pace: 60
}
设计要点:
- 双层粒子:普通星星(emitRate: 30, size: 2)和明亮星星(emitRate: 6, size: 20)使用不同的 Emitter 和 ImageParticle
velocity: PointDirection { x: 0; y: 0 }:初始速度为 0,粒子靠 Wander 运动lifeSpanVariation: 5000:星星的生命周期差异大,有的亮得久有的亮得短,产生闪烁感sizeVariation: 16:明亮星星的大小差异大(4-36 像素),有远近层次感groups: ["bright"]:Wander 只影响 bright 组,两层粒子的漂移参数独立控制
参数调优:
| 参数 | 当前值 | 调大效果 | 调小效果 |
|---|---|---|---|
| emitRate(普通) | 30 | 星星更密集 | 星星稀疏 |
| emitRate(明亮) | 6 | 更多亮星 | 亮星稀少 |
| size(明亮) | 20 | 亮星更大 | 亮星更小 |
| lifeSpanVariation | 5000 | 闪烁差异更大 | 闪烁更均匀 |
四、运行效果
Demo_Snowflake.qml:白色雪花从屏幕顶部飘落,有左右飘动效果,大小和透明度略有差异,形成自然的雪景。

Demo_Explosion.qml:黄色星形粒子从中心爆发,颜色各异(colorVariation),受重力影响下落,每 1.5 秒重复一次。

Demo_Galaxy.qml:白色小星星均匀分布在屏幕上,有轻微漂移;少量大而亮的星星点缀其中,形成星空背景。

五、适用边界与限制条件
- 雪花案例的 Wander 只设了 xVariance:y 方向不受影响,雪花不会在垂直方向飘动。如果需要雪花上下飘动,加
yVariance - 爆炸案例的 burst() 有性能上限:burst 数量过大(> 1000)可能导致帧率下降,建议 200-500
- 银河案例的双层粒子需要 groups 隔离:如果不设 groups,Wander 会影响所有粒子,两层星星的漂移会混在一起
- 银河案例的 Emitter 覆盖全屏:如果窗口很大,粒子密度会降低,需要增大 emitRate
六、总结
三个案例的设计流程:需求分析 → 组件选型 → 参数调优 → 效果验证。核心技巧:
- 雪花:Emitter(顶部线性发射)+ Wander(水平飘动)+ sizeVariation(大小差异)
- 爆炸:Emitter(burst 脉冲)+ AngleDirection(全向扩散)+ endSize(渐消)+ Timer(定时触发)
- 银河:双 Emitter(双层粒子)+ Wander(漂移)+ lifeSpanVariation(闪烁感)
资源下载:qml_particlesystem —— 包含完整的、可运行的代码
系列目录
- 上一篇:Qt Quick 粒子系统(十二):尾迹发射器
- 本文:Qt Quick 粒子系统(十三):基础案例——雪花、爆炸与银河
更多推荐

所有评论(0)