目录
- 基本示例
- Affector
- Age - 改变特定年龄粒子的属性
- Attractor - 吸引粒子到指定点
- Friction - 施加摩擦力
- Gravity - 模拟重力
- Wander - 随机游走效果
- Turbulence - 添加湍流效果
- 下载链接
接上篇QML 粒子系统 (雪花飘落、爆炸粒子效果),本文继续研究粒子系统中的附属效果。
基本示例
首先展示一个基本示例作为参照,后续逐步展示设置影响器带来的效果。
import QtQuick
import QtQuick.ParticlesRectangle {width: 400height: 400color: "black"ParticleSystem {id: particleSystemanchors.fill: parent// 粒子绘制器 - 使用图片绘制粒子ImageParticle {source: "qrc:/images/star.png"color: "#FFFFFF"alpha: 0.4}// 粒子发射器Emitter {id: emittersystem: particleSystemheight: parent.height/4width: 1anchors.left: parent.left// 发射速率 (每秒粒子数)emitRate: 120// 粒子生命周期 (毫秒)lifeSpan: 2400// 粒子大小size: 16sizeVariation: 8// 粒子速度velocity: PointDirection { x: 100 ; xVariation: 50 }// 粒子加速度acceleration: PointDirection { x: 20 }}}
}
运行效果:
这段代码实现了一个在黑色背景矩形中,从左侧边缘以每秒 120 个的速率发射带透明度的星形图片粒子,粒子具有变化的大小、向右的速度和加速度,生命周期为 2400 毫秒的粒子系统效果。没有设置Affector时:
Affector
在粒子生命周期中影响其行为。常用影响器类型:
Age - 改变特定年龄粒子的属性
参考:https://doc.qt.io/qt-6/qml-qtquick-particles-age.html
- Age 效果器可改变粒子在生命周期中的状态。其常见用途是让粒子提前结束生命周期,这样它们可能有时间以动画形式淡出。
- Age 效果器有时也被称为 “销毁” 效果器,因为在默认参数下,它会立即结束所有受影响粒子的生命周期。
- Age 效果器仅适用于仍存活的粒子。
属性解释:
advancePosition(推进位置)参数用于决定粒子的位置、速度和加速度是否纳入效果器模拟的老化计算中。
- 若advancePosition为false,则粒子的位置、速度和加速度将保持不变,仅其他属性(如不透明度)会在模拟中按粒子生命周期的对应阶段正常变化;
- 若advancePosition为true,粒子的位置、速度和加速度也会按生命周期的对应阶段正常推进,使其在屏幕上的位置随模拟进程移动。
示例:
Age {system: particleSystemadvancePosition: truelifeLeft: 500once: true
}
Attractor - 吸引粒子到指定点
参考:https://doc.qt.io/qt-6/qml-qtquick-particles-attractor.html
与其他效果器一样,吸引器(Attractor)具有表示影响区域的标准属性:x、y、宽度和高度。吸引器项目的大小和位置决定了受影响的粒子。吸引点的大小始终为0x0,其位置由pointX和pointY属性指定。
affectedParameter:枚举类型
常量 | 说明 |
---|---|
Attractor.Position | 位置 |
Attractor.Velocity | 速度 |
Attractor.Acceleration | 加速度 |
pointX: 吸引点的 x 坐标,相对于吸引器项目的 x 坐标。
pointY: 吸引点的 y 坐标,相对于吸引器项目的 y 坐标。
proportionalToDistance:枚举类型
常量 | 说明 |
---|---|
Attractor.Constant | 恒定(与距离无关) |
Attractor.Linear | 线性(与距离成正比) |
Attractor.InverseLinear | 反线性(与距离成反比) |
Attractor.Quadratic | 二次方(与距离平方成正比) |
Attractor.InverseQuadratic | 反二次方(与距离平方成反比) |
strength属性
- 对距离 1 像素的对象施加的拉力(单位:单位 / 秒)。
- 拉力强度与proportionalToDistance属性共同决定对一定距离内粒子的实际拉力大小。
示例:
Attractor {affectedParameter: Attractor.PositionproportionalToDistance: Attractor.LinearpointX: 400pointY: 400strength: 0.3
}
运行效果:
将粒子的位置作为目标属性,向坐标 (400, 400) 处的吸引点产生线性强度的吸引力,强度为 0.3。
Friction - 施加摩擦力
参考:https://doc.qt.io/qt-6/qml-qtquick-particles-friction.html
factor属性:
将根据运动物体当前速度的该系数对其施加阻力。
threshold属性:
阻力仅适用于速度高于阈值速度的物体。所施加的阻力会使物体的速度降至阈值速度,但不会进一步降低。默认阈值为 0。
示例:
Friction {factor: 0.8threshold: 10
}
运行效果:
Gravity - 模拟重力
参考:https://doc.qt.io/qt-6/qml-qtquick-particles-gravity.html
该元素会将所有受影响的粒子加速至具有指定大小和指定角度的矢量方向。如果角度和加速度不变,在发射器上设置指定的加速度会更高效。
此元素模拟重心位于远处的大质量物体的重力(因此重力在整个场景中实际上是恒定的)。若要模拟场景附近或内部物体的重力,请使用 “PointAttractor”。
angle属性: 加速度角度。
magnitude属性: 物体将被加速的每秒像素数。
示例:
Gravity {angle: 90magnitude: 100
}
Wander - 随机游走效果
参考:https://doc.qt.io/qt-6/qml-qtquick-particles-wander.html
pace属性: 每秒最大属性变化量
xVariance属性: 最大属性x值。
yVariance属性: 最大属性y值。
示例:
Wander {yVariance: 100pace: 200
}
Turbulence - 添加湍流效果
参考:https://doc.qt.io/qt-6/qml-qtquick-particles-turbulence.html
湍流元素会在其影响的区域内缩放噪波源,并使用该源的卷曲度生成力矢量。
湍流需要固定大小。与其他影响器不同,0x0尺寸的湍流元素不会对任何粒子产生影响。
噪波源应是相对平滑的黑白噪波(如柏林噪波)。
noiseSource属性:
噪声来源,用于生成湍流的源图像。该图像将被缩放到元素的大小,因此尺寸等于或大于元素尺寸会产生更好的效果。调整此图像是调整涡流位置或数量等行为的唯一方法。 源图像应是相对平滑的黑白噪波图像(如柏林噪波)。如果未提供图像,则会使用默认图像。
strength属性:
任意点的速度矢量大小在0到√2之间变化。该值随后将乘以强度值,从而得到受湍流影响的粒子的每秒速度。
示例:
Turbulence {anchors.horizontalCenter: parent.horizontalCenterwidth: 120; height: 120system: particleSystemstrength: 100
}
此代码定义了一个居中的、120×120像素的湍流区域,强度为100,用于影响particleSystem
中的粒子,使其产生复杂的不规则运动效果。
下载链接
GitCode 粒子系统示例