Qt Quick 3D Detaillierungsgrad

Detaillierungsgrad (LoD)

Level of Detail (LoD) bezieht sich auf die Technik der Verwendung alternativer Versionen eines 3D-Modells in unterschiedlichen Entfernungen zur Kamera. Ziel ist es, die Ressourcennutzung zu optimieren, indem einfachere Versionen des Modells verwendet werden, wenn es weit entfernt ist oder einen kleinen Teil des Bildschirms einnimmt, während detailliertere Versionen verwendet werden, wenn es näher ist oder einen größeren Teil des Bildschirms einnimmt. Dieser Ansatz ermöglicht eine effiziente Nutzung der GPU-Ressourcen bei gleichzeitiger Wahrung der visuellen Wiedergabetreue.

Qt Quick 3D bietet sowohl ein automatisches als auch ein explizites System für den Detailgrad. Das automatische System basiert auf der Verwendung eines einzigen Netzes mit mehreren Detailstufen, die in der Netzdatei gespeichert sind. Das explizite System basiert auf der Verwendung einer LodManager Komponente, um die verschiedenen Detailstufen als untergeordnete Modelle zu spezifizieren.

Automatischer Detaillierungsgrad

Der primäre Weg, die automatische Unterstützung von Detailstufen zu nutzen, ist der Import von Inhalten mit dem Balsam Asset Import Tool. Wenn Sie beim Importieren von Assets das Flag --generateMeshLevelsOfDetail verwenden, generiert das Tool nach Möglichkeit Detailstufen für jedes Netz. Dabei wird versucht, die Geometrie des Originalnetzes zu vereinfachen, während die Gesamtmerkmale erhalten bleiben. Das Ergebnis ist eine zusätzliche Geometrie sowie neue Indexwerte für jede zusätzliche Detailebene und ein Abstandsfaktor, mit dem bestimmt wird, welches Mesh für eine bestimmte Rendergröße verwendet werden soll. Dieser Abstandsfaktor hängt mit dem Abstand des gerenderten Objekts zur Kamera zusammen, aber das Wichtigste ist ein gutes Verhältnis von Geometrie pro Pixel. Diese Daten werden in die .mesh-Datei geschrieben und automatisch verwendet, wenn sie von einem Modell verwendet werden.

Ein Nachteil des automatischen Systems und der Grund, warum es nicht standardmäßig aktiviert ist, besteht darin, dass es bei der Reduzierung der Geometrie auch zu visuellen Artefakten kommen kann. Der verwendete Algorithmus zur Geometrievereinfachung versucht, die Merkmale des Modells zu erhalten, aber in einigen Fällen kann es notwendig sein, die Normalen des Netzes neu zu berechnen, um das beabsichtigte visuelle Erscheinungsbild zu erhalten. Dazu kann beim Importieren des Assets das Kennzeichen --recalculateLodNormals verwendet werden. Die Neuberechnung der Normalen kann weiter angepasst werden, indem Eulerwinkelwerte an die Argumente --recalculateLodNormalsMergeAngle und --recalculateLodNormalsSplitAngle übergeben werden, um den Winkel zu steuern, in dem die Normalen zusammengeführt bzw. aufgeteilt werden.

Der Hauptvorteil des automatischen Systems ist, dass es einfach zu verwenden ist, sobald das Asset mit den entsprechenden Einstellungen importiert wurde. Für die Verwendung des automatischen Systems ist kein zusätzlicher Code erforderlich, und alle Modelle, die auf die generierten Mesh-Dateien verweisen, die Detailgeometrien enthalten, wählen automatisch die passende Geometrie aus, je nachdem, wie viele Pixel das Modell auf dem Bildschirm einnimmt.

Es ist möglich, das Verhalten der automatischen Auswahl der Detailebene entweder auf global level oder auf per-model level zu beeinflussen, indem Sie die Eigenschaft levelOfDetailBias von Camera oder Model verwenden. Die Standardeinstellung von 1,0 für jede dieser Bias-Eigenschaften bedeutet, dass dem vom automatischen System berechneten Wert vertraut wird. Dieser Wert ist eine Abweichung vom Idealwert, so dass bei einem Wert unter 1,0 eine noch kleinere gerenderte Größe erforderlich ist, bevor auf eine geringere Detailstufe umgeschaltet wird. Werte über 1,0 führen dazu, dass eine niedrigere Detailstufe früher verwendet wird. Ein Wert von 0,0 deaktiviert die Verwendung von Detailstufen vollständig und verwendet immer die ursprüngliche Netzgeometrie.

Das automatische System ist nicht so flexibel wie das explizite System. Zum Beispiel verwendet das automatische System immer dasselbe Material für alle Detailebenen, was nicht immer wünschenswert ist. Ein weiterer potenzieller Nachteil ist, dass es keinen Übergang zwischen den verschiedenen Detaillierungsgraden gibt, was bei der automatischen Detaillierung idealerweise nicht notwendig sein sollte, aber für bestimmte Anwendungsfälle wünschenswert sein kann.

Expliziter Detaillierungsgrad

Das explizite Detaillierungsgradsystem ist flexibler als das automatische System, erfordert aber mehr Arbeit. Das explizite System basiert auf der Verwendung einer LodManager Komponente, um die verschiedenen Detailebenen als untergeordnete Model Komponenten zu spezifizieren. Alle untergeordneten Komponenten von LodManager, die Instanzen von Model sind, werden als eine Detailebene betrachtet. Dies ist sehr leistungsfähig, da jede Detailstufe ein vollständig benutzerdefiniertes Modell sein kann, mit eigenen Geometrien und Materialien.

Die Komponente LodManager hat auch eine Eigenschaft distances, die verwendet wird, um zu bestimmen, welche untergeordneten Model zu verwenden sind. Der Knoten LodManager wechselt zum nächsten untergeordneten Knoten Model, wenn sich die Kameraentfernung der jeweiligen Abstandsgrenze nähert. Die Eigenschaft fadeDistance kann verwendet werden, um festzulegen, bei welchem Abstand der Übergang zum Überblenden um die Abstandsgrenzen herum beginnt und endet.

Dies ist ein Beispiel für die Verwendung des expliziten Detaillierungsgradsystems:

Im referenzierten Beispiel wird die LodManager verwendet, um explizit verschiedene Mesh-Dateien für jede Detailstufe der Marmorbüste anzugeben.

LodManager {
    camera: camera
    distances: [100, 140, 180]
    fadeDistance: 10

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_0.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_1.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_2.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_3.mesh"
        materials: [ marbleMaterial ]
    }
}

Für diesen Code ist dies ein Diagramm, das zeigt, wie die Distanzliste verwendet wird, um die Grenzen zwischen den verschiedenen Detailebenen zu definieren, sowie die Eigenschaft fadeDistance, die verwendet wird, um den Überblendungsübergang zu definieren.

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