Qt Quick 3D Physics - Mass Example
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick3D
import QtQuick3D.Helpers
import QtQuick3D.Physics
import QtQuick3D.Physics.Helpers
Window {
width: 640
height: 480
visible: true
title: qsTr("Qt Quick 3D Physics - Mass")
PhysicsWorld {
running: true
gravity: Qt.vector3d(0, -9.81, 0)
typicalLength: 1
typicalSpeed: 10
scene: viewport.scene
}
View3D {
id: viewport
anchors.fill: parent
environment: SceneEnvironment {
clearColor: "lightblue"
backgroundMode: SceneEnvironment.Color
}
PerspectiveCamera {
id: camera
position: Qt.vector3d(0, 2, 5)
eulerRotation: Qt.vector3d(-10, 0, 0)
clipFar: 100
clipNear: 0.01
}
DirectionalLight {
eulerRotation.x: -45
eulerRotation.y: 45
castsShadow: true
brightness: 1
shadowFactor: 100
}
StaticRigidBody {
position: Qt.vector3d(0, 0, 0)
eulerRotation: Qt.vector3d(-90, 0, 0)
collisionShapes: PlaneShape {}
Model {
source: "#Rectangle"
materials: DefaultMaterial {
diffuseColor: "green"
}
castsShadows: false
receivesShadows: true
}
}
RolyPoly {
position: Qt.vector3d(-2, 0.5, 0)
color: "blue"
mass: 0.9
centerOfMassPosition: Qt.vector3d(0, -0.5, 0)
inertiaTensor: Qt.vector3d(0.217011, 0.0735887, 0.217011)
massMode: DynamicRigidBody.MassAndInertiaTensor
}
RolyPoly {
position: Qt.vector3d(0, 0.5, 0)
color: "purple"
mass: 0.9
centerOfMassPosition: Qt.vector3d(0, -0.5, 0)
inertiaTensor: Qt.vector3d(0.05, 100, 100)
massMode: DynamicRigidBody.MassAndInertiaTensor
}
RolyPoly {
position: Qt.vector3d(2, 0.5, 0)
color: "red"
mass: 0.9
massMode: DynamicRigidBody.Mass
}
Node {
id: shapeSpawner
property var spheres: []
property var sphereComponent: Qt.createComponent("Sphere.qml")
function createBall(position, forward) {
let diameter = 0.2
let speed = 20
let sphere = sphereComponent.createObject(shapeSpawner, {
"position": position,
"sphereDiameter": diameter
})
sphere.setLinearVelocity(forward.times(speed))
var pair = {
"sphere": sphere,
"date": Date.now()
}
spheres.push(pair)
if (sphere === null) {
console.log("Error creating object")
}
}
function clean() {
spheres = spheres.filter(sphere => {
let diff = Date.now() - sphere['date'];
if (diff > 5000) {
sphere['sphere'].destroy();
return false;
}
return true;
});
}
Timer {
interval: 200
running: true
repeat: true
onTriggered: shapeSpawner.clean()
}
}
}
WasdController {
speed: 0.01
controlledObject: camera
Keys.onPressed: (event) => {
handleKeyPress(event);
if (event.key === Qt.Key_Space) {
shapeSpawner.createBall(camera.position, camera.forward);
}
}
Keys.onReleased: (event) => { handleKeyRelease(event) }
}
}