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 {
id: mainWindow
anchors.fill: parent
View3D {
anchors.fill: parent
environment: SceneEnvironment {
clearColor: "#202020"
backgroundMode: SceneEnvironment.Color
antialiasingMode: settings.antialiasingMode
antialiasingQuality: settings.antialiasingQuality
}
PerspectiveCamera {
id: camera
position: Qt.vector3d(0, 100, 600)
}
PointLight {
position: Qt.vector3d(0, 400, 100)
brightness: 10
ambientColor: Qt.rgba(0.3, 0.3, 0.3, 1.0)
}
// Models shared between particles
Component {
id: particleComponent
Model {
source: "#Cube"
scale: Qt.vector3d(0.1, 0.1, 0.1)
materials: DefaultMaterial {
}
}
}
Component {
id: particleComponent2
Model {
source: "#Cylinder"
scale: Qt.vector3d(0.1, 0.2, 0.1)
materials: PrincipledMaterial {
metalness: 0.5
roughness: 0
specularAmount: 1.0
}
}
}
ParticleSystem3D {
id: psystem
SequentialAnimation on eulerRotation.y {
running: true
loops: Animation.Infinite
NumberAnimation {
to: 180
duration: 5000
easing.type: Easing.InOutCirc
}
NumberAnimation {
to: 0
duration: 5000
easing.type: Easing.InOutCirc
}
}
property vector4d cVar: Qt.vector4d(sliderRedVariation.sliderValue,
sliderGreenVariation.sliderValue,
sliderBlueVariation.sliderValue,
sliderAlphaVariation.sliderValue)
// Particles
ModelParticle3D {
id: particleRed
delegate: particleComponent
maxAmount: 250
color: "#ff0000"
colorVariation: psystem.cVar
unifiedColorVariation: checkBoxUnified.checked
}
ModelParticle3D {
id: particleGreen
delegate: particleComponent
maxAmount: 250
color: "#00ff00"
colorVariation: psystem.cVar
unifiedColorVariation: checkBoxUnified.checked
}
ModelParticle3D {
id: particleBlue
delegate: particleComponent
maxAmount: 250
color: "#0000ff"
colorVariation: psystem.cVar
unifiedColorVariation: checkBoxUnified.checked
}
ModelParticle3D {
id: particleWhite
delegate: particleComponent2
maxAmount: 250
color: "#ffffff"
colorVariation: psystem.cVar
unifiedColorVariation: checkBoxUnified.checked
}
// Emitters, one per particle
ParticleEmitter3D {
particle: particleRed
position: Qt.vector3d(400, 50, 0)
particleScaleVariation: 0.8
particleRotationVariation: Qt.vector3d(180, 180, 180)
particleRotationVelocityVariation: Qt.vector3d(200, 200, 200);
velocity: VectorDirection3D {
direction: Qt.vector3d(-350, 150, 0)
directionVariation: Qt.vector3d(30, 30, 30)
}
emitRate: 100
lifeSpan: 2500
Node {
x: 20
Text {
anchors.verticalCenter: parent.verticalCenter
text: "RED"
font.pointSize: settings.fontSizeLarge
color: "#ffffff"
}
}
}
ParticleEmitter3D {
particle: particleGreen
position: Qt.vector3d(400, 0, 0)
particleScaleVariation: 0.8
particleRotationVariation: Qt.vector3d(180, 180, 180)
particleRotationVelocityVariation: Qt.vector3d(200, 200, 200);
velocity: VectorDirection3D {
direction: Qt.vector3d(-350, 150, 0)
directionVariation: Qt.vector3d(30, 30, 30)
}
emitRate: 100
lifeSpan: 2500
Node {
x: 20
Text {
anchors.verticalCenter: parent.verticalCenter
text: "GREEN"
font.pointSize: settings.fontSizeLarge
color: "#ffffff"
}
}
}
ParticleEmitter3D {
particle: particleBlue
position: Qt.vector3d(400, -50, 0)
particleScaleVariation: 0.8
particleRotationVariation: Qt.vector3d(180, 180, 180)
particleRotationVelocityVariation: Qt.vector3d(200, 200, 200);
velocity: VectorDirection3D {
direction: Qt.vector3d(-350, 150, 0)
directionVariation: Qt.vector3d(30, 30, 30)
}
emitRate: 100
lifeSpan: 2500
Node {
x: 20
Text {
anchors.verticalCenter: parent.verticalCenter
text: "BLUE"
font.pointSize: settings.fontSizeLarge
color: "#ffffff"
}
}
}
ParticleEmitter3D {
particle: particleWhite
position: Qt.vector3d(400, -100, 0)
particleScaleVariation: 0.8
particleRotationVariation: Qt.vector3d(180, 180, 180)
particleRotationVelocityVariation: Qt.vector3d(200, 200, 200);
velocity: VectorDirection3D {
direction: Qt.vector3d(-350, 150, 0)
directionVariation: Qt.vector3d(30, 30, 30)
}
emitRate: 100
lifeSpan: 2500
Node {
x: 20
Text {
anchors.verticalCenter: parent.verticalCenter
text: "WHITE"
font.pointSize: settings.fontSizeLarge
color: "#ffffff"
}
}
}
Gravity3D {
// Enable to affect only some of the particles
//particles: [particleRed, particleBlue, particleGreen]
direction: Qt.vector3d(0, 1, 0)
magnitude: -100
}
}
}
SettingsView {
CustomCheckBox {
id: checkBoxUnified
text: "Unified Variation"
checked: false
}
CustomLabel {
text: "Red Variation"
}
CustomSlider {
id: sliderRedVariation
sliderValue: 0
fromValue: 0.0
toValue: 1.0
}
CustomLabel {
text: "Green Variation"
}
CustomSlider {
id: sliderGreenVariation
sliderValue: 0
fromValue: 0.0
toValue: 1.0
}
CustomLabel {
text: "Blue Variation"
}
CustomSlider {
id: sliderBlueVariation
sliderValue: 0
fromValue: 0.0
toValue: 1.0
}
CustomLabel {
text: "Alpha Variation"
}
CustomSlider {
id: sliderAlphaVariation
sliderValue: 0
fromValue: 0.0
toValue: 1.0
}
}
LoggingView {
anchors.bottom: parent.bottom
particleSystems: [psystem]
}
}