Revision control

++ // Copyright (C) 2022 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ import QtQuick
++ import QtQuick.Layouts
++ import QtQuick.Controls
++ import QtQuick3D
++ import QtQuick3D.Helpers
++ import QtQuick3D.Physics
++
++ Window {
++ width: 640
++ height: 480
++ visible: true
++ title: qsTr("Qt Quick 3D Physics - Scaling test")
++
++ PhysicsWorld {
++ id: physicsWorld
++ gravity: Qt.vector3d(0, -9.81, 0)
++ running: true
++ forceDebugDraw: true
++
++ typicalLength: 1
++ typicalSpeed: 10
++ scene: viewport.scene
++ }
++
++ View3D {
++ id: viewport
++ anchors.fill: parent
++
++ environment: SceneEnvironment {
++ clearColor: "#d6dbdf"
++ backgroundMode: SceneEnvironment.Color
++ }
++
++ Node {
++ id: scene
++
++ PerspectiveCamera {
++ id: camera1
++ position: Qt.vector3d(-2, 1, 5)
++ eulerRotation: Qt.vector3d(-20, -20, 0)
++ clipFar: 50
++ clipNear: 0.01
++ }
++
++ DirectionalLight {
++ eulerRotation.x: -45
++ eulerRotation.y: 45
++ castsShadow: true
++ brightness: 1
++ shadowFactor: 100
++ shadowBias: 0.05
++ pcfFactor: 0.005
++ }
++
++ StaticRigidBody {
++ id: floor
++ position: Qt.vector3d(0, -1, 0)
++ eulerRotation: Qt.vector3d(-90, 0, 0)
++ collisionShapes: PlaneShape {}
++ Model {
++ source: "#Rectangle"
++ scale: Qt.vector3d(5, 5, 1)
++ materials: PrincipledMaterial {
++ baseColor: "green"
++ }
++ castsShadows: false
++ receivesShadows: true
++ }
++ }
++
++
++ Component {
++ id: spawnComponent
++
++ DynamicRigidBody {
++ id: thisBody
++ y: 2
++
++ collisionShapes: SphereShape {
++ id: sphereShape
++ diameter: 1
++ }
++ Model {
++ source: "#Sphere"
++ materials: PrincipledMaterial {
++ baseColor: "orange"
++ }
++ scale: Qt.vector3d(0.01, 0.01, 0.01).times(sphereShape.diameter)
++ }
++ Connections {
++ target: spawner
++ function onKill() {
++ thisBody.destroy()
++ }
++ }
++ }
++ }
++
++ Timer {
++ id: spawner
++ interval: 2000
++ repeat: true
++ running: physicsWorld.running
++
++ onTriggered: {
++ doSpawn()
++ }
++
++ function doSpawn() {
++ kill()
++ spawnComponent.createObject(scene)
++ }
++ signal kill()
++ }
++
++
++
++ Node {
++ id: bodies
++ property real sf: scaleSlider.value
++ scale: Qt.vector3d(sf, sf, sf)
++
++ DynamicRigidBody {
++ id: box
++ massMode: DynamicRigidBody.CustomDensity
++ density: 10
++ property vector3d startPos: Qt.vector3d(-1, 1, 0)
++ position: box.startPos
++
++ property real xf: xSlider.value
++ property real yf: ySlider.value
++ scale: Qt.vector3d(xf, yf, 1)
++
++
++ collisionShapes: BoxShape {
++ id: boxShape
++ property real xtent: xtentSlider.value
++ extents: Qt.vector3d(xtent, 1, 1)
++ }
++ Model {
++ source: "#Cube"
++ materials: PrincipledMaterial {
++ baseColor: "yellow"
++ }
++ scale: boxShape.extents.times(0.01)
++ }
++ }
++
++ DynamicRigidBody {
++ id: sphere
++ massMode: DynamicRigidBody.CustomDensity
++ density: 10
++ property vector3d startPos: Qt.vector3d(0, 1, 0)
++ position: sphere.startPos
++
++ collisionShapes: SphereShape {
++ id: sphereShape
++ diameter: 1
++ }
++ Model {
++ source: "#Sphere"
++ materials: PrincipledMaterial {
++ baseColor: "blue"
++ }
++ scale: Qt.vector3d(0.01, 0.01, 0.01).times(sphereShape.diameter)
++ }
++ }
++
++ DynamicRigidBody {
++ id: capsule
++ property vector3d startPos: Qt.vector3d(1, 1, 0)
++ position: capsule.startPos
++ massMode: DynamicRigidBody.CustomDensity
++ density: 10
++
++ property real xf: xSlider.value
++ property real yf: ySlider.value
++ scale: Qt.vector3d(xf, yf, yf)
++
++ collisionShapes: CapsuleShape {
++ id: capsuleShape
++ property real cHeight: heightSlider.value
++ diameter: 1
++ height: cHeight
++ }
++
++ Model {
++ geometry: CapsuleGeometry {
++ diameter: capsuleShape.diameter
++ height: capsuleShape.height
++ }
++ materials: PrincipledMaterial {
++ baseColor: "red"
++ }
++ }
++ }
++ } // bodies
++ }
++ }
++
++ ColumnLayout {
++
++ Label {
++ text: "Uniform scale: " + scaleSlider.value
++ }
++ Slider {
++ id: scaleSlider
++ focusPolicy: Qt.NoFocus
++ from: 0.2
++ to: 3
++ value: 1
++ }
++ Label {
++ text: "Local x scale: " + xSlider.value
++ }
++ Slider {
++ id: xSlider
++ focusPolicy: Qt.NoFocus
++ from: 0.2
++ to: 3
++ value: 1
++ }
++ Label {
++ text: "Local y scale: " + ySlider.value
++ }
++ Slider {
++ id: ySlider
++ focusPolicy: Qt.NoFocus
++ from: 0.2
++ to: 3
++ value: 1
++ }
++ Label {
++ text: "Box x extent: " + xtentSlider.value
++ }
++ Slider {
++ id: xtentSlider
++ focusPolicy: Qt.NoFocus
++ from: 0.2
++ to: 5
++ value: 1
++ }
++ Label {
++ text: "Capsule height: " + heightSlider.value
++ }
++ Slider {
++ id: heightSlider
++ focusPolicy: Qt.NoFocus
++ from: 0.2
++ to: 5
++ value: 1
++ }
++ Button {
++ id: resetButton
++ Layout.alignment: Qt.AlignHCenter
++ text: "Reset scene"
++ onClicked: {
++ box.reset(box.startPos, Qt.vector3d(0, 0, 0))
++ sphere.reset(sphere.startPos, Qt.vector3d(0, 0, 0))
++ capsule.reset(capsule.startPos, Qt.vector3d(0, 0, 0))
++ }
++ }
++
++ }
++
++ }