Qt Quick Niveau de détail 3D
Niveau de détail (LoD)
Le niveau de détail (LoD) fait référence à la technique consistant à utiliser des versions alternatives d'un modèle 3D à différentes distances de la caméra. L'objectif est d'optimiser l'utilisation des ressources en utilisant des versions plus simples du modèle lorsqu'il est éloigné ou qu'il occupe une petite partie de l'écran, et des versions plus détaillées lorsqu'il est plus proche ou qu'il occupe une plus grande partie de l'écran. Cette approche permet d'utiliser efficacement les ressources du GPU tout en préservant la fidélité visuelle.
Qt Quick 3D propose un système de niveau de détail à la fois automatique et explicite. Le système automatique est basé sur l'utilisation d'un seul maillage avec plusieurs niveaux de détail stockés dans le fichier de maillage. Le système explicite est basé sur l'utilisation d'un composant LodManager pour spécifier les différents niveaux de détail en tant que modèles enfants.
Niveau de détail automatique
La principale façon d'utiliser la prise en charge automatique du niveau de détail consiste à importer du contenu à l'aide de l'outil d'importation d'actifs Balsam. En utilisant le drapeau --generateMeshLevelsOfDetail lors de l'importation d'actifs, l'outil génère des niveaux de détail pour chaque maillage lorsque cela est possible. Pour ce faire, il tente de simplifier la géométrie du maillage d'origine, tout en conservant les caractéristiques générales. Il en résulte une géométrie supplémentaire et de nouvelles valeurs d'index pour chaque niveau de détail supplémentaire, ainsi qu'un facteur de distance utilisé pour déterminer le maillage à utiliser pour une taille de rendu donnée. Ce facteur de distance est lié à la distance entre l'objet rendu et la caméra, mais le plus important est d'avoir un bon ratio de géométrie par pixel. Ces données sont écrites dans le fichier .mesh et seront utilisées automatiquement lorsqu'elles seront utilisées par un modèle.

L'un des inconvénients du système automatique, et la raison pour laquelle il n'est pas activé par défaut, est qu'il est possible que la réduction de la géométrie entraîne l'apparition d'artefacts visuels. L'algorithme de simplification de la géométrie utilisé tente de préserver les caractéristiques du modèle, mais dans certains cas, il peut être nécessaire de recalculer les normales du maillage pour conserver l'apparence visuelle voulue. Pour ce faire, utilisez l'option --recalculateLodNormals lors de l'importation de la ressource. Le processus de recalcul des normales peut être affiné en passant des valeurs d'angle d'Euler aux arguments --recalculateLodNormalsMergeAngle et --recalculateLodNormalsSplitAngle pour contrôler l'angle auquel les normales sont fusionnées ou divisées respectivement.
Le principal avantage du système automatique est qu'il est facile à utiliser une fois que l'objet a été importé avec les paramètres appropriés. Aucun code supplémentaire n'est nécessaire pour utiliser le système automatique et tous les modèles qui font référence aux fichiers de maillage générés contenant la géométrie des niveaux de détail choisiront automatiquement la géométrie appropriée en fonction du nombre de pixels que le modèle occupe à l'écran.
Il est possible de modifier le comportement de la sélection automatique des niveaux de détail au niveau de global level ou de per-model level en utilisant la propriété levelOfDetailBias de Camera ou Model. Le niveau par défaut de 1,0 de chacune de ces propriétés de biais signifie qu'il faut faire confiance à la valeur calculée par le système automatique. Cette valeur est un biais par rapport à la valeur idéale, de sorte qu'une valeur inférieure à 1,0 nécessitera un rendu encore plus petit avant de passer à un niveau de détail inférieur. Les valeurs supérieures à 1,0 entraîneront l'utilisation de niveaux de détail inférieurs plus tôt. Une valeur de 0,0 désactive complètement l'utilisation des niveaux de détail et utilise toujours la géométrie originale du maillage.
Le système automatique n'est pas aussi flexible que le système explicite. Par exemple, le système automatique utilise toujours le même matériau pour tous les niveaux de détail, ce qui n'est pas toujours souhaitable. Un autre inconvénient potentiel est qu'il n'y a pas de transition entre les différents niveaux de détail, ce qui, idéalement, ne devrait pas être nécessaire avec le niveau de détail automatique, mais qui peut être souhaitable dans certains cas d'utilisation.
Niveau de détail explicite
Le système de niveau de détail explicite est plus souple que le système automatique, mais son utilisation demande plus de travail. Le système explicite est basé sur l'utilisation d'un composant LodManager pour spécifier les différents niveaux de détail en tant que composants enfants Model. Tous les enfants du composant LodManager qui sont des instances de Model seront considérés comme un niveau de détail. C'est très puissant, car chaque niveau de détail peut être un modèle entièrement personnalisé, avec ses propres géométries et matériaux.
Le composant LodManager possède également une propriété distances qui est utilisée pour déterminer quel enfant Model doit être utilisé. Le nœud LodManager passe à l'enfant suivant Model lorsque la distance de la caméra s'approche de chaque limite de distance. La propriété fadeDistance peut être utilisée pour définir à quelle distance la transition en fondu enchaîné commence et se termine autour des limites de distance.
Il s'agit d'un exemple d'utilisation du système de niveau de détail explicite :

Dans l'exemple cité, la propriété LodManager est utilisée pour spécifier explicitement différents fichiers de maillage pour chaque niveau de détail du buste en marbre.
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 ] } }
Pour ce code, voici un diagramme de ce qui est défini, qui montre comment la liste des distances est utilisée pour définir les limites entre les différents niveaux de détail, ainsi que la propriété fadeDistance qui est utilisée pour définir la transition entre les fondus enchaînés.

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