Portierung von Qt 3D auf Qt Quick 3D: Ein Migrationsleitfaden

Dieser Leitfaden richtet sich an Entwickler, die derzeit mit Qt 3D verwenden und zu Qt Quick 3D migrieren möchten.

Unterschiede zwischen den Bereichen

Während Qt 3D und Qt Quick 3D auf den ersten Blick ähnlich erscheinen, da beide 3D-APIs bereitstellen, wurden sie mit grundlegend unterschiedlichen Ansätzen entwickelt.

Qt 3D 3D ist eine flexible API für die Implementierung benutzerdefinierter 3D-Renderer und bietet Low-Level-Abstraktionen für die verschiedenen Aspekte des Rendering-Prozesses. Infolgedessen bietet Qt 3D APIs für C++ und QML.

Im Gegensatz dazu ist Qt Quick 3D eine High-Level-API, die sich auf das Rendering von 3D-Inhalten konzentriert und als Erweiterung von Qt Quick entwickelt wurde. Folglich sind die meisten ihrer APIs QML-basiert. Wenn Ihre derzeitige Qt 3D Anwendung stark auf C++ basiert, erfordert die Migration zu Qt Quick 3D daher den Übergang zu QML.

Architektonische Unterschiede

Qt 3D und Qt Quick 3D unterscheiden sich erheblich in ihrer Architektur. Qt Quick 3D folgt denselben Entwurfsmustern wie Qt Quick und erweitert dessen Fähigkeiten um die Unterstützung von 3D-Rendering.

Der erste große Unterschied liegt in der Verwendung von Entwurfsmustern. Qt 3D verwendet ein Entity-Component System (ECS) Muster. In diesem System wird eine generische Entitätsklasse verwendet, die durch Hinzufügen verschiedener Komponenten zu der Entität spezialisiert werden kann, wobei ein Kompositionsmuster verwendet wird. Im Gegensatz dazu verwendet Qt Quick 3D eine auf Vererbung basierende API, die sich an das breitere Qt-Framework anlehnt, wobei spezialisierte Knoten Unterklassen einer gemeinsamen Basisklasse sind. Aufgrund dieser grundlegenden Unterschiede gibt es keine direkte 1:1-Abbildung zwischen den beiden APIs.

Ein weiterer signifikanter Unterschied liegt in den Threading-Modellen. Qt 3D führt das Konzept der Aspekte ein, die verschiedene Einstiegspunkte für verschiedene Arten von Komponenten bieten, die mit Entitäten verbunden sind. Jeder Aspekt kann Aufgaben erstellen, die von einem Thread-Pool verarbeitet werden, der einem Baum von Anbietern und Abhängigkeiten folgt, um alle für das Rendern eines Frames erforderlichen Arbeiten abzuschließen. Auf der anderen Seite verwendet Qt Quick 3D das gleiche Threading-Modell wie Qt Quick. Es verfügt über eine Frontend-API, auf die vom Haupt-GUI-Thread aus zugegriffen werden kann, um den Zustand der Szene zu verwalten, und eine Backend-API auf dem Render-Thread. Während der Render-Thread zusätzliche Threads für bestimmte Aufgaben verwenden kann, umfasst das konzeptionelle Modell aus der Sicht des Benutzers nur zwei Threads. Es gibt kein eigenes Konzept von Aspekten in Qt Quick 3D, obwohl ein Großteil der Funktionalität der Aspekte von Qt 3D weiterhin verfügbar ist.

