Qt Quick Physique 3D - Exemple simple
Démonstration de la mise en place d'une scène physique simple.

Cet exemple donne un aperçu des fonctionnalités de base de Quick 3D Physics en parcourant le code d'un exemple simple. Notez que cette introduction suppose une certaine familiarité avec le module 3D de Qt Quick.
Configuration
L'ensemble de l'exemple est contenu et configuré dans le fichier main.qml. Examinons d'abord l'objet qui crée le monde physique. Ce nœud est appelé 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'endroit où la simulation cherchera 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 coup d'œ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 juste une View3D puisque nous voulons dessiner nos objets physiques. Elle contient un PerspectiveCamera et un DirectionalLight pour le rendu, mais surtout un StaticRigidBody et trois DynamicRigidBody. En physique, un corps rigide est un corps solide indéformable de densité uniforme. Nous disposons de deux types de corps rigides : StaticRigidBody et DynamicRigidBody. Un nœud StaticRigidBody est un nœud QML qui contient un corps rigide statique (immobile). Il est techniquement possible de déplacer le corps, mais les performances en seront affectées. Le nœud DynamicRigidBody, quant à lui, est utilisé pour les objets qui peuvent se déplacer. Un DynamicRigidBody a une propriété isKinematic, lorsqu'elle est définie comme vraie, 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 cinématique, mais un ascenseur ou une plate-forme mobile le serait. Cela signifie également que si vous mettez à jour la propriété position du ballon de football, il ne se déplacera pas jusqu'à cette position, alors que l'ascenseur le fera.
Pour pouvoir interagir avec d'autres objets physiques, la propriété collisionShapes doit être définie. La propriété collisionShapes est une liste qui peut contenir une ou plusieurs formes et qui agira comme une unité rigide combinée. Vous pouvez positionner et faire pivoter ces formes les unes par rapport aux autres. Notez que les formes de type plan, maillage triangulaire et heightmap ne fonctionnent avec les corps dynamiques que si le corps est cinématique.
Les formes
Notre scène contient quatre objets physiques (plan, boîte, balle, capsule). Nous allons les passer en revue un par un.
L'avion
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 définissons la propriété collisionShapes pour qu'elle contienne un nœud PlaneShape. Les plans divisent l'espace en "au-dessus" et "au-dessous" d'eux. Tout ce qui se trouve "en dessous" du plan entrera en collision avec lui et sera poussé au-dessus. Le plan se trouve sur le plan YZ, le "dessus" pointant vers le X positif. Nous plaçons un modèle à l'intérieur de notre nœud StaticRigidBody pour effectuer le rendu du plan. Il s'agit d'un schéma 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 soit situé 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 de 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 a 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 en utilisant la CapsuleGeometry intégrée 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.