Revision control
Copy as Markdown
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick3D
import QtQuick3D.Particles3D
import QtQuick.Timeline
Item {
id: mainWindow
width: 400
height: 400
Timeline {
id: timeline
enabled: true
startFrame: 0
endFrame: 120
animations: [
TimelineAnimation {
id: timelineAnimation
running: true
duration: 2000
from: timeline.currentFrame
to: 120
}
]
keyframeGroups: [
KeyframeGroup {
target: psystem
property: "time"
Keyframe { frame: 0; value: 0 }
Keyframe { frame: 120; value: 2000 }
}
]
}
View3D {
id: view3D
anchors.fill: parent
environment: SceneEnvironment {
clearColor: "#202020"
backgroundMode: SceneEnvironment.Color
}
camera: PerspectiveCamera {
position: Qt.vector3d(0, 0, 1000)
}
PointLight {
position: Qt.vector3d(200, 400, 800)
brightness: 40
ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
}
// Model shared between particles
Component {
id: particleComponent
Model {
source: "#Cube"
scale: Qt.vector3d(0.2, 0.2, 0.2)
materials: DefaultMaterial {
}
}
}
Node {
y: -100
ParticleSystem3D {
id: psystem
useRandomSeed: false
running: false
NumberAnimation {
running: true
target: psystem
property: "eulerRotation.z"
from: 0
to: 90
duration: 2000
}
// Particles
ModelParticle3D {
id: particleWhite
delegate: particleComponent
maxAmount: 250
color: "#ffffff"
}
ModelParticle3D {
id: particleGreen
delegate: particleComponent
maxAmount: 250
color: "#00ff00"
}
SpriteParticle3D {
id: particleBillboard
sprite: Texture {
source: "images/sphere.png"
}
maxAmount: 250
color: "#ff0000"
billboard: true
}
// Emitter directly inside the system
ParticleEmitter3D {
id: emitter3
system: psystem
particle: particleGreen
x: -100
particleScale: 1.0
particleEndScale: 0.2
particleRotationVariation: Qt.vector3d(180, 180, 180)
velocity: VectorDirection3D {
direction: Qt.vector3d(250, 0, 0)
directionVariation: Qt.vector3d(0, 30, 0)
}
lifeSpan: 3000
emitRate: 20
Component.onCompleted: emitter3.burst(100)
}
// Emitter inside the system + node.
Node {
y: -200
scale: Qt.vector3d(2, 2, 2)
ParticleEmitter3D {
id: emitter1
system: psystem
particle: particleWhite
y: 100
x: -50
particleScale: 0.2
particleEndScale: 1.0
particleRotationVariation: Qt.vector3d(180, 180, 180)
velocity: VectorDirection3D {
direction: Qt.vector3d(0, 200, 0)
directionVariation: Qt.vector3d(40, 0, 30)
}
lifeSpan: 3000
emitRate: 50
Component.onCompleted: emitter1.burst(100)
Model {
source: "#Cube"
scale: Qt.vector3d(0.2, 0.2, 0.2)
materials: DefaultMaterial {
}
}
}
}
}
// Emitter outside the system + node
Node {
eulerRotation.z: -90
scale: Qt.vector3d(2, 2, 2)
ParticleEmitter3D {
id: emitter2
system: psystem
particle: particleBillboard
position.y: -50
eulerRotation.z: -90
particleScale: 4
velocity: VectorDirection3D {
direction: Qt.vector3d(0, 100, 0)
directionVariation: Qt.vector3d(20, 0, 30)
}
lifeSpan: 3000
emitRate: 50
Component.onCompleted: emitter2.burst(100)
}
}
}
}
}