// 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 } } }