Qt Quick 3D - Particles 3D Testbed Example
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick3D
import QtQuick3D.Particles3D
Item {
anchors.fill: parent
View3D {
anchors.fill: parent
environment: SceneEnvironment {
clearColor: "#101010"
backgroundMode: SceneEnvironment.Color
antialiasingMode: settings.antialiasingMode
antialiasingQuality: settings.antialiasingQuality
}
PerspectiveCamera {
id: camera
position: Qt.vector3d(0, 100, 600)
clipFar: 2000
}
PointLight {
position: Qt.vector3d(200, 600, 400)
brightness: 40
ambientColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
}
Model {
source: "#Rectangle"
y: -200
scale: Qt.vector3d(30, 15, 15)
eulerRotation.x: -90
materials: [
DefaultMaterial {
diffuseColor: Qt.rgba(1.0, 1.0, 1.0, 1.0)
}
]
}
Node {
position.y: 150
position.z: -200
NumberAnimation on eulerRotation.y {
running: true
loops: Animation.Infinite
from: 0
to: 360
duration: 10000
}
Model {
x: 300
source: "#Cube"
scale: Qt.vector3d(1.5, 1.5, 1.5)
materials: DefaultMaterial {
diffuseColor: Qt.rgba(0.9, 0.9, 0.6, 1.0)
}
eulerRotation.x: parent.eulerRotation.y
eulerRotation.z: 20
}
Model {
x: -300
source: "#Sphere"
scale: Qt.vector3d(2.5, 2.5, 2.5)
materials: DefaultMaterial {
diffuseColor: Qt.rgba(0.9, 0.6, 0.6, 1.0)
opacity: 0.4
}
}
}
ParticleSystem3D {
id: psystem
// Start so that the snowing is in full steam
startTime: 15000
SpriteParticle3D {
id: snowParticle
sprite: Texture {
source: "images/snowflake.png"
}
maxAmount: 1500 * sliderIntensity.sliderValue
color: "#ffffff"
colorVariation: Qt.vector4d(0.0, 0.0, 0.0, 0.5);
fadeInDuration: 1000
fadeOutDuration: 1000
}
ParticleEmitter3D {
id: emitter
particle: snowParticle
position: Qt.vector3d(0, 1000, -350)
depthBias: -100
scale: Qt.vector3d(15.0, 0.0, 15.0)
shape: ParticleShape3D {
type: ParticleShape3D.Sphere
}
particleRotationVariation: Qt.vector3d(180, 180, 180)
particleRotationVelocityVariation: Qt.vector3d(50, 50, 50);
particleScale: 2.0
particleScaleVariation: 0.5;
velocity: VectorDirection3D {
direction: Qt.vector3d(0, sliderVelocityY.sliderValue, 0)
directionVariation: Qt.vector3d(0, sliderVelocityY.sliderValue * 0.4, 0)
}
emitRate: sliderEmitRate.sliderValue * sliderIntensity.sliderValue
lifeSpan: 15000
}
Wander3D {
enabled: checkBoxWanderEnabled.checked
globalAmount: Qt.vector3d(sliderWanderGlobalAmount.sliderValue, 0, sliderWanderGlobalAmount.sliderValue)
globalPace: Qt.vector3d(sliderWanderGlobalPace.sliderValue, 0, sliderWanderGlobalPace.sliderValue)
uniqueAmount: Qt.vector3d(sliderWanderUniqueAmount.sliderValue, 0, sliderWanderUniqueAmount.sliderValue)
uniquePace: Qt.vector3d(sliderWanderUniquePace.sliderValue, 0, sliderWanderUniquePace.sliderValue)
uniqueAmountVariation: sliderWanderUniqueAmountVariation.sliderValue
uniquePaceVariation: sliderWanderUniquePaceVariation.sliderValue
}
PointRotator3D {
enabled: checkBoxRotatorEnabled.checked
pivotPoint: Qt.vector3d(0, 0, -350)
direction: Qt.vector3d(0, 1, 0)
magnitude: sliderRotatorMagnitude.sliderValue
}
}
}
SettingsView {
CustomLabel {
text: "Intensity of snowfall"
}
CustomSlider {
id: sliderIntensity
sliderValue: 5
fromValue: 1
toValue: 20
}
CustomLabel {
text: "Emit Rate"
}
CustomSlider {
id: sliderEmitRate
sliderValue: 50
fromValue: 1
toValue: 100
}
CustomLabel {
text: "Start Velocity Y"
}
CustomSlider {
id: sliderVelocityY
sliderValue: -100
fromValue: -50
toValue: -500
}
CustomLabel {
text: "System Rotation"
}
CustomSlider {
id: sliderRotation
sliderValue: 0
fromValue: -90
toValue: 90
onSliderValueChanged: {
psystem.eulerRotation.z = sliderValue;
}
}
CustomCheckBox {
id: checkBoxWanderEnabled
text: "Wander: enabled"
checked: true
}
CustomLabel {
text: "Wander: globalAmount"
}
CustomSlider {
id: sliderWanderGlobalAmount
sliderValue: 50
fromValue: 0
toValue: 100
}
CustomLabel {
text: "Wander: globalPace"
}
CustomSlider {
id: sliderWanderGlobalPace
sliderValue: 0.2
fromValue: 0
toValue: 2.0
}
CustomLabel {
text: "Wander: uniqueAmount"
}
CustomSlider {
id: sliderWanderUniqueAmount
sliderValue: 50
fromValue: 0
toValue: 100
}
CustomLabel {
text: "Wander: uniquePace"
}
CustomSlider {
id: sliderWanderUniquePace
sliderValue: 0.2
fromValue: 0
toValue: 2.0
}
CustomLabel {
text: "Wander: uniqueAmountVariation"
}
CustomSlider {
id: sliderWanderUniqueAmountVariation
sliderValue: 0.5
fromValue: 0.0
toValue: 1.0
}
CustomLabel {
text: "Wander: uniquePaceVariation"
}
CustomSlider {
id: sliderWanderUniquePaceVariation
sliderValue: 0.5
fromValue: 0.0
toValue: 1.0
}
CustomCheckBox {
id: checkBoxRotatorEnabled
text: "PointRotator: enabled"
checked: true
}
CustomLabel {
text: "PointRotator: magnitude"
}
CustomSlider {
id: sliderRotatorMagnitude
sliderValue: 0.0
fromValue: -100.0
toValue: 100.0
}
}
LoggingView {
anchors.bottom: parent.bottom
particleSystems: [psystem]
}
}