Qt Quick 3D Physics - Einfaches Beispiel
Demonstriert das Einrichten einer einfachen Physikszene.
Dieses Beispiel gibt einen einführenden Überblick über die grundlegenden Quick 3D Physics-Funktionen, indem es den Code eines einfachen Beispiels durchgeht. Beachten Sie, dass diese Einführung eine Vertrautheit mit dem Modul Qt Quick 3D voraussetzt.
Einrichtung
Das gesamte Beispiel ist in der Datei main.qml enthalten und wird dort eingerichtet. Schauen wir uns zunächst das Objekt an, das die physikalische Welt erzeugt. Dieser Knoten heißt PhysicsWorld:
PhysicsWorld { scene: viewport.scene }
Wir setzen die Eigenschaft scene auf die Szene unseres View3D. Die Eigenschaft scene
definiert, wo die Simulation nach zu simulierenden Physikknoten sucht. Alle Physikknoten, die sich außerhalb des Szeneknotens befinden, werden nicht in die Simulation einbezogen.
Schauplatz
Werfen wir einen Blick auf die Szene.
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: DefaultMaterial { diffuseColor: "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" } } } }
Unsere Szene ist nur eine View3D, da wir unsere physikalischen Objekte zeichnen wollen. Sie enthält einen PerspectiveCamera und einen DirectionalLight für das Rendering, aber vor allem enthält sie einen StaticRigidBody und drei DynamicRigidBody Knoten. In der Physik ist ein starrer Körper ein nicht verformbarer, fester Körper mit einheitlicher Dichte. Wir haben zwei Arten von Starrkörpern zur Verfügung: StaticRigidBody und DynamicRigidBody. Ein StaticRigidBody ist ein QML-Knoten, der einen statischen (unbeweglichen) Starrkörper enthält. Es ist technisch möglich, den Körper zu verschieben, was jedoch mit Leistungseinbußen verbunden ist. Ein DynamicRigidBody hingegen wird für Objekte verwendet, die sich bewegen können. Ein DynamicRigidBody hat die Eigenschaft isKinematic. Wenn sie auf true gesetzt ist, wird der Starrkörper nicht von externen Kräften beeinflusst und kann von Skripten und Animationen gesteuert werden. Ein Fußball zum Beispiel wäre nicht kinematisch, ein Aufzug oder eine bewegliche Plattform hingegen schon. Das bedeutet auch, dass sich der Fußball bei einer Aktualisierung der Eigenschaft position
nicht in diese Position bewegt, während der Aufzug dies tut.
Um mit anderen physischen Objekten interagieren zu können, muss die Eigenschaft collisionShapes gesetzt werden. Bei der Eigenschaft collisionShapes handelt es sich um eine Liste, die eine oder mehrere Formen enthalten kann, die zusammen als eine starre Einheit fungieren. Sie können diese Formen im Verhältnis zueinander positionieren und rotieren. Beachten Sie, dass die Formen Ebene, Dreiecksnetz und Höhenkarte nur mit dynamischen Körpern funktionieren, wenn der Körper kinematisch ist.
Formen
Unsere Szene enthält vier physische Objekte (Ebene, Kasten, Kugel, Kapsel). Wir gehen sie der Reihe nach durch.
Ebene
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: DefaultMaterial { diffuseColor: "green" } castsShadows: false receivesShadows: true } }
Wir erstellen eine Ebene, indem wir einen StaticRigidBody Knoten erstellen. In diesem Knoten stellen wir die Eigenschaft collisionShapes so ein, dass sie eine PlaneShape enthält. Ebenen teilen den Raum in "über" und "unter" ihnen. Alles, was sich "unterhalb" der Ebene befindet, kollidiert mit ihr und wird über sie geschoben. Die Ebene liegt auf der YZ-Ebene, wobei "oben" in Richtung des positiven X zeigt. Wir setzen ein Modell in unseren StaticRigidBody Knoten, um die Ebene zu rendern. Dies ist ein übliches Muster, das sicherstellt, dass sich das Modell auf dieselbe Weise bewegt und dreht, wenn das physische Objekt in der Szene interagiert. Da wir wollen, dass die Ebene auf der XY-Ebene liegt, rotieren wir sie mit der Eigenschaft eulerRotation
. Wir rotieren das Modell auf ähnliche Weise.
Kasten
DynamicRigidBody { position: Qt.vector3d(-100, 100, 0) collisionShapes: BoxShape { id: boxShape } Model { source: "#Cube" materials: PrincipledMaterial { baseColor: "yellow" } } }
Wir erstellen eine Kugel, indem wir einen DynamicRigidBody Knoten und einen einzelnen BoxShape in collisionShapes erstellen. Da dies ein dynamischer Knoten ist, interagiert die Box mit der Szene, indem sie kollidiert und sich wie ein freies Objekt bewegt. Da das Würfelmodell hundertmal größer als ein Einheitswürfel ist, müssen wir es entsprechend skalieren. Da es sich um einen dynamischen Körper handelt und er somit ein physisches Gewicht hat, setzen wir die Eigenschaft density.
Kugel
DynamicRigidBody { position: Qt.vector3d(0, 100, 0) collisionShapes: SphereShape { id: sphereShape } Model { source: "#Sphere" materials: PrincipledMaterial { baseColor: "blue" } } }
Wir erstellen eine Kugel, indem wir einen DynamicRigidBody Knoten und einen einzelnen SphereShape in collisionShapes erstellen.
Kapsel
DynamicRigidBody { position: Qt.vector3d(75, 200, 0) collisionShapes: CapsuleShape { id: capsuleShape } Model { geometry: CapsuleGeometry {} materials: PrincipledMaterial { baseColor: "red" } } }
Wir erstellen eine Kapsel, indem wir einen DynamicRigidBody Knoten und einen einzelnen CapsuleShape in collisionShapes erstellen. Wir erstellen ein Kapselmodell unter Verwendung der eingebauten CapsuleGeometry, die von Qt Quick 3D Physics bereitgestellt wird.
Dateien:
© 2025 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.