Qt Quick 3D - Quick Items Beispiel
Demonstriert die Verwendung von Qt Quick Items in der Quick 3D-Szene.
Dieses Beispiel demonstriert die Verwendung von Qt Quick 2D-Elementen in der Quick 3D-Szene.
Quick Items in einer Quick 3D-Szene
Qt Quick 2D-Elemente Itemkönnen zusammen mit allen untergeordneten Elementen in Quick 3D-Szenen eingefügt werden. Bei der Verwendung von Qt Quick Typen in der 3D-Szene gibt es einige Dinge zu beachten:
- Wenn sich ein Item innerhalb eines Node befindet, wird seine obere linke Ecke auf den Ursprung des Knotens gelegt. Dies bedeutet, dass das Element oft
anchors.centerIn: parent
angeben möchte, um sicherzustellen, dass der Ursprung von Node dem Mittelpunkt von Item dient. - 3D-Transformationen werden von der übergeordneten Node geerbt. Wenn mehr als ein
Item
von der gleichen Transformation betroffen sein soll, dann können diese Elemente unter einem gemeinsamen übergeordneten Item unter Node gruppiert werden. - In Qt 6.0 erhalten Elemente keine Berührungs-/Maus-Ereignisse, z.B. mit
MouseArea
, so dass sie nicht interaktiv sein sollten. - Quick Items werden nicht von Licht und Schatten beeinflusst.
- Clipping sollten vermieden werden und man sollte sich nicht auf sie verlassen.
Im Gegensatz zu früheren Qt-Versionen und anderen 2D-in-3D-Einbettungsansätzen bedeutet das Parenting eines Qt Quick -Elements an einen Qt Quick 3D -Knoten nicht, dass eine Textur erstellt, der 2D-Inhalt darauf gerendert und dann ein texturiertes Quadrat gezeichnet wird. Vielmehr unterstützt Qt 6.0 das Rendern des 2D-Inhalts im selben Renderdurchgang wie die 3D-Szene. Dies kann in der Praxis zu enormen Leistungsverbesserungen führen. Dies gilt nicht, wenn das Objekt mit einem zusätzlichen Rendering-Ziel gerendert werden soll, z.B. weil layer.enabled auf true gesetzt ist, oder weil es ein ShaderEffectSource ist.
Die Testszene
Die wichtigen Teile dieses Beispiels sind der Szeneninhalt des Elements View3D
.
Wir beginnen mit dem Hinzufügen der Ebene, die am weitesten von der Kamera entfernt ist. Diese Ebene enthält die Elemente Rectangle
, Text
und Image
. Um sicherzustellen, dass die Elemente in der Ebene richtig positioniert sind, werden sie unter einem gemeinsamen übergeordneten Element Item
gruppiert. Beachten Sie, dass der gesamte Inhalt innerhalb dieses Stammelements beschnitten wird, so dass es in der richtigen Größe angezeigt werden muss.
Node { position: Qt.vector3d(0, 100, -120) Item { width: 400 height: 400 anchors.centerIn: parent Rectangle { anchors.fill: parent opacity: 0.4 color: "#202020" radius: 10 border.width: 2 border.color: "#f0f0f0" } Text { anchors.top: parent.top anchors.topMargin: 10 anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: 20 color: "#e0e0e0" style: Text.Raised text: qsTr("Background Item") } Image { anchors.centerIn: parent source: "Built_with_Qt_RGB_logo_vertical" } } }
Als nächstes werden Node
und seine Elemente etwas näher an der Kamera positioniert. Es enthält drei Rectangle
Elemente, die sowohl die x-Position als auch die Drehung animieren. Beachten Sie, dass die Animationen auf dem übergeordneten Node
ausgeführt werden, während der Inhalt der Quick Item
statisch bleibt. Aus Sicht der Leistung ist dies ein guter Ansatz für komplexere Elemente.
Node { position: Qt.vector3d(0, 150, 100) SequentialAnimation on x { loops: Animation.Infinite NumberAnimation { to: -200 duration: 1500 easing.type: Easing.InOutQuad } NumberAnimation { to: 200 duration: 1500 easing.type: Easing.InOutQuad } } NumberAnimation on eulerRotation.z { loops: Animation.Infinite from: 0 to: 360 duration: 4000 easing.type: Easing.InOutBack } Item { width: 400 height: 400 anchors.centerIn: parent // This allows rendering into offscreen surface and caching it. layer.enabled: true Rectangle { x: 150 y: 100 width: 100 height: 100 radius: 50 color: "#80808020" border.color: "black" border.width: 2 } Rectangle { x: 90 y: 200 width: 100 height: 100 radius: 50 color: "#80808020" border.color: "black" border.width: 2 } Rectangle { x: 210 y: 200 width: 100 height: 100 radius: 50 color: "#80808020" border.color: "black" border.width: 2 } } }
Die dritte Elementebene dieses Beispiels enthält ein einzelnes Element Text
mit einer Deckkraftanimation. Das Element Text wird automatisch in der übergeordneten Ebene Node
zentriert.
Node { position: Qt.vector3d(0, 80, 250) Text { anchors.centerIn: parent width: 300 wrapMode: Text.WordWrap horizontalAlignment: Text.AlignJustify font.pixelSize: 14 color: "#e0e0e0" style: Text.Raised text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " + "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim " + "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea " + "commodo consequat." SequentialAnimation on opacity { loops: Animation.Infinite NumberAnimation { to: 0 duration: 1500 easing.type: Easing.InOutQuad } NumberAnimation { to: 1 duration: 1500 easing.type: Easing.InOutQuad } } } }
Um die z-Anordnung der obigen Quick Item-Ebenen zu visualisieren, werden wir auch ein Modell für die 3D-Abrissbirne erstellen. Es animiert die Rotation um die obere Node
, wodurch sich die Kugel durch die anderen Ebenen bewegt.
Node { position: Qt.vector3d(0, 800, 0) SequentialAnimation on eulerRotation.x { loops: Animation.Infinite NumberAnimation { to: 20 duration: 3500 easing.type: Easing.InOutQuad } NumberAnimation { to: -20 duration: 3500 easing.type: Easing.InOutQuad } } Model { source: "#Cylinder" y: -300 scale: Qt.vector3d(0.1, 6.1, 0.1) materials: DefaultMaterial { diffuseColor: Qt.rgba(0.9, 0.9, 0.9, 1.0) } } Model { source: "#Sphere" y: -700 scale: Qt.vector3d(2, 2, 2) materials: DefaultMaterial { diffuseColor: Qt.rgba(0.4, 0.4, 0.4, 1.0) } } }
Siehe auch Qt Quick 3D Scenes with 2D Content.
© 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.