Qt Quick 3D Physik – Beispiel „Impeller“
Veranschaulicht die Verwendung von Trigger-Körpern und Kollisionsinformationen.

Dieses Beispiel veranschaulicht die Verwendung von Triggerkörpern und Kollisionsinformationen. Die Szene besteht aus einer grünen statischen Ebene, einer roten dynamischen Kugel, einem rosa Box-Trigger und einer blauen statischen Kugel. Wenn sich die rote Kugel mit dem Triggerkörper überschneidet, färbt sie sich gelb, und wenn sie mit der blauen Kugel kollidiert, wird sie abgestoßen.
Einrichtung
Wie üblich müssen wir unsere „ PhysicsWorld “ hinzufügen:
PhysicsWorld {
gravity: Qt.vector3d(0, -490, 0)
scene: viewport.scene
}Außerdem fügen wir einen „ View3D “ hinzu, in den wir unsere Szenenobjekte platzieren. Darin nehmen wir einige Einstellungen für die visuelle Umgebung vor:
environment: SceneEnvironment {
clearColor: "#d6dbdf"
backgroundMode: SceneEnvironment.Color
}
PerspectiveCamera {
position: Qt.vector3d(0, 200, 1000)
clipFar: 2000
clipNear: 1
}
DirectionalLight {
eulerRotation.x: -45
eulerRotation.y: 45
castsShadow: true
brightness: 1
shadowFactor: 50
}Physikalische Objekte
Wir haben unsere übliche statische Ebene:
StaticRigidBody {
position: Qt.vector3d(0, -100, 0)
eulerRotation: Qt.vector3d(-90, 0, 0)
collisionShapes: PlaneShape {}
Model {
source: "#Rectangle"
scale: Qt.vector3d(500, 500, 1)
materials: PrincipledMaterial {
baseColor: "green"
}
castsShadows: false
receivesShadows: true
}
}So wird unsere dynamische Kugel definiert:
DynamicRigidBody {
id: sphere
massMode: DynamicRigidBody.CustomDensity
density: 0.00001
position: Qt.vector3d(0, 600, 0)
property bool inArea: false
sendContactReports: true
receiveTriggerReports: true
onEnteredTriggerBody: {
inArea = true
}
onExitedTriggerBody: {
inArea = false
}
collisionShapes: SphereShape {}
Model {
source: "#Sphere"
materials: PrincipledMaterial {
baseColor: sphere.inArea ? "yellow" : "red"
}
}
}Die Eigenschaft „ inArea “ ist eine benutzerdefinierte Eigenschaft, mit der wir verfolgen, wann die Kugel den Box-Trigger-Körper überlappt. Diese wird dann für die Eigenschaft „ baseColor “ verwendet, um die Kugel gelb zu färben, wenn sie die Box überlappt, und andernfalls rot. Da die Kugel an der Kontaktmeldung teilnehmen soll, muss die Eigenschaft „ sendContactReports “ auf „ true “ gesetzt werden. Da die Kugel außerdem Callbacks erhalten soll, wenn sie einen „ TriggerBody “ betritt oder verlässt, wird die Eigenschaft „ receiveContactReports “ ebenfalls auf „ true “ gesetzt. Wir implementieren die Signalmethoden „ enteredTriggerBody “ und „ exitedTriggerBody “ für die Kugel, wobei wir die Eigenschaft „ inArea “ beim Betreten oder Verlassen des Triggerkörpers auf „ true “ bzw. „ false “ setzen.
Sehen wir uns nun den Triggerkörper an:
TriggerBody {
position: Qt.vector3d(0, 350, 0)
scale: Qt.vector3d(1, 2, 1)
collisionShapes: BoxShape {
id: boxShape
}
Model {
source: "#Cube"
materials: PrincipledMaterial {
baseColor: Qt.rgba(1, 0, 1, 0.2)
alphaMode: PrincipledMaterial.Blend
}
}
}Der QML-Typ ist ein „ TriggerBody “, der sich wie ein statischer Körper verhält, mit dem Unterschied, dass seine Kollisionen deaktiviert sind. Stattdessen löst er die Methodenaufrufe „ enteredTriggerBody “ und „ exitedTriggerBody “ auf der Kugel aus.
Schauen wir uns zum Schluss das Laufrad an:
StaticRigidBody {
position: Qt.vector3d(0, 0, 0)
scale: Qt.vector3d(2, 2, 2)
receiveContactReports: true
collisionShapes: SphereShape {}
Model {
source: "#Sphere"
materials: PrincipledMaterial {
baseColor: "blue"
}
}
onBodyContact: (body, positions, impulses, normals) => {
for (let normal of normals) {
let velocity = normal.times(-700)
if (body instanceof DynamicRigidBody) {
(body as DynamicRigidBody).setLinearVelocity(velocity)
}
}
}
}Dies ist ein statischer Körper, und wir setzen „ receiveContactReports “ auf „ true “, um die Kollisions-Callbacks zu aktivieren. Der Callback „ bodyContact “ wird immer dann aufgerufen, wenn eine Kollision gemeldet wird. In der Methode rufen wir „ setLinearVelocity “ auf, um die lineare Geschwindigkeit in die entgegengesetzte Richtung des Kollisionsnormalenvektors festzulegen und so ein Laufrad zu simulieren.
Dateien:
© 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.