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
import QtQuick.Controls
Item {
id: mainView
readonly property real listItemWidth: 180
readonly property real listItemHeight: 40
// Enable this when only want to list the demos
// Tweak the demos list as needed
readonly property bool showOnlyDemos: false
anchors.fill: parent
ListModel {
id: demosModel
ListElement {
name: "Snowing"
file: "Snowing.qml"
}
ListElement {
name: "Line Particles"
file: "LineParticles.qml"
}
ListElement {
name: "HeartTrail"
file: "HeartTrail.qml"
}
ListElement {
name: "Giant Ocean Spider"
file: "OceanSpider.qml"
}
ListElement {
name: "Qt Cube Burst"
file: "QtLogoAnimation.qml"
}
ListElement {
name: "Fire And Smoke"
file: "Fire.qml"
}
ListElement {
name: "Speedometer"
file: "Speedometer.qml"
}
ListElement {
name: "Sorting"
file: "Sorting.qml"
}
ListElement {
name: "Model-Blend Particles"
file: "ModelBlendParticles.qml"
}
ListElement {
name: "Lights"
file: "Lights.qml"
}
ListElement {
name: "Dynamic Bursts"
file: "DynamicBursts.qml"
}
}
ListModel {
id: testsModel
ListElement {
name: "Colorful Particles"
file: "ColorfulParticles.qml"
}
ListElement {
name: "Emitter Shapes"
file: "EmitterShapes.qml"
}
ListElement {
name: "Emitter Custom Shapes"
file: "EmitterCustomShapes.qml"
}
ListElement {
name: "Attractor Shapes"
file: "AttractorShapes.qml"
}
ListElement {
name: "Fading In/Out"
file: "FadingInOut.qml"
}
ListElement {
name: "Emit And Burst"
file: "EmitAndBurst.qml"
}
ListElement {
name: "ParticleSystem"
file: "SystemPlayPause.qml"
}
ListElement {
name: "Aligned Particles"
file: "AlignedParticles.qml"
}
ListElement {
name: "TrailEmitter Burst"
file: "TrailEmitterBurst.qml"
}
ListElement {
name: "Animated Sprite"
file: "AnimatedSprite.qml"
}
ListElement {
name: "Model Shape"
file: "ModelShape.qml"
}
}
View3D {
anchors.fill: parent
environment: SceneEnvironment {
clearColor: "#000000"
backgroundMode: SceneEnvironment.Color
antialiasingMode: settings.antialiasingMode
antialiasingQuality: settings.antialiasingQuality
}
PerspectiveCamera {
position: Qt.vector3d(0, 0, 600)
clipFar: 2000
}
PointLight {
position: Qt.vector3d(200, 200, 400)
brightness: 50
ambientColor: Qt.rgba(0.5, 0.3, 0.1, 1.0)
SequentialAnimation on brightness {
loops: Animation.Infinite
NumberAnimation {
to: 400
duration: 2000
easing.type: Easing.OutElastic
}
NumberAnimation {
to: 50
duration: 6000
easing.type: Easing.InOutQuad
}
}
}
// Qt Cube model
Model {
source: "#Cube"
position: Qt.vector3d(-250, 150, 100)
scale: Qt.vector3d(1.0, 1.0, 1.0)
NumberAnimation on eulerRotation.y {
loops: Animation.Infinite
from: 0
to: 360
duration: 10000
}
NumberAnimation on eulerRotation.x {
loops: Animation.Infinite
from: 0
to: 360
duration: 6000
}
materials: PrincipledMaterial {
baseColorMap: Texture {
source: "images/qt_logo2.png"
}
normalMap: Texture {
source: "images/qt_logo2_n.png"
}
}
}
ParticleSystem3D {
id: psystem
startTime: 10000
SpriteParticle3D {
id: spriteParticle
sprite: Texture {
source: "images/dot.png"
}
maxAmount: 200
color: "#80ff7000"
colorVariation: Qt.vector4d(0.6, 0.2, 0.0, 0.4)
unifiedColorVariation: true
fadeInDuration: 1000
fadeOutDuration: 3000
}
ParticleEmitter3D {
particle: spriteParticle
emitRate: 20
lifeSpan: 10000
scale: Qt.vector3d(8, 8, 0)
shape: ParticleShape3D {
type: ParticleShape3D.Cube
}
particleScale: 2.4
particleScaleVariation: 1.8
particleEndScale: 0.2
velocity: TargetDirection3D {
magnitudeVariation: magnitude
positionVariation: Qt.vector3d(180, 180, 180)
SequentialAnimation on magnitude {
loops: Animation.Infinite
NumberAnimation {
to: 1.0
duration: 3000
easing.type: Easing.InOutQuad
}
NumberAnimation {
to: 0.1
duration: 5000
easing.type: Easing.InOutQuad
}
}
}
}
}
}
Component {
id: listComponent
Button {
width: mainView.listItemWidth
height: mainView.listItemHeight
background: Rectangle {
id: buttonBackground
border.width: 0.5
border.color: "#d0808080"
color: "#d0404040"
opacity: hovered ? 1.0 : 0.5
}
contentItem: Text {
anchors.centerIn: parent
color: "#f0f0f0"
font.pointSize: settings.fontSizeSmall
text: name
}
onClicked: {
loader.source = file
}
}
}
Text {
id: topLabel
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: 20
text: qsTr("Qt Quick 3D - Particles3D")
color: "#f0f0f0"
font.pointSize: settings.fontSizeLarge
}
Row {
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: topLabel.bottom
anchors.topMargin: 20
spacing: 20
ListView {
id: demosListView
width: mainView.listItemWidth
height: count * mainView.listItemHeight
model: demosModel
delegate: listComponent
}
ListView {
id: examplesListView
visible: !showOnlyDemos
width: mainView.listItemWidth
height: count * mainView.listItemHeight
model: testsModel
delegate: listComponent
}
}
}