Qt Quick 3D Physics - Mass Example▲
Sélectionnez
// 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 =&
gt;
{
let diff =
Date.now
(
) -
sphere[
'date'
];
if (
diff &
gt;
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) =&
gt; {
handleKeyPress(event);
if
(event.key ===
Qt.Key_Space) {
shapeSpawner.createBall
(
camera.
position,
camera.
forward
);
}
}
Keys.onReleased
:
(event) =&
gt; {
handleKeyRelease(event) }
}
}