Qt Quick 3D - Exemple d'éléments rapides
Démonstration de l'utilisation des éléments Qt Quick dans une scène 3D rapide.

Cet exemple illustre l'utilisation des éléments 2D deQt Quick dans une scène 3D rapide.
Éléments rapides dans une scène 3D rapide
Qt Quick Les Itemen 2D, ainsi que tous leurs éléments enfants, peuvent être ajoutés dans des scènes 3D rapides. Lors de l'utilisation des types Qt Quick dans la scène 3D, il convient de noter quelques points :
- Lorsqu'un Item se trouve à l'intérieur d'un Node, son coin supérieur gauche est placé à l'origine du nœud. Cela signifie que l'élément devra souvent spécifier
anchors.centerIn: parentpour s'assurer que l'origine de Node correspond au point central de Item. - Les transformations 3D sont héritées du parent Node. Si plusieurs
Itemdoivent être affectés par la même transformation, ces éléments peuvent être regroupés sous un parent commun Item sous Node. - Dans Qt 6.0, les éléments ne reçoivent pas d'événements de toucher/souris, par exemple avec
MouseArea, ils doivent donc être non interactifs. - Les éléments rapides ne sont pas affectés par les lumières et les ombres.
- Clipping Il convient d'éviter de se fier à ces éléments et de ne pas les utiliser.
Contrairement aux versions antérieures de Qt et à d'autres approches d'intégration 2D dans 3D, l'association d'un élément Qt Quick à un nœud 3D Qt Quick n'implique pas la création d'une texture, le rendu du contenu 2D, puis le dessin d'un quad texturé. Qt 6.0 prend plutôt en charge le rendu du contenu 2D dans la même passe de rendu que la scène 3D. Dans la pratique, cela peut se traduire par une amélioration considérable des performances. Cela ne s'applique pas lorsque l'élément doit être rendu en utilisant une cible de rendu supplémentaire par conception, par exemple parce que layer.enabled est défini sur true, ou parce qu'il s'agit d'un ShaderEffectSource.
La scène de test
Les parties importantes de cet exemple sont le contenu de la scène de l'élément View3D.
Nous commençons par ajouter le calque le plus éloigné de la caméra. Cette couche contient les éléments Rectangle, Text et Image. Pour s'assurer que les éléments de la couche sont positionnés correctement, ils sont regroupés sous un parent commun Item. Notez que tout le contenu est découpé à l'intérieur de l'élément racine et qu'il doit donc être dimensionné de manière appropriée.
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" } } }
Ensuite, Node et ses éléments sont positionnés un peu plus près de la caméra. Il contient trois éléments Rectangle qui animent à la fois la position x et la rotation. Notez que les animations sont effectuées sur le parent Node alors que le contenu du Quick Item reste statique. Du point de vue des performances, il s'agit d'une bonne approche pour les éléments plus complexes.
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 } } }
Le troisième calque d'élément de cet exemple contient un seul élément Text avec une animation d'opacité. L'élément Texte est automatiquement centré sur le parent Node.
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 } } } }
Pour visualiser l'ordre z des calques d'éléments rapides ci-dessus, nous allons également configurer un modèle pour la boule de démolition 3D. Il anime la rotation autour du sommet Node, ce qui permet à la sphère de se déplacer à travers les autres calques.
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: PrincipledMaterial { baseColor: Qt.rgba(0.9, 0.9, 0.9, 1.0) } } Model { source: "#Sphere" y: -700 scale: Qt.vector3d(2, 2, 2) materials: PrincipledMaterial { baseColor: Qt.rgba(0.4, 0.4, 0.4, 1.0) } } }
Voir aussi Qt Quick Scènes 3D avec du contenu 2D.
© 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.