- Qt 6.12
- Qt Quick 3D Physics
- Qt Quick 3D Physics Examples and Tutorials
- Qt Quick 3D Physics - Material Example
- Qt Quick 3D Physics | Commercial or GPLv3

# Qt Quick 3D Physics - Material Example

     // Copyright (C) 2022 The Qt Company Ltd.
     // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
     import QtQuick
     import QtQuick3D
     import QtQuick3D.Physics
     import QtQuick.Controls
     import QtQuick.Layouts

     Window {
         id: appWindow
         width: 800
         height: 600
         visible: true
         title: qsTr("Qt Quick 3D Physics - Material example")

         PhysicsWorld {
             scene: viewport.scene
         }

         View3D {
             id: viewport
             anchors.fill: parent

             environment: SceneEnvironment {
                 antialiasingMode: SceneEnvironment.MSAA
                 backgroundMode: SceneEnvironment.Color
                 clearColor: "#f0f0f0"
             }

             PerspectiveCamera {
                 position: Qt.vector3d(0, 500, 1500)
                 eulerRotation: Qt.vector3d(-20, 0, 0)
                 clipFar: 10000
                 clipNear: 10
             }

             DirectionalLight {
                 eulerRotation: Qt.vector3d(-45, 45, 0)
                 castsShadow: true
                 brightness: 1
                 shadowFactor: 100
                 shadowMapQuality: Light.ShadowMapQualityVeryHigh
             }

             PhysicsMaterial {
                 id: physicsMaterial
                 staticFriction: staticFrictionSlider.value
                 dynamicFriction: dynamicFrictionSlider.value
                 restitution: restitutionSlider.value
             }

             StaticRigidBody {
                 eulerRotation: Qt.vector3d(-79, -90, 0)
                 scale: Qt.vector3d(20, 30, 100)
                 physicsMaterial: physicsMaterial
                 collisionShapes: PlaneShape {}
                 Model {
                     source: "#Rectangle"
                     materials: PrincipledMaterial {
                         baseColor: "green"
                     }
                     castsShadows: false
                     receivesShadows: true
                 }
             }

             DynamicRigidBody {
                 id: box
                 physicsMaterial: physicsMaterial
                 massMode: DynamicRigidBody.CustomDensity
                 density: 10
                 property vector3d startPosition: Qt.vector3d(700, 300, 0)
                 position: startPosition
                 Model {
                     source: "#Cube"
                     materials: PrincipledMaterial {
                         baseColor: "red"
                     }
                 }
                 collisionShapes: BoxShape {}
             }
         }

         Frame {
             background: Rectangle {
                 color: "#c0c0c0"
                 border.color: "#202020"
             }
             anchors.top: parent.top
             anchors.left: parent.left
             anchors.margins: 10

             ColumnLayout {
                 Label {
                     text: "Static friction: " + staticFrictionSlider.value.toFixed(2)
                 }
                 Slider {
                     id: staticFrictionSlider
                     focusPolicy: Qt.NoFocus
                     from: 0
                     to: 1
                     value: 0.1
                 }
                 Label {
                     text: "Dynamic friction: " + dynamicFrictionSlider.value.toFixed(2)
                 }
                 Slider {
                     id: dynamicFrictionSlider
                     focusPolicy: Qt.NoFocus
                     from: 0
                     to: 1
                     value: 0.1
                 }
                 Label {
                     text: "Restitution: " + restitutionSlider.value.toFixed(2)
                 }
                 Slider {
                     id: restitutionSlider
                     focusPolicy: Qt.NoFocus
                     from: 0
                     to: 1
                     value: 0.1
                 }
                 Button {
                     id: resetButton
                     Layout.alignment: Qt.AlignHCenter
                     text: "Reset box"
                     onClicked: box.reset(box.startPosition, Qt.vector3d(0, 0, 0))
                 }
             }
         }
     }