Portierung von „ Qt 3D “ auf „ Qt Quick 3D “: Ein Migrationsleitfaden
Dieser Leitfaden richtet sich an Entwickler, die derzeit Qt 3D und auf Qt Quick 3D.
Unterschiede im Anwendungsbereich
Während Qt 3D und Qt Quick 3D auf den ersten Blick ähnlich erscheinen mögen, da beide 3D-APIs bereitstellen, basieren sie auf grundlegend unterschiedlichen Ansätzen.
Qt 3D ist eine flexible API zur Implementierung benutzerdefinierter 3D-Renderer und bietet Low-Level-Abstraktionen für die verschiedenen Aspekte des Rendering-Prozesses. Daher stellt Qt 3D APIs sowohl für C++ als auch für QML bereit.
Im Gegensatz dazu ist „ Qt Quick 3D “ eine hochrangige API, die sich auf das Rendern von 3D-Inhalten konzentriert und als Erweiterung von „ Qt Quick “ konzipiert ist. Folglich basieren die meisten ihrer APIs auf QML. Wenn Ihre aktuelle „ Qt 3D “-Anwendung daher stark auf C++ basiert, erfordert die Migration zu „ Qt Quick 3D “ einen Wechsel 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 Funktionen um die Unterstützung der 3D-Darstellung.
Der erste wesentliche Unterschied liegt in der Verwendung von Entwurfsmustern. Qt 3D nutzt das Entity-Component-System (ECS)-Muster. In diesem System wird eine generische Entitätsklasse verwendet, die durch Hinzufügen verschiedener Komponenten zur Entität nach einem Kompositionsmuster spezialisiert werden kann. Im Gegensatz dazu verwendet „ Qt Quick 3D “ eine auf Vererbung basierende API, die sich an das übergeordnete Qt-Framework anlehnt, wobei spezialisierte Knoten Unterklassen einer gemeinsamen Basisklasse sind. Aufgrund dieser grundlegenden Unterschiede gibt es keine direkte 1:1-Entsprechung zwischen den beiden APIs.
Ein weiterer wesentlicher Unterschied besteht in den Threading-Modellen. „ Qt 3D “ führt das Konzept der Aspekte ein, die unterschiedliche Einstiegspunkte für verschiedene Arten von Komponenten bieten, die an Entitäten angehängt sind. Jeder Aspekt kann Aufgaben erstellen, die von einem Thread-Pool verarbeitet werden, wobei einem Baum aus Anbietern und Abhängigkeiten gefolgt wird, um alle für die Darstellung eines Frames erforderlichen Arbeiten abzuschließen. Qt Quick 3D hingegen verwendet dasselbe Threading-Modell wie Qt Quick. Es verfügt über eine Frontend-API, auf die vom Haupt-GUI-Thread aus zugegriffen werden kann, um den Szenenstatus zu verwalten, sowie über eine Backend-API auf dem Render-Thread. Zwar kann der Render-Thread für bestimmte Aufgaben zusätzliche Threads nutzen, doch aus Sicht des Benutzers umfasst das konzeptionelle Modell nur zwei Threads. In „ Qt Quick 3D “ gibt es kein eigenständiges Konzept von Aspekten, obwohl ein Großteil der von den Aspekten in „ Qt 3D “ bereitgestellten Funktionalität weiterhin verfügbar ist.
Aus Sicht des Renderings bietet Qt 3D einen hochgradig anpassbaren Ansatz, der die Erstellung maßgeschneiderter Rendering-Pipelines ermöglicht. Diese Flexibilität geht jedoch mit Komplexität einher; standardmäßig stellt Qt 3D keine vorkonfigurierte Rendering-Pipeline bereit. Im Gegensatz dazu ist „ Qt Quick 3D “ benutzerfreundlicher gestaltet und verfügt über eine sofort einsatzbereite Rendering-Pipeline, die sich automatisch an die Anforderungen der Szene anpasst. Wenn beispielsweise ein gerichtetes Licht in „ Qt Quick 3D “ so eingestellt ist, dass es Schatten wirft, fügt die Rendering-Pipeline automatisch einen Durchlauf zur Erzeugung einer Schattenkarte hinzu, die dann von den Materialien in der Szene verwendet wird. In „ Qt 3D “ würde eine solche Funktionalität eine manuelle Konfiguration des Frame-Graphs und eine Erweiterung der Materialien erfordern, um den Schatten-Mapping-Durchlauf zu unterstützen. Zudem wären für verschiedene Lichttypen, wie Punkt- oder Spotlichter, weitere Anpassungen am Frame-Graph und an den Materialdefinitionen erforderlich. Zwar bietet „ Qt 3D “ leistungsstarke Anpassungsmöglichkeiten für Schattenabbildungstechniken, doch kann dies zu einem erheblichen Mehraufwand im Vergleich zu „ Qt Quick 3D “ führen, wo das Aktivieren von Schatten so einfach ist wie das Setzen einer einzigen Eigenschaft an einer Lichtquelle.
Details pro Modul
Qt 3D Kern
Das „ Qt 3D “-Kernmodul stellt die grundlegenden Primitive bereit, auf denen andere „ Qt 3D “-Module aufbauen. Die meisten Klassen im „ Qt 3D “-Kernmodul haben entsprechende Komponenten in „ Qt Quick 3D “, mit Ausnahme jener Klassen, die speziell die Entity-Component-System (ECS)-Architektur unterstützen. „ Qt Quick 3D “ bietet vorgefertigte Komponenten, die den in „ Qt 3D “ gebräuchlichen Entity-Component-Kombinationen entsprechen und so den Entwicklungsprozess vereinfachen.
Als Beispiel dient hier die Konfiguration einer renderbaren 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 die Entität 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, eine Unterklasse der „ Node “-Komponente, die das Äquivalent der „ Transform “-Komponente aus „ Qt 3D “ erbt. Darüber hinaus ist jede „Node“-Unterklasse Teil eines Szenengraphen mit Eltern-Kind-Beziehungen. Die „Model“-Komponente ist eine renderbare Entität, die über eine Geometrie und ein oder mehrere Materialien verfügen kann. In diesem Fall verwenden wir die Eigenschaft „ geometry “, um sie an die prozedurale API anzupassen, die vom Code unter Qt 3D verwendet wird; es ist jedoch auch möglich, die Geometrie mithilfe der Eigenschaft „ source “ aus einer statischen Datei anzugeben. Die Eigenschaft „ materials “ der „Model“-Komponente ist eine Liste von Materialien, die zur Schattierung der Geometrie verwendet werden sollen. Es handelt sich um eine Liste, da Geometrien mehrere Teilmengen enthalten können, von denen jede ein eigenes Material verwenden kann. Die Komponente „ PrincipledMaterial “ ist ein PBR-Material (Physically Based Rendering), das den „Metallic-Roughness“-Workflow verwendet und in diesem Beispiel das vom „ Qt 3D “-Snippet verwendete „ PhongMaterial “ ersetzt.
Qt 3D Input
Qt 3D bietet über sein eigenes benutzerdefiniertes Eingabesystem eine Reihe von Eingabeklassen. Im Gegensatz dazu verwendet „ Qt Quick 3D “ in erster Linie Eingabeklassen aus „ Qt Quick “. Für die Interaktion mit einer 3D-Szene stellt „ Qt Quick 3D “ zusätzliche APIs zur Durchführung von Raycasting und Objekt-Picking bereit.
View3D ist die Hauptklasse für die Abwicklung von Auswahlvorgängen in Qt Quick 3D und bietet sowohl explizite als auch implizite Auswahlmethoden. Die explizite Auswahl-API ermöglicht es Ihnen, direkt aus dem 2D-Raum auszuwählen, indem Sie die x- und y-Koordinaten in der View3D angeben. Dieser Vorgang gibt einen pickResult -Wert zurück, der Details zum getroffenen Objekt und zur Treffstelle enthält. Die API arbeitet synchron, was bedeutet, dass das Ergebnis unmittelbar nach dem Abfeuern des Strahls verfügbar ist. Zudem ist es möglich, Strahlen von jedem beliebigen Punkt in der Szene aus abzufeuern. Sowohl explizite als auch implizite Auswahlmethoden 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 Beispiel-Codeausschnitt wird eine einfache Szene mit einem Kugelmodell erstellt. Das Kugelmodell ist als „ pickable “ festgelegt, was bedeutet, dass dieses Modell bei der Strahlausgabe in die Szene für die Auswahl berücksichtigt wird. Über dem „ View3D “ befindet sich ein „ MouseArea “, der auf Klicks achtet. Wird ein Klick erkannt, wird die Methode „ pick “ mit den x- und y-Koordinaten des Klicks aufgerufen. Anhand des Ergebnisses der Auswahl wird dann ermittelt, ob das Kugelmodell getroffen wurde. Ist dies der Fall, wird das Material des Kugelmodells zwischen dem roten und dem blauen Material 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 Beispiel-Codeausschnitt wird eine einfache Szene mit einem „ Button “ in der Mitte des Bildschirms erstellt. „Button“ ist ein 2D-Element, da sein übergeordnetes Element jedoch ein „ Node “ ist, wird es in den 3D-Raum projiziert. Mit solchen Komponenten kann auf dieselbe Weise interagiert werden wie im 2D-Raum. „ View3D “ übernimmt automatisch das Abfeuern von Strahlen in die Szene und die Weiterleitung von Eingabeereignissen an alle 2D-Elemente, 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"
}
}
}
}
]
}
}
}Ähnlich wird im obigen Codeausschnitt ein Würfel Model mit einer Textur erstellt, bei der es sich um ein „ Pane “ handelt, das ein „ Button “ enthält. In diesem Fall wird ein 250×250-Pixel- Texture erstellt, indem eine „ Pane “-Komponente gerendert wird, die ein „ Button “ enthält. Normalerweise wäre diese Textur nicht interaktiv, aber durch das Setzen von „ pickable “ auf „true“ im „ Model “ wird derselbe implizite Picking-Mechanismus, der im vorherigen Beispiel Eingabeereignisse an den „ Button “ weitergeleitet hat, in diesem Beispiel verwendet, um Eingabeereignisse an den „ Button “ weiterzuleiten. Im Fall des Würfels „ Model “ ist nun jede Fläche des Würfels mit dem „ Button “ interaktiv.
Die meisten Eingabeklassen in Qt 3D lassen sich nicht direkt auf Qt Quick 3D übertragen, sodass ein gewisser Portierungsaufwand erforderlich ist; der implizite Auswahlmechanismus in Qt Quick 3D erleichtert jedoch die Interaktion mit 2D-Elementen in einer 3D-Szene.
Qt 3D Logik
Das Modul „ Qt 3D Logic“ enthält eine einzige Komponente, die für jeden gerenderten Frame einen Callback bereitstellt. In „ Qt Quick 3D “ entspricht dies der Verwendung der Komponente „ FrameAnimation “, einer allgemeinen „ Qt Quick “-Komponente, die Zeitinformationen und einen Callback-Mechanismus für jeden gerenderten Frame bereitstellt.
FrameAnimation {
running: true
onTriggered: {
console.log(`currentFrame: ${currentFrame}, frameTime: ${frameTime}`)
}
}Diese Komponente kann an beliebiger Stelle in Ihrer Szene eingesetzt werden, auch als untergeordnetes Element eines Objekts, bei dem Sie in jedem Frame eine bestimmte Aktion ausführen möchten.
Es ist jedoch zu beachten, dass dieses Muster nur dann erforderlich ist, wenn Sie in jedem Frame eine bestimmte Aktion ausführen möchten. Zwar ermöglicht „ FrameAnimation “ die Nachbildung des Polling-Verhaltens in einigen Spiel-Engines, doch ist es auch möglich, in „ Qt Quick 3D “ dieselben ereignisgesteuerten Muster zu verwenden wie in „ Qt Quick “.
Qt 3D Render
Das Render-Modul von Qt 3D enthält die meisten der für das Rendering erforderlichen kritischen Klassen. In Qt Quick 3D werden die meisten 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 stehen und mit denen sich die Funktionalität von Qt Quick 3D erweitern und anpassen lässt.
Geometrie
Geometrie- oder Mesh-Daten werden in Qt 3D durch die Klasse ` QGeometryRenderer ` oder die Komponente ` GeometryRenderer ` dargestellt. In Qt Quick 3D sind die Entsprechungen die Klasse ` QQuick3DGeometry ` und die Komponente ` ProceduralMesh `. In Qt 3D ist die Klasse ` QGeometryRenderer ` auf einer niedrigeren Ebene angesiedelt und erwartet vom Benutzer, dass er die Layouts der Scheitelpunktattribute als Teil der Geometriedaten bereitstellt. In „ Qt Quick 3D “ können Sie steuern, welche integrierten Scheitelpunktattribute verwendet werden sollen, doch das Layout der Puffer wird intern als Implementierungsdetail behandelt.
Weitere Informationen dazu finden Sie im Beispiel „Qt Quick 3D: Benutzerdefinierte Geometrie“.
Texturen
Qt 3D Texturen werden in „ “ durch die Unterklassen von „ QAbstractTexture “ dargestellt. In „ Qt Quick 3D “ entspricht dem die Komponente „ Texture “, die die Frontend-Darstellung einer Textur und eines Samplers darstellt. Die von der Texturkomponente verwendeten Daten können jedoch aus verschiedenen Quellen stammen. Am einfachsten ist es, die Eigenschaft „ source “ einfach auf eine Bilddatei zu setzen; diese wird dann als Texturdaten auf die GPU hochgeladen. Es ist auch möglich, Texturdaten zur Laufzeit prozedural zu generieren, indem entweder 2D-QML-Inhalte als Quelle verwendet werden, eine Unterklasse von „ QQuick3DTextureData “ erstellt wird oder die Komponente „ ProceduralTextureData “ genutzt wird. Bei diesen Typen können Sie Texturdaten durch Angabe von Größe, Format und Rohbilddaten festlegen. Außerdem besteht die Möglichkeit, Texturen auf der GPU mithilfe von „ render extensions “ zu erstellen.
Weitere Details dazu finden Sie im Beispiel „Qt Quick 3D “ für prozedurale Texturen.
Materialien
Zwar war es in „ Qt 3D “ möglich, einige integrierte Materialien zu verwenden, doch war man dabei auf die integrierten „ framegraphs “ beschränkt, mit denen diese zusammenarbeiten konnten. Bei „ Qt Quick 3D “ ist die Situation ähnlich, da es eine Auswahl an integrierten Materialien bietet, die mit der internen Render-Strategie kompatibel sind. Sowohl bei „ Qt 3D “ als auch bei „ Qt Quick 3D “ ist es jedoch möglich, benutzerdefinierte Materialien zu erstellen.
In Qt 3D war dies ein recht aufwendiger Prozess, der eine Hierarchie aus QMaterial, QEffect, QTechnique, QRenderPass und QShaderProgram umfasste. In Qt Quick 3D ist dieser Prozess für Materialien auf eine einzige CustomMaterial -Komponente vereinfacht. Mit dieser Komponente können Sie benutzerdefinierten Shader-Code für das Material festlegen, und der Rest der Konfiguration wird vom Renderer übernommen. Es gibt zwei Modi für CustomMaterial: „shaded“ und „unshaded“. Im „Shaded“-Modus können Sie über die API für benutzerdefinierten Shader-Code den integrierten Shader „ PrincipledMaterial “ anpassen, und im „Unshaded“-Modus können Sie Ihren eigenen Shader-Code von Grund auf neu schreiben. In beiden Fällen ist die Shader-Sprache GLSL, mit einigen Qt-spezifischen Schlüsselwort-Erweiterungen, um die Integration in die übrige „ Qt Quick 3D “-API zu erleichtern.
Weitere Details dazu finden Sie in den Beispielen zum „Shaded Mode“ und zum „Unshaded Mode“ sowie in dieser Übersicht zur Verwendung der benutzerdefinierten GLSL-Shader-Sprache von „ Qt Quick 3D “.
Effekte
Aus Sicht von Qt3D gibt es keinen Unterschied zwischen dem Rendern einer 3D-Szene und dem Rendern von Nachbearbeitungseffekten, und aus einer Low-Level-Perspektive ist dies korrekt. Qt Quick 3D macht jedoch eine Unterscheidung. Models Teil einer 3D-Szene enthält eine Liste von „ materials “, und diese werden während der Hauptdurchläufe gerendert. Das Ergebnis dieser Hauptdurchläufe sind die 3D-Inhalte, die entweder direkt auf eine Fensteroberfläche oder eine Textur gerendert werden. Effects unterscheiden sich insofern, als sie sich unter Qt Quick 3D auf Nachbearbeitungseffekte beziehen, bei denen jeder pass letztendlich ein einzelnes Quad ist, das das gesamte Renderziel abdeckt. Die resultierende Textur des Hauptfarbdurchgangs wird dann als Textur an den ersten Effektdurchgang übergeben, und das Ergebnis dieses Durchgangs wird wiederum als Textur an den nächsten „ Effect “-Durchgang übergeben und so weiter. Der letzte Durchgang wird dann auf das Ausgabe-Renderziel gerendert, bei dem es sich in der Regel um die Fensteroberfläche handelt. Einige Effects erfordern „ buffers “, die während der Hauptdurchgänge erstellt wurden, wie beispielsweise die Tiefentextur, während andere Zwischenschritte benötigen; all dies lässt sich mithilfe der Effekte-APIs unter Qt Quick 3D definieren.
Qt Quick 3D spezialisiert diese Post-Processing-Effektkette mit APIs, die es Ihnen ermöglichen, so viele Render-Pässe zu definieren, wie Sie benötigen, um den gewünschten Effekt zu erzielen.
Weitere Details dazu finden Sie im Beispiel „Qt Quick 3D “ zur Nachbearbeitung.
Instanz-Puffer
In „ Qt 3D “ erfolgt die Verwendung von Instanzierung und Instanzpuffern auf recht niedriger Ebene, sodass die konkrete Anwendung vom jeweiligen Anwendungsfall abhängt. In „ Qt Quick 3D “ verfügen die integrierten Materialien über einige feste Instanzierungseigenschaften, die festgelegt werden können; dazu müssen Sie jedoch die Instanzdaten als Puffer bereitstellen. Es gibt mehrere Möglichkeiten, diese Daten bereitzustellen, und sobald sie vorliegen, müssen Sie lediglich die Eigenschaft „ instancing “ der Komponente „ Model “ festlegen, um die Daten des Instanzpuffers mit dem zu verknüpfen, was Sie instanzieren möchten.
Weitere Details finden Sie in diesem Artikel speziell zum Thema Instanzierung unter Qt Quick 3D.
Renderer-Erweiterungen
Der Zweck von „ Qt 3D “ besteht darin, eine leistungsstarke Möglichkeit zur Definition einer benutzerdefinierten Rendering-Lösung für Ihre Anwendung bereitzustellen. „ Qt Quick 3D “ bietet diesen Grad an Anpassbarkeit nicht, da es auf Benutzerfreundlichkeit statt auf einfache Anpassbarkeit ausgelegt ist, stellt jedoch zusätzlich zu den oben aufgeführten Möglichkeiten einige Wege zur Erweiterung der Rendering-Pipeline bereit. Dies geschieht durch die Implementierung von „ render extensions “, die es Ihnen ermöglichen, dem Renderer benutzerdefinierte Render-Durchläufe hinzuzufügen, wobei dieselben Daten wie vom Renderer verwendet werden. Hierbei handelt es sich um eine Low-Level-API, die ein gutes Verständnis der Rendering-Pipeline von „ Qt Quick 3D “ sowie der „ Qt Rendering Hardware Interface “ (RHI)-API erfordert.
Ein Beispiel dafür, wie dies umgesetzt wird, finden Sie im Beispiel zur „Stencil Outline Extension“
Qt 3D Extras
Das Modul „ Qt 3D “ bietet verschiedene Hilfsfunktionen für eine sofort einsatzbereite Umgebung, darunter Materialien, Geometrie-Generatoren und Kamerasteuerungen. Es enthält außerdem einen Frame-Graph für den Forward-Renderer. In „ Qt Quick 3D “ müssen Sie keinen Frame-Graph explizit definieren; stattdessen wird dieser automatisch basierend auf den Anforderungen der Szene generiert.
Integrierte Materialien
In „ Qt Quick 3D “ werden Materialien entweder über „ PrincipledMaterial “ oder „ SpecularGlossyMaterial “ bereitgestellt oder durch die Definition eines „ CustomMaterial “ mit benutzerdefiniertem Shader-Code. Der „ PrincipledMaterial “ ist ein PBR-Shader (Physically Based Rendering), der den „Metallic-Roughness“-Workflow verwendet. Die Komplexität des generierten Shaders steigt je nach den vom Benutzer festgelegten Eigenschaften und dem Inhalt der Szene. Wenn beispielsweise eine Lichtquelle Schatten wirft, enthält der generierte Shader Code für die Schattenwiedergabe; ist eine Licht- oder Reflexionssonde vorhanden, bezieht der Shader diese Beleuchtungsinformationen mit ein. Diese dynamische Anpassung gilt auch für „ CustomMaterial “ im „Shaded“-Modus. Nicht-geschattete „ CustomMaterial “-Shader berücksichtigen jedoch nicht automatisch Szeneninformationen wie beispielsweise die Beleuchtung.
Geometrie-Hilfsfunktionen
Ähnlich wie Qt 3D bietet auch Qt Quick 3D zahlreiche integrierte Geometrieprimitive sowie viele prozedurale Geometriegeneratoren.
Die folgende Tabelle enthält eine Zuordnung der Geometrieklassen aus „ Qt 3D “ zu ihren Entsprechungen in „ Qt Quick 3D “:
| Qt 3D | Qt Quick 3D |
|---|---|
| ConeMesh | ConeGeometry |
| CuboidMesh | CuboidGeometry |
| CylinderMesh | CylinderGeometry |
| ExtrudedTextMesh | ExtrudedTextGeometry |
| PlaneMesh | PlaneGeometry |
| Kugelgitter | SphereGeometry |
| Torus-Netz | TorusGeometry |
Kamerasteuerungen
Für die Kamerasteuerung bietet „ Qt Quick 3D “ vergleichbare Optionen wie „ OrbitCameraController “ und „ WasdController “. Der „ WasdController “ ähnelt dem „ FirstPersonCameraController “ in Qt3D, kann jedoch jedes Element in der Szene steuern, nicht nur Kameras.
| Qt 3D | Qt Quick 3D |
|---|---|
| FirstPersonCameraController | WasdController |
| OrbitCameraController | OrbitCameraController |
Qt 3D Animation
Das Animationsmodul „ Qt 3D “ definiert, wie verschiedene Arten von Animationen in 3D behandelt werden. In Qt Quick 3D sind entsprechende Funktionen auf mehrere Module verteilt, wobei nach Möglichkeit häufig auf bestehende Klassen aus Qt Quick zurückgegriffen wird. So können Sie beispielsweise die verschiedenen Animationsklassen aus dem Import „ QtQuick “ verwenden, um Eigenschaften von 3D-Knoten zu animieren.
Beim Importieren von Animationen aus 3D-Inhaltserstellungstools werden diese in der Regel mithilfe von Zeitleisten definiert. Das Qt Quick Timeline Modul stellt die erforderlichen Klassen zur Definition solcher Animationen bereit, und alle importierten Inhalte mit Animationen benötigen dieses Modul, um zu funktionieren.
Zusätzlich zu grundlegenden Transformationen (wie Verschiebung, Drehung und Skalierung) für Elemente in einer Szene unterstützt „ Qt Quick 3D “ armaturbasierte Animationen, bei denen Sie Knochen in einem Skelett animieren und dabei die mit jedem Gelenk oder Knochen verbundenen Scheitelpunkte beeinflussen. Dies wird durch die Komponente „ Skin “ erreicht, die „ Node “-Objekte, die Knochen in der Szene darstellen, mit den entsprechenden Knochengewichten in einer „ Model's “-Geometrie verknüpft. In diesem Fall erfolgt die Animation des Skeletts durch die Animation der Knochen mithilfe von Transformationen.
Qt Quick 3D unterstützt zudem Morph-Target-Animationen, bei denen Sie Änderungen an der Geometrie eines Modells direkt animieren können. Morph-Targets sind vordefinierte Momentaufnahmen der Geometrie eines Modells, und Sie können mithilfe der Komponente „ MorphTarget “ Animationen zwischen diesen erstellen.
Zum Kombinieren mehrerer Animationen oder zum Überblenden dieser werden die Komponenten des Moduls „ Qt Quick Timeline Blend Trees“ verwendet. Mit diesem Modul können Sie komplexe Baumstrukturen definieren, um zu steuern, wie verschiedene Animationen miteinander interagieren. Die meisten dieser generischen Animationsklassen sind nicht spezifisch für „ Qt Quick 3D “, sondern Teil des umfassenderen „ Qt Quick “-Frameworks, das bestehende Funktionen nutzt, anstatt neue Methoden einzuführen.
Qt 3D Scene2D
In „ Qt 3D “ wird die „Scene2D“-Komponente verwendet, um 2D- Qt Quick -Szenen in Texturen zu rendern, die innerhalb einer 3D-Szene verwendet werden können. In „ Qt Quick 3D “ wird dies mithilfe der Eigenschaft „ sourceItem “ der Komponente „ Texture “ erreicht. Die Eigenschaft „sourceItem“ kann auf ein vorhandenes „ 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 der Komponente „ Texture “ zugeordnet wird.
Darüber hinaus ist es möglich, „ Item-based “-Komponenten direkt innerhalb einer 3D-Szene zu verwenden, wo sie ohne Textur in den 3D-Raum projiziert werden.
© 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.