粒子模拟
粒子模拟
粒子模拟的核心是粒子系统(ParticleSystem), 它控制共享时间线。一个粒子使用发射器元素(Emitter)发射, 使用粒子画笔(ParticlePainter)实现可视化, 它可以是一张图片,一个QML项或者是一个着色项(shader Item)。
发射器元素 提供 向量 来控制粒子方向(发送后就 发射器无法再控制)。粒子模型提供 粒子控制器(Affector),它可以 控制 己发射的粒子的参数
- 粒子系统粒(ParticleSystem)- 管理发射器之间的共享时间线。
- 发射器(Emitter)- 向系统中发射逻辑粒子 向系统中发射逻辑粒⼦。
- 粒⼦画笔(ParticlePainter)- 实现粒⼦可视化。
- ⽅向(Direction)- 已发射粒⼦的向量空间。
- 粒⼦组(ParticleGroup)- 每个粒⼦是⼀个粒⼦组的成员。
- 粒⼦控制器(Affector)- 控制已发射粒⼦。
简单的模拟
- 绑定所有元素到一个模拟的粒子系统
- 一个向系统发射粒子的发射器
- 一个ParticlePainter 派生类元素(包括CustomParticle、ImageParticle、ItemParticle), 用来实现粒子可视化
上面代码:
ParticleSystem: 定义一个粒子系统
Emitter :定义一个发射器
emitRate: 发射频率,例如 每秒钟发射 10 个粒子
lifeSpan:每个粒⼦的⽣命周期 ;lifeSpan:1000(每个粒子的生命周期是 1000 毫秒)
lifeSpanVariation:一个己发射粒子的生命周期变化;(lifeSpanVariation:500)⼀个已发射粒⼦的⽣命周期变化是500毫秒
size:⼀个粒⼦开始的⼤⼩是16个像素(size:16),
endSize:⽣命周期结束时的⼤⼩是32个像素(endSize:32)
已发射粒⼦的⽣命
周期变化
效果:
import QtQuick 2.15
import QtQuick.Particles 2.15Rectangle
{id: rootwidth: 480; height: 160color: "#1f1f1f"ParticleSystem {id: particleSystem}Emitter {id: emitteranchors.centerIn: parentwidth: 160; height: 80system: particleSystememitRate: 10lifeSpan: 1000lifeSpanVariation: 500size: 16endSize: 32//Tracer { color: 'green' }}ImageParticle{source: "1234.png"system: particleSystem// color: '#1f1f1f'}// Emitter {// id: emitter// anchors.centerIn: parent// width: 20; height: 20// system: particleSystem// emitRate: 40// lifeSpan: 2000// lifeSpanVariation: 500// size: 64// endSize: 32// //Tracer { color: 'green' }// }// ImageParticle{// source: "star.jpeg"// system: particleSystem// color: '#FFD700'// colorVariation: 0.2// rotation: 15// rotationVariation: 5// rotationVelocity: 45// rotationVelocityVariation: 15// entryEffect: ImageParticle.Scale// }// Emitter {// id: emitter// anchors.left: parent.left// anchors.verticalCenter: parent.verticalCenter// width: 1; height: 1// system: particleSystem// // emitRate: 10// lifeSpan: 6400// lifeSpanVariation: 500// size: 32// //Tracer { color: 'green' }// // velocity: AngleDirection{// // angle: 0// // angleVariation: 15// // magnitude: 100// // magnitudeVariation: 50// // }// // velocity: AngleDirection{// // angle: -45// // magnitude: 100// // }// // acceleration: AngleDirection{// // angle: 90// // magnitude: 25// // }// // velocity: PointDirection{// // x: 100// // y:0// // xVariation: 0// // yVariation: 100/6// // }// velocity: TargetDirection {// targetX: 100// targetY: 0// targetVariation: 100/6// magnitude: 100// }// }// ImageParticle{// source: "star.jpeg"// system: particleSystem// color: '#FFD700'// colorVariation: 0.2// rotation: 15// rotationVariation: 5// rotationVelocity: 45// rotationVelocityVariation: 15// entryEffect: ImageParticle.Scale// }// ItemParticle {// id: particle// system: particleSystem// delegate: itemDelegate// }// Component {// id: itemDelegate// Rectangle {// id: container// width: 32*Math.ceil(Math.random()*3); height: width// color: 'white'// Image {// anchors.fill: parent// anchors.margins: 4// source: 'star.jpeg'// }// }// }// Emitter {// id: emitter// anchors.left: parent.left// anchors.verticalCenter: parent.verticalCenter// width: 1; height: 1// system: particleSystem// // emitRate: 10// lifeSpan: 6400// lifeSpanVariation: 500// size: 32// velocity: TargetDirection {// targetX: 100// targetY: 0// targetVariation: 100/6// magnitude: 100// }// Age {// anchors.horizontalCenter: parent.horizontalCenter// width: 240; height: 120// system: particleSystem// advancePosition: true// lifeLeft: 1200//