一、从组件到效果

前十二篇讲了粒子系统的各个组件——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 —— 包含完整的、可运行的代码

系列目录

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