Aus der Rendering-Perspektive bietet Qt 3D einen hochgradig anpassbaren Ansatz, der die Erstellung von maßgeschneiderten Rendering-Pipelines ermöglicht. Diese Flexibilität geht jedoch mit einer gewissen Komplexität einher: Qt 3D bietet standardmäßig keine vorkonfigurierte Rendering-Pipeline. Im Gegensatz dazu ist Qt Quick 3D benutzerfreundlicher gestaltet und bietet eine sofort einsatzbereite Rendering-Pipeline, die sich automatisch an die Anforderungen der Szene anpasst. Wenn zum Beispiel ein gerichtetes Licht in Qt Quick 3D so eingestellt ist, dass es Schatten wirft, wird die Rendering-Pipeline automatisch eine Schattenkarte erzeugen, die dann von den Materialien in der Szene verwendet wird. In Qt 3D würde eine solche Funktionalität eine manuelle Konfiguration des Framegraphen und eine Erweiterung der Materialien zur Unterstützung des Shadow Mapping Passes erfordern. Darüber hinaus wären für verschiedene Lichttypen, wie Punkt- oder Scheinwerfer, weitere Modifikationen des Framegraphen und der Materialdefinitionen erforderlich. Zwar bietet Qt 3D leistungsstarke Anpassungsoptionen für Schatten-Mapping-Techniken, doch kann dies zu einem erheblichen Mehraufwand im Vergleich zu Qt Quick 3D führen, wo die Aktivierung von Schatten so einfach ist wie das Einstellen einer einzelnen Eigenschaft für ein Licht.

Details pro Modul

Qt 3D Kernmodul

Das Modul Qt 3D Core stellt die grundlegenden Primitive zur Verfügung, auf denen die anderen Module von Qt 3D aufbauen. Die meisten Klassen in Qt 3D Core haben äquivalente Komponenten in Qt Quick 3D, mit Ausnahme der Klassen, die speziell die Entity-Component-System (ECS) Architektur unterstützen. Qt Quick 3D bietet vorgefertigte Komponenten, die den in Qt 3D verwendeten Entity-Component-Kombinationen entsprechen, was den Entwicklungsprozess vereinfacht.

Als Beispiel ist dies der Aufbau für eine renderbare Entität in Qt3D:

PhongMaterial {
    id: material
}

TorusMesh {
    id: torusMesh
    radius: 5
    minorRadius: 1
    rings: 100
    slices: 20
}

Transform {
    id: torusTransform
    scale3D: Qt.vector3d(1.5, 1, 0.5)
    rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45)
}

Entity {
    id: torusEntity
    components: [ torusMesh, material, torusTransform ]
}

Im obigen Code ist zu sehen, dass das Entity aus einem Mesh, einem Material und einer Transformation besteht. In Qt Quick 3D würde der entsprechende Code wie folgt aussehen:

