Sur cette page

Qt Quick 3D Physics - Exemple simple

Illustre la mise en place d'une scène physique simple.

Capture d'écran d'un paysage verdoyant avec trois objets 3D différents placés les uns à côté des autres

Cet exemple offre un aperçu introductif des fonctionnalités de base de Quick 3D Physics à travers l'analyse du code d'un exemple simple. Notez que cette introduction suppose une connaissance préalable du module 3D d'Qt Quick.

Configuration

L'exemple complet est contenu et configuré dans le fichier main.qml. Examinons d'abord l'objet qui crée l'univers physique. Ce nœud s'appelle PhysicsWorld:

PhysicsWorld {
    scene: viewport.scene
}

Nous définissons la propriété ` scene ` sur la scène de notre ` View3D`. La propriété ` scene ` définit l’emplacement où la simulation recherchera les nœuds physiques à simuler. Tout nœud physique placé en dehors du nœud de scène ne fera pas partie de la simulation.

Scène

Jetons un œil à la scène.

View3D {
    id: viewport
    anchors.fill: parent

    environment: SceneEnvironment {
        clearColor: "#d6dbdf"
        backgroundMode: SceneEnvironment.Color
    }

    PerspectiveCamera {
        position: Qt.vector3d(-200, 100, 500)
        eulerRotation: Qt.vector3d(-20, -20, 0)
        clipFar: 5000
        clipNear: 1
    }

    DirectionalLight {
        eulerRotation.x: -45
        eulerRotation.y: 45
        castsShadow: true
        brightness: 1
        shadowFactor: 50
    }

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

    DynamicRigidBody {
        position: Qt.vector3d(-100, 100, 0)
        collisionShapes: BoxShape {
            id: boxShape
        }
        Model {
            source: "#Cube"
            materials: PrincipledMaterial {
                baseColor: "yellow"
            }
        }
    }

    DynamicRigidBody {
        position: Qt.vector3d(0, 100, 0)
        collisionShapes: SphereShape {
            id: sphereShape
        }
        Model {
            source: "#Sphere"
            materials: PrincipledMaterial {
                baseColor: "blue"
            }
        }
    }

    DynamicRigidBody {
        position: Qt.vector3d(75, 200, 0)
        collisionShapes: CapsuleShape {
            id: capsuleShape
        }

        Model {
            geometry: CapsuleGeometry {}
            materials: PrincipledMaterial {
                baseColor: "red"
            }
        }
    }
}

Notre scène est simplement un nœud « View3D », puisque nous souhaitons dessiner nos objets physiques. Elle contient un nœud « PerspectiveCamera » et un nœud « DirectionalLight » pour le rendu, mais surtout un nœud « StaticRigidBody » et trois nœuds « DynamicRigidBody ». En physique, un corps rigide est un corps solide, non déformable, de densité uniforme. Deux types de corps rigides sont disponibles : StaticRigidBody et DynamicRigidBody. Un StaticRigidBody est un nœud QML contenant un corps rigide statique (immobile). Il est techniquement possible de déplacer ce corps, mais cela entraîne une perte de performances. Un DynamicRigidBody, quant à lui, est utilisé pour les objets capables de se déplacer. Un « DynamicRigidBody » dispose d’une propriété « isKinematic » : lorsqu’elle est définie sur « true », le corps rigide n’est pas influencé par les forces externes et peut être contrôlé à partir de scripts et d’animations. Par exemple, un ballon de football ne serait pas « kinematic », contrairement à un ascenseur ou à une plate-forme mobile. Cela signifie également que si vous mettez à jour la propriété « position » du ballon de football, celui-ci ne se déplacera pas vers cette position, contrairement à l’ascenseur.

Pour pouvoir interagir avec d’autres objets physiques, la propriété « collisionShapes » doit être définie. La propriété « collisionShapes » est une liste pouvant contenir une ou plusieurs formes et agira comme une seule unité rigide combinée. Vous pouvez positionner et faire pivoter ces formes les unes par rapport aux autres. Notez que les formes « plane », « triangle mesh » et « heightmap » ne fonctionnent avec des corps dynamiques que si le corps est cinématique.

Formes

Notre scène contient quatre objets physiques (plan, boîte, balle, capsule). Nous allons les passer en revue un par un.

Plan
StaticRigidBody {
    position: Qt.vector3d(0, -100, 0)
    eulerRotation: Qt.vector3d(-90, 0, 0)
    collisionShapes: PlaneShape {}
    Model {
        source: "#Rectangle"
        scale: Qt.vector3d(10, 10, 1)
        materials: PrincipledMaterial {
            baseColor: "green"
        }
        castsShadows: false
        receivesShadows: true
    }
}

Nous créons un plan en créant un nœud « StaticRigidBody ». Dans ce nœud, nous configurons la propriété « collisionShapes » pour qu’elle contienne un « PlaneShape ». Les plans divisent l’espace en deux parties : « au-dessus » et « en dessous » d’eux. Tout ce qui se trouve « en dessous » du plan entrera en collision avec celui-ci et sera repoussé au-dessus. Le plan se trouve sur le plan YZ, la partie « au-dessus » étant orientée vers l’axe X positif. Nous plaçons un modèle à l’intérieur de notre nœud « StaticRigidBody » pour afficher le plan. Il s’agit d’un modèle courant qui garantit que le modèle se déplace et pivote de la même manière lorsque l’objet physique interagit dans la scène. Comme nous voulons que le plan repose sur le plan XY, nous le faisons pivoter à l’aide de la propriété « eulerRotation ». Nous faisons pivoter le modèle de la même manière.

Boîte
DynamicRigidBody {
    position: Qt.vector3d(-100, 100, 0)
    collisionShapes: BoxShape {
        id: boxShape
    }
    Model {
        source: "#Cube"
        materials: PrincipledMaterial {
            baseColor: "yellow"
        }
    }
}

Nous créons une sphère en créant un nœud « DynamicRigidBody » et un seul « BoxShape » dans « collisionShapes ». Comme il s'agit d'un nœud dynamique, la boîte interagira avec la scène en entrant en collision et en se déplaçant comme un objet libre. Le modèle du cube étant cent fois plus grand qu'un cube unitaire, nous devons le mettre à l'échelle en conséquence. Comme il s'agit d'un corps dynamique et qu'il possède donc un poids physique, nous définissons la propriété « density ».

Sphère
DynamicRigidBody {
    position: Qt.vector3d(0, 100, 0)
    collisionShapes: SphereShape {
        id: sphereShape
    }
    Model {
        source: "#Sphere"
        materials: PrincipledMaterial {
            baseColor: "blue"
        }
    }
}

Nous créons une sphère en créant un nœud « DynamicRigidBody » et un seul « SphereShape » dans collisionShapes.

Capsule
DynamicRigidBody {
    position: Qt.vector3d(75, 200, 0)
    collisionShapes: CapsuleShape {
        id: capsuleShape
    }

    Model {
        geometry: CapsuleGeometry {}
        materials: PrincipledMaterial {
            baseColor: "red"
        }
    }
}

Nous créons une capsule en créant un nœud « DynamicRigidBody » et un seul « CapsuleShape » dans « collisionShapes ». Nous construisons un modèle de capsule à l’aide de la fonction intégrée « CapsuleGeometry » fournie par « Qt Quick 3D ».

Fichiers :

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.