Auf dieser Seite

Qt Quick 3D Physik – Einfaches Beispiel

Veranschaulicht die Einrichtung einer einfachen Physikszene.

Screenshot einer grünen Landschaft mit drei verschiedenen 3D-Objekten nebeneinander

Dieses Beispiel bietet einen einführenden Überblick über die grundlegenden Funktionen von „Quick 3D Physics“, indem es den Code eines einfachen Beispiels durchgeht. Beachten Sie, dass diese Einführung Kenntnisse des Moduls „ Qt Quick 3D “ voraussetzt.

Einrichtung

Das gesamte Beispiel ist in der Datei „main.qml“ enthalten und dort eingerichtet. Schauen wir uns zunächst das Objekt an, das die physikalische Welt erstellt. Dieser Knoten heißt „ PhysicsWorld “:

PhysicsWorld {
    scene: viewport.scene
}

Wir setzen die Eigenschaft „ scene “ auf die Szene unseres „ View3D “. Die Eigenschaft „ scene “ legt fest, wo die Simulation nach zu simulierenden Physik-Knoten sucht. Alle Physik-Knoten, die außerhalb des Szenen-Knotens platziert sind, werden nicht in die Simulation einbezogen.

Szene

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: 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"
            }
        }
    }
}

Unsere Szene besteht lediglich aus einem „ View3D “, da wir unsere physikalischen Objekte darstellen möchten. Sie enthält einen „ PerspectiveCamera “- und einen „ DirectionalLight “-Knoten für das Rendering, vor allem aber einen „ StaticRigidBody “-Knoten und drei „ DynamicRigidBody “-Knoten. In der Physik ist ein starrer Körper ein nicht verformbarer, fester Körper mit gleichmäßiger Dichte. Es stehen zwei Arten von starren Körpern zur Verfügung: „ StaticRigidBody “ und „ DynamicRigidBody “. Ein „ StaticRigidBody “ ist ein QML-Knoten, der einen statischen (unbeweglichen) starren Körper enthält. Es ist technisch möglich, den Körper zu bewegen, was jedoch zu Leistungseinbußen führt. Ein „ DynamicRigidBody “ hingegen wird für Objekte verwendet, die sich bewegen können. Ein „ DynamicRigidBody “ verfügt über die Eigenschaft „ isKinematic “; wenn diese auf „true“ gesetzt ist, wird der starre Körper nicht von äußeren Kräften beeinflusst und kann über Skripte und Animationen gesteuert werden. Ein Fußball wäre beispielsweise nicht kinematisch, ein Aufzug oder eine bewegliche Plattform hingegen typischerweise schon. Das bedeutet auch: Wenn Sie die Eigenschaft „ position “ des Fußballs aktualisieren, würde er sich nicht an diese Position bewegen, während sich der Aufzug sehr wohl dorthin bewegen würde.

Um mit anderen physikalischen Objekten interagieren zu können, muss die Eigenschaft „ collisionShapes “ gesetzt werden. Die Eigenschaft „ collisionShapes “ ist eine Liste, die eine oder mehrere Formen enthalten kann und als eine einzige, zusammenhängende starre Einheit fungiert. Sie können diese Formen relativ zueinander positionieren und drehen. Beachten Sie, dass die Formen „Ebene“, „Dreiecksgitter“ und „Höhenkarte“ nur mit dynamischen Körpern funktionieren, wenn der Körper kinematisch ist.

Formen

Unsere Szene enthält vier physikalische Objekte (Ebene, Kasten, Kugel, Kapsel). Wir werden sie nacheinander durchgehen.

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: PrincipledMaterial {
            baseColor: "green"
        }
        castsShadows: false
        receivesShadows: true
    }
}

Wir erstellen eine Ebene, indem wir einen „ StaticRigidBody “-Knoten anlegen. In diesem Knoten setzen wir die Eigenschaft „ collisionShapes “ so, dass sie ein „ PlaneShape “ enthält. Ebenen unterteilen den Raum in einen Bereich „oberhalb“ und einen Bereich „unterhalb“ der Ebene. Alles, was sich „unterhalb“ der Ebene befindet, kollidiert mit ihr und wird darüber geschoben. Die Ebene liegt auf der YZ-Ebene, wobei „oberhalb“ in Richtung der positiven X-Achse zeigt. Wir fügen ein Modell in unseren „ StaticRigidBody “-Knoten ein, um die Ebene darzustellen. Dies ist ein gängiges Muster, das sicherstellt, dass sich das Modell auch auf dieselbe Weise bewegt und dreht, wenn das physikalische Objekt in der Szene interagiert. Da die Ebene auf der XY-Ebene liegen soll, drehen wir sie mithilfe der Eigenschaft „ eulerRotation “. Das Modell drehen wir 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 “-Knoten unter „ collisionShapes “ anlegen. Da es sich um einen dynamischen Knoten handelt, interagiert der Würfel mit der Szene, indem er wie ein freies Objekt kollidiert und sich bewegt. Da das Würfelmodell hundertmal größer ist als ein Einheitswürfel, müssen wir es entsprechend skalieren. Da es sich um einen dynamischen Körper handelt, der somit ein physikalisches Gewicht besitzt, legen wir die Eigenschaft „ density “ fest.

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 “-Knoten unter „ collisionShapes “ anlegen.

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 ein einzelnes „ CapsuleShape “ in „ collisionShapes “ anlegen. Wir erstellen ein Kapselmodell mithilfe der integrierten „CapsuleGeometry“, die von „ Qt Quick 3D “ bereitgestellt wird.

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.