Model {
    id: torusModel
    scale: Qt.vector3d(1.5, 1, 0.5)
    eulerRotation.x: 45
    geometry: TorusGeometry {
        radius: 5
        tubeRadius: 1
        rings: 100
        segments: 20
    }
    materials: [
        PrincipledMaterial {
            id: material
    ]
}

In diesem Beispiel wird die Entität durch eine Model ersetzt, die eine Unterklasse der Node Komponente ist, die das Äquivalent der Transform Komponente von Qt 3D erbt. Zusätzlich wird jede Node Unterklasse Teil eines Szenegraphen, mit Eltern-Kind Beziehungen. Die Model-Komponente ist eine renderbare Entität, die eine Geometrie und Material(e) haben kann. In diesem Fall verwenden wir die Eigenschaft geometry, um der vom Code Qt 3D verwendeten prozeduralen API zu entsprechen, aber es ist auch möglich, die Geometrie aus einer statischen Datei mit der Eigenschaft source anzugeben. Die Eigenschaft materials der Komponente Model ist eine Liste von Materialien, die zur Schattierung der Geometrie verwendet werden sollen. Es handelt sich um eine Liste, da Geometrien mehrere Untergruppen enthalten können, von denen jede ein eigenes Material verwenden kann. Bei der Komponente PrincipledMaterial handelt es sich um ein PBR-Material (Physically Based Rendering), das den Metallic-Roughness-Workflow verwendet und im Falle dieses Beispiels das PhongMaterial ersetzt, das vom Snippet Qt 3D verwendet wird.

Qt 3D Eingabe

Qt 3D bietet eine Reihe von Eingabeklassen durch sein eigenes benutzerdefiniertes Eingabesystem. Im Gegensatz dazu verwendet Qt Quick 3D in erster Linie die Eingabeklassen von Qt Quick wieder. Für die Interaktion mit einer 3D-Szene bietet Qt Quick 3D zusätzliche APIs, um Ray Casting und Object Picking durchzuführen.

View3D ist die Hauptklasse für die Handhabung von Picking-Operationen in Qt Quick 3D und bietet sowohl explizite als auch implizite Picking-Methoden. Die explizite Picking-API ermöglicht es Ihnen, direkt aus dem 2D-Raum zu picken, indem Sie die x- und y-Koordinaten in der View3D angeben. Diese Operation gibt einen pickResult Wert zurück, der Details über das getroffene Objekt und die Trefferposition enthält. Die API ist synchron, d.h. das Ergebnis ist sofort nach dem Wurf des Strahls verfügbar. Außerdem ist es möglich, Strahlen von jedem beliebigen Punkt in der Szene aus zu werfen. Sowohl explizite als auch implizite Picking-Methoden können eine Liste aller Treffer zurückgeben, nicht nur den ersten.

import QtQuick
import QtQuick.Controls
import QtQuick3D

ApplicationWindow {
    width: 640
    height: 480
    visible: true

    View3D {
        id: view
        anchors.fill: parent

        PerspectiveCamera {
            z: 200
        }

        DirectionalLight {

        }

        PrincipledMaterial {
            id: material
            baseColor: "red"
        }
        PrincipledMaterial {
            id: selectedMaterial
            baseColor: "blue"
        }

        Model {
            id: sphereModel
            source: "#Sphere"
            pickable: true
            materials: [
                material
            ]
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: (mouse) => {
            let result = view.pick(mouse.x, mouse.y)
            if (result.hitType == PickResult.Model) {
                if (result.objectHit == sphereModel) {
                    // toggle selection
                    if (sphereModel.materials[0] == material)
                        sphereModel.materials[0] = selectedMaterial
                    else
                        sphereModel.materials[0] = material
                }
            } else {
                // deselect
                sphereModel.materials[0] = material
            }
        }
    }
}

In diesem Beispielcodeausschnitt wird eine einfache Szene mit einem Kugelmodell erstellt. Das Kugelmodell ist auf pickable eingestellt, was bedeutet, dass dieses Modell für das Picking berücksichtigt wird, wenn ein Strahl in die Szene geworfen wird. Über dem View3D befindet sich ein MouseArea, das auf Klicks wartet. Wenn ein Klick erkannt wird, wird die Methode pick mit den x- und y-Koordinaten des Klicks aufgerufen. Das Ergebnis der Pick-Operation wird dann verwendet, um festzustellen, ob das Kugelmodell getroffen wurde. Wenn ja, wird das Material des Kugelmodells zwischen den Materialien Rot und Blau umgeschaltet.

import QtQuick
import QtQuick.Controls
import QtQuick3D

ApplicationWindow {
    width: 640
    height: 480
    visible: true

    View3D {
        id: view
        anchors.fill: parent

        Node {
            eulerRotation.y: 45
            PerspectiveCamera {
                z: 200

            }
        }

        DirectionalLight {

        }

        Node {
            id: anchorItem
            Item {
                anchors.centerIn: parent
                width: 250
                height: 250
                Button {
                    anchors.centerIn: parent
                    text: "Click Me"
                }

            }
        }
    }
}

In diesem Beispielcodeausschnitt wird eine einfache Szene mit einer Button in der Mitte des Bildschirms erstellt. Die Schaltfläche ist ein 2D-Element, aber da ihr übergeordnetes Element ein Node ist, wird sie in den 3D-Raum projiziert. Mit solchen Komponenten kann auf die gleiche Weise interagiert werden wie im 2D-Raum. View3D sorgt automatisch dafür, dass Strahlen in die Szene geworfen und Eingabeereignisse an alle 2D-Elemente weitergeleitet werden, die Teil der Szene sind.

import QtQuick
import QtQuick.Controls
import QtQuick3D

ApplicationWindow {
    width: 640
    height: 480
    visible: true

    View3D {
        id: view
        anchors.fill: parent

        Node {
            eulerRotation.y: 25
            PerspectiveCamera {
                z: 200

            }
            DirectionalLight {

            }
        }

        Model {
            source: "#Cube"
            pickable: true
            materials: [
                PrincipledMaterial {
                    baseColorMap: Texture {
                        sourceItem: Pane {
                            width: 250
                            height: 250
                            Button {
                                anchors.centerIn: parent
                                text: "Click Me"
                            }
                        }
                    }
                }
            ]
        }
    }
}

In ähnlicher Weise wird im obigen Codeschnipsel ein Würfel Model mit einer Textur erstellt, bei der es sich um eine Pane handelt, die eine Button enthält. In diesem Fall wird eine 250x250 Pixel große Texture erstellt, indem eine Pane -Komponente gerendert wird, die eine Button enthält. Normalerweise wäre diese Textur nicht interaktiv, aber indem pickable auf der Model auf true gesetzt wird, wird derselbe implizite Picking-Mechanismus, der im vorherigen Beispiel Eingabeereignisse an die Button weitergeleitet hat, in diesem Beispiel zur Weiterleitung von Eingabeereignissen an die Button verwendet. Im Falle des Würfels Model wird nun jede Fläche des Würfels mit Button interaktiv sein.

Die meisten der Eingabeklassen in Qt 3D sind nicht direkt auf Qt Quick 3D übertragbar, so dass ein gewisser Portierungsaufwand erforderlich ist, aber der implizite Picking-Mechanismus in Qt Quick 3D macht es einfach, mit 2D-Elementen in einer 3D-Szene zu interagieren.

Qt 3D Logik

Das Modul Qt 3D Logic enthält eine einzelne Komponente, die einen Callback für jedes gerenderte Bild bereitstellt. In Qt Quick 3D ist der äquivalente Ansatz die Verwendung der FrameAnimation Komponente, einer allgemeinen Qt Quick Komponente, die Zeitinformationen und einen Callback-Mechanismus für jedes gerenderte Bild bereitstellt.

FrameAnimation {
    running: true
    onTriggered: {
        console.log(`currentFrame: ${currentFrame}, frameTime: ${frameTime}`)
    }
}

Diese Komponente kann überall in Ihrer Szene verwendet werden, auch als untergeordnetes Element eines Objekts, das bei jedem Frame eine Aktion ausführen soll.

Es ist jedoch zu beachten, dass dieses Muster nur benötigt wird, wenn Sie bei jedem Frame eine Aktion ausführen möchten. Während FrameAnimation es ermöglicht, das Polling-Verhalten in einigen Game-Engines nachzubilden, ist es auch möglich, die gleichen Ereignissteuerungsmuster in Qt Quick 3D wie in Qt Quick zu verwenden.

Qt 3D Rendern

Das Modul Qt 3D Render enthält die meisten der für das Rendering erforderlichen Klassen. In Qt Quick 3D werden die meisten der entsprechenden Funktionen als interne Implementierungsdetails bereitgestellt, die dem Benutzer nicht direkt zugänglich sind. Es gibt jedoch einige Klassen, die dem Benutzer als APIs zur Verfügung gestellt werden, die zur Erweiterung und Anpassung der Funktionalität von Qt Quick 3D verwendet werden können.

Geometrie

Geometrie- oder Netzdaten werden in Qt 3D durch die Klasse QGeometryRenderer oder die Komponente GeometryRenderer dargestellt. In Qt Quick 3D sind die Äquivalente die Klasse QQuick3DGeometry und die Komponente ProceduralMesh. In Qt 3D ist die Klasse QGeometryRenderer eine niedrigere Ebene und erwartet, dass der Benutzer die Scheitelpunkt-Attribut-Layouts als Teil der Geometriedaten bereitstellt. In Qt Quick 3D haben Sie die Kontrolle darüber, welche eingebauten Scheitelpunktattribute verwendet werden sollen, aber das Layout der Puffer wird intern als Implementierungsdetails behandelt.

Weitere Details dazu finden Sie im Qt Quick 3D Custom Geometry Example.

Texturen

Texturen werden in Qt 3D durch die Unterklassen von QAbstractTexture dargestellt. In Qt Quick 3D ist das Äquivalent die Komponente Texture, die die Frontend-Darstellung einer Textur und eines Samplers ist. Die von der Texturkomponente verwendeten Daten können jedoch aus verschiedenen Quellen stammen. Am einfachsten ist es, die Eigenschaft source auf eine Bilddatei zu setzen, die dann als Texturdaten auf die GPU hochgeladen wird. Es ist auch möglich, Texturdaten zur Laufzeit prozedural zu generieren, indem man entweder 2D-qml-Inhalte als Quelle verwendet, oder indem man QQuick3DTextureData unterklassifiziert oder die Komponente ProceduralTextureData verwendet. Mit diesen Typen können Sie Texturdaten durch Angabe von Größe, Format und Rohbilddaten spezifizieren. Es gibt auch die Möglichkeit, Texturen auf der GPU durch die Verwendung von render extensions zu erstellen.

Weitere Einzelheiten dazu finden Sie im Qt Quick 3D Procedural Texture Example.

Materialien

Während es in Qt 3D möglich war, einige eingebaute Materialien zu verwenden, waren Sie dabei auf die framegraphs beschränkt, mit denen sie arbeiten konnten. Qt Quick Bei 3D ist die Situation insofern ähnlich, als dass eine Auswahl an eingebauten Materialien zur Verfügung steht, die mit der internen Renderstrategie funktionieren. Sowohl für Qt 3D als auch für Qt Quick 3D ist es jedoch möglich, eigene Materialien zu erstellen.

In Qt 3D war dies ein ziemlich komplizierter Prozess, der einen Baum aus QMaterial, QEffect, QTechnique, QRenderPass und QShaderProgram umfasste. In Qt Quick 3D wurde dieser Prozess für Materialien auf eine einzige CustomMaterial Komponente vereinfacht. Mit dieser Komponente können Sie einen benutzerdefinierten Shader-Code für das Material angeben, und der Rest des Setups wird vom Renderer erledigt. Es gibt zwei Modi für CustomMaterial, schattiert und nicht schattiert. Im schattierten Modus können Sie mit der API für benutzerdefinierten Shader-Code den eingebauten PrincipledMaterial Shader anpassen, und im nicht schattierten Modus können Sie Ihren eigenen Shader-Code von Grund auf neu schreiben. In beiden Fällen ist die Shadersprache GLSL, mit einigen Qt-spezifischen Schlüsselworterweiterungen, um die Integration mit dem Rest der Qt Quick 3D API zu erleichtern.

Weitere Details dazu finden Sie in den Beispielen für den schattierten und den nicht schattierten Modus sowie in diesem Überblick über die Verwendung der benutzerdefinierten GLSL-Shader-Sprache von Qt Quick 3D.

Effekte

Aus der Sicht von Qt3D gibt es keinen Unterschied zwischen dem Rendern einer 3D-Szene und dem Rendern von Post-Processing-Effekten, und aus einer Low-Level-Perspektive ist das auch richtig. Es gibt jedoch eine Unterscheidung, die von Qt Quick 3D gemacht wird. Models Teil einer 3D-Szene wird eine Liste von materials enthalten, und diese werden während der Hauptdurchläufe gerendert. Das Ergebnis dieser Hauptdurchläufe ist der 3D-Inhalt, der entweder direkt auf eine Fensteroberfläche oder eine Textur gerendert wird. Effects unterscheidet sich insofern von Qt Quick 3D, als sie sich auf Nachbearbeitungseffekte beziehen, bei denen jedes pass am Ende ein einzelnes Quad ist, das das gesamte Renderingziel abdeckt. Die resultierende Textur des Hauptfarbdurchlaufs wird dann als Textur an den ersten Effektdurchlauf weitergegeben, und das Ergebnis dieses Durchlaufs wird dann als Textur an den nächsten Effect Durchlauf weitergegeben, und so weiter. Der letzte Durchgang wird dann an das Ausgaberenderziel, in der Regel die Fensteroberfläche, gerendert. Einige Effects erfordern buffers, die während der Hauptdurchläufe erstellt werden, wie die Tiefentextur, und andere erfordern Zwischenschritte, die alle mit den Effekt-APIs in Qt Quick 3D definiert werden können.

Qt Quick 3D ist auf diese Post-Processing-Effektkette mit APIs spezialisiert, die es Ihnen ermöglichen, so viele Render-Passes zu definieren, wie Sie benötigen, um den gewünschten Effekt zu erzielen.

Weitere Einzelheiten dazu finden Sie im Qt Quick 3D Post Processing Example.

Instanzpuffer

In Qt 3D ist die Verwendung von Instanzierung und Instanzpuffern recht einfach und hängt daher vom jeweiligen Anwendungsfall ab. In Qt Quick 3D haben die eingebauten Materialien einige feste Instanzierungseigenschaften, die eingestellt werden können, aber um dies zu tun, müssen Sie die Instanzdaten als Puffer bereitstellen. Es gibt mehrere Möglichkeiten, diese Daten bereitzustellen, und sobald sie bereitgestellt sind, müssen Sie nur noch die Eigenschaft instancing auf der Komponente Model einstellen, um die Instanzpufferdaten mit dem zu instanzierenden Material zu verknüpfen.

Weitere Einzelheiten finden Sie in diesem Artikel, der sich speziell mit der Instanzierung in Qt Quick 3D befasst.

Renderer-Erweiterungen

Der Zweck von Qt 3D ist es, eine leistungsstarke Möglichkeit zu bieten, eine benutzerdefinierte Rendering-Lösung für Ihre Anwendung zu definieren. Qt Quick 3D bietet diesen Grad der Anpassung nicht, da es einfach zu benutzen und nicht einfach anzupassen sein soll, aber es bietet einige Möglichkeiten, die Rendering-Pipeline zusätzlich zu den oben genannten Möglichkeiten zu erweitern. Dies geschieht durch die Implementierung von render extensions, die es Ihnen ermöglicht, dem Renderer benutzerdefinierte Render-Passes hinzuzufügen, die dieselben Daten wie der Renderer verwenden. Dies ist eine Low-Level-API, die ein gutes Verständnis der Qt Quick 3D-Rendering-Pipeline sowie der Qt Rendering Hardware Interface (RHI) API erfordert.

Ein Beispiel für diese Vorgehensweise finden Sie im Stencil Outline Extension Example

Qt 3D Extras

Das Modul Qt 3D Extras bietet verschiedene Hilfsprogramme, die eine "Out-of-the-Box"-Erfahrung erleichtern, z. B. Materialien, Geometriegeneratoren und Kamerasteuerungen. Es enthält auch einen Framegraphen für den Forward Renderer. In Qt Quick 3D müssen Sie nicht explizit einen Rahmendiagramm definieren; stattdessen wird ein Rahmendiagramm automatisch basierend auf den Anforderungen der Szene generiert.

Eingebaute Materialien

In Qt Quick 3D werden Materialien entweder durch die Verwendung von PrincipledMaterial oder SpecularGlossyMaterial oder durch die Definition eines CustomMaterial mit benutzerdefiniertem Shader-Code bereitgestellt. Der PrincipledMaterial ist ein PBR-Shader (Physically Based Rendering), der den Metallic-Roughness-Workflow verwendet. Die Komplexität des generierten Shaders erhöht sich je nach den vom Benutzer festgelegten Eigenschaften und dem Inhalt der Szene. Wenn beispielsweise ein Licht Schatten wirft, enthält der generierte Shader Code für den Schattenempfang; wenn eine Lichtsonde oder eine Reflexionssonde vorhanden ist, wird der Shader diese Beleuchtungsinformationen einbeziehen. Diese dynamische Anpassung gilt auch für CustomMaterial im schattierten Modus. Nicht schattierte CustomMaterial Shader berücksichtigen jedoch nicht automatisch Szeneninformationen, wie z. B. die Beleuchtung.

Geometrie-Hilfsmittel

Ähnlich wie Qt 3D bietet auch Qt Quick 3D viele eingebaute Geometrieprimitive sowie viele prozedurale Geometriegeneratoren.

Die folgende Tabelle zeigt eine Zuordnung der Geometrieklassen von Qt 3D zu ihren Entsprechungen in Qt Quick 3D:

Kamera-Steuerungen

Für die Kamerasteuerung bietet Qt Quick 3D vergleichbare Optionen wie OrbitCameraController und WasdController. Die WasdController ist ähnlich der FirstPersonCameraController in Qt3D, kann aber jedes Element in der Szene steuern, nicht nur Kameras.

Qt 3D Animation

Das Modul Qt 3D Animation definiert, wie verschiedene Arten von Animationen in 3D gehandhabt werden. In Qt Quick 3D ist die entsprechende Funktionalität über mehrere Module verteilt, wobei, wenn möglich, bestehende Klassen aus Qt Quick genutzt werden. So können Sie beispielsweise die verschiedenen Animationsklassen aus dem QtQuick -Import verwenden, um Eigenschaften von 3D-Knoten zu animieren.

Beim Import von Animationen aus Werkzeugen zur Erstellung von 3D-Inhalten werden diese in der Regel über Zeitleisten definiert. Das Modul Qt Quick Timeline stellt die notwendigen Klassen für die Definition solcher Animationen bereit, und jeder importierte Inhalt mit Animationen benötigt dieses Modul, um zu funktionieren.

Zusätzlich zu den grundlegenden Transformationen (z. B. Verschiebung, Drehung und Skalierung) für Elemente in einer Szene unterstützt Qt Quick 3D armaturbasierte Animationen, bei denen Sie die Knochen in einem Skelett animieren und dabei die mit jedem Gelenk oder Knochen verbundenen Eckpunkte beeinflussen. Dies wird durch die Komponente Skin erreicht, die Node Objekte, die Knochen in der Szene darstellen, mit entsprechenden Knochengewichten in einer Model's Geometrie verbindet. In diesem Fall erfolgt die Animation des Skeletts durch die Animation der Bones mithilfe von Transformationen.

Qt Quick 3D unterstützt auch Morph-Ziel-Animationen, bei denen Sie Änderungen an der Geometrie eines Modells direkt animieren können. Morph-Ziele sind vordefinierte Schnappschüsse der Geometrie eines Modells, zwischen denen Sie mit der Komponente MorphTarget animieren können.

Um mehrere Animationen zu kombinieren oder miteinander zu verschmelzen, werden die Komponenten im Modul Qt Quick Timeline Blend Trees verwendet. Mit diesem Modul können Sie komplexe Bäume zur Verwaltung der Interaktion zwischen verschiedenen Animationen definieren. Die meisten dieser generischen Animationsklassen sind nicht spezifisch für Qt Quick 3D, sondern sind Teil des breiteren Qt Quick Frameworks, wobei bestehende Funktionen genutzt werden, anstatt neue Methoden einzuführen.

Qt 3D Szene2D

In Qt 3D wird die Komponente Scene2D verwendet, um 2D-Szenen Qt Quick in Texturen umzuwandeln, die in einer 3D-Szene verwendet werden können. In Qt Quick 3D wird dies über die Eigenschaft sourceItem der Komponente Texture erreicht. Die sourceItem-Eigenschaft kann auf ein bestehendes Item verweisen oder ein Inline-Element definieren. Das Element der obersten Ebene bestimmt die Texturgröße, und die Qt Quick Szene wird auf eine Ebene gerendert, die auf die Texture Komponente abgebildet wird.

Darüber hinaus ist es möglich, Item-based Komponenten direkt in einer 3D-Szene zu verwenden, wo sie im 3D-Raum projiziert werden, ohne dass eine Textur erforderlich ist.

© 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.