Revision control
Copy as Markdown
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick3D
import QtQuick3D.Physics
import QtQuick3D.Helpers
import QtQuick.Controls
import QtQuick.Layouts
Window {
id: appWindow
width: 1280
height: 720
visible: true
title: qsTr("PhysX Friction Test")
PhysicsWorld {
id: physicsWorld
gravity: Qt.vector3d(0, -9.81, 0)
running: false
typicalLength: typicalLengthSlider.value
typicalSpeed: typicalSpeedSlider.value
scene: viewport.scene
}
View3D {
id: viewport
anchors.fill: parent
environment: SceneEnvironment {
antialiasingMode: SceneEnvironment.MSAA
}
focus: true
Keys.onSpacePressed: {
console.log("toggle physics")
physicsWorld.running = !physicsWorld.running
}
Node {
id: scene1
PerspectiveCamera {
id: camera1
z: 5
x: -2
y: 1
eulerRotation : Qt.vector3d(-20, -20, 0)
clipFar: 500
clipNear: 0.01
}
DirectionalLight {
eulerRotation: Qt.vector3d(-45, 45, 0)
castsShadow: true
brightness: 1
shadowMapQuality: Light.ShadowMapQualityVeryHigh
shadowBias: 0.05
pcfFactor: 0.005
}
PhysicsMaterial {
id: testMaterial
staticFriction: staticFrictionSlider.value
dynamicFriction: dynamicFrictionSlider.value
restitution: restitutionSlider.value
}
DynamicRigidBody {
id: floor
isKinematic: true
eulerRotation: Qt.vector3d(-79, -90, 0)
kinematicEulerRotation: Qt.vector3d(-79, -90, 0)
scale: Qt.vector3d(0.3, 0.3, 0.3)
physicsMaterial: testMaterial
collisionShapes: PlaneShape {
enableDebugDraw: true
}
Model {
source: "#Rectangle"
materials: PrincipledMaterial {
baseColor: "green"
}
}
}
DynamicRigidBody {
id: box
physicsMaterial: testMaterial
mass: 50
function init() {
console.log("Reinit pos")
box.reset(Qt.vector3d(0, 5.9, 0), Qt.vector3d(0, 0, 0));
}
y: 0.9
Model {
source: "#Cube"
materials: PrincipledMaterial {
baseColor: "red"
}
scale: Qt.vector3d(0.01, 0.01, 0.01)
}
collisionShapes: BoxShape {
extents: Qt.vector3d(1, 1, 1)
enableDebugDraw: true
}
}
} // scene
} // View3D
WasdController {
keysEnabled: true
property bool controllingUnit: false
controlledObject: camera1
speed: 0.02
shiftSpeed: 0.2
Keys.onPressed: (event)=> {
if (keysEnabled) handleKeyPress(event);
if (event.key === Qt.Key_Space) {
if (box.isKinematic) {
console.log("set box to moving")
box.isKinematic = false
physicsWorld.running = true
} else {
physicsWorld.running = !physicsWorld.running
console.log("Set physics to", physicsWorld.running)
}
} else if (event.key === Qt.Key_J) {
floor.kinematicEulerRotation.x++
} else if (event.key === Qt.Key_K) {
floor.kinematicEulerRotation.x--
} else if (event.key === Qt.Key_I) {
box.init()
}
}
Keys.onReleased: (event)=> { if (keysEnabled) handleKeyRelease(event) }
}
ColumnLayout {
Label {
text: "Static friction: " + staticFrictionSlider.value
}
Slider {
id: staticFrictionSlider
focusPolicy: Qt.NoFocus
from: 0
to: 1
value: 0.1
}
Label {
text: "Dynamic friction: " + dynamicFrictionSlider.value
}
Slider {
id: dynamicFrictionSlider
focusPolicy: Qt.NoFocus
from: 0
to: 1
value: 0.1
}
Label {
text: "Restitution: " + restitutionSlider.value
}
Slider {
id: restitutionSlider
focusPolicy: Qt.NoFocus
from: 0
to: 1
value: 0.1
}
Label {
text: "Typical length: " + typicalLengthSlider.value
}
Slider {
id: typicalLengthSlider
focusPolicy: Qt.NoFocus
from: 0
to: 10
value: 1
}
Label {
text: "Typical speed: " + typicalSpeedSlider.value
}
Slider {
id: typicalSpeedSlider
focusPolicy: Qt.NoFocus
from: 0
to: 10
value: 1
}
}
}