Qt Quick 3D Physics - Joints Example

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

 Node {
     id: root

     property real stiffness : 15000
     property real damping : 500

     SphericalJoint {
         bodyB: shape0
         positionA: root.position
         positionB: Qt.vector3d(-25, 0, 0)
     }

     PrismaticJoint {
         bodyA: shape0
         bodyB: shape1
         positionA: Qt.vector3d(25, 0, 0)
         positionB: Qt.vector3d(-25, 0, 0)
         stiffness: root.stiffness
         damping: root.damping
         lowerLimit: -20
         upperLimit: 0
     }

     SphericalJoint {
         bodyA: shape1
         bodyB: shape2
         positionA: Qt.vector3d(25, 0, 0)
         positionB: Qt.vector3d(-25, 0, 0)
     }

     PrismaticJoint {
         bodyA: shape2
         bodyB: shape3
         positionA: Qt.vector3d(25, 0, 0)
         positionB: Qt.vector3d(-25, 0, 0)
         stiffness: root.stiffness
         damping: root.damping
         lowerLimit: -20
         upperLimit: 0
     }

     FixedJoint {
         bodyA: shape3
         bodyB: sphere
         positionA: Qt.vector3d(25, 0, 0)
         positionB: Qt.vector3d(0, 0, 0)
     }

     // Neighboring links touch exactly at their joints, so each body ignores collisions
     // with its immediate neighbors to avoid fighting the joint with contact forces.
     DynamicRigidBody {
         id: shape0
         position: Qt.vector3d(25, 0, 0)
         filterGroup: 0
         filterIgnoreGroups: 0b00010
         collisionShapes: CapsuleShape {
             diameter: 10
             height: 40
         }
         Model {
             geometry: CapsuleGeometry {
                 diameter: 10
                 height: 40
             }
             materials: PrincipledMaterial {
                 baseColor: "blueviolet"
             }
         }
     }

     DynamicRigidBody {
         id: shape1
         position: Qt.vector3d(75, 0, 0)
         filterGroup: 1
         filterIgnoreGroups: 0b00101
         collisionShapes: CapsuleShape {
             diameter: 10
             height: 40
         }
         Model {
             geometry: CapsuleGeometry {
                 diameter: 10
                 height: 40
             }
             materials: PrincipledMaterial {
                 baseColor: "blueviolet"
             }
         }
     }

     DynamicRigidBody {
         id: shape2
         position: Qt.vector3d(125, 0, 0)
         filterGroup: 2
         filterIgnoreGroups: 0b01010
         collisionShapes: CapsuleShape {
             diameter: 10
             height: 40
         }
         Model {
             geometry: CapsuleGeometry {
                 diameter: 10
                 height: 40
             }
             materials: PrincipledMaterial {
                 baseColor: "blueviolet"
             }
         }
     }

     DynamicRigidBody {
         id: shape3
         position: Qt.vector3d(175, 0, 0)
         filterGroup: 3
         filterIgnoreGroups: 0b10100
         collisionShapes: CapsuleShape {
             diameter: 10
             height: 40
         }
         Model {
             geometry: CapsuleGeometry {
                 diameter: 10
                 height: 40
             }
             materials: PrincipledMaterial {
                 baseColor: "blueviolet"
             }
         }
     }

     DynamicRigidBody {
         id: sphere
         position: Qt.vector3d(200, 0, 0)
         scale: Qt.vector3d(0.5, 0.5, 0.5)
         filterGroup: 4
         filterIgnoreGroups: 0b01000
         collisionShapes: SphereShape {}

         Model {
             source: "#Sphere"
             materials: PrincipledMaterial {
                 baseColor: "blueviolet"
             }
         }
     }
 }