Qt Quick Niveau de détail 3D
Niveau de détail (LoD)
Le niveau de détail (LoD) désigne la technique consistant à utiliser différentes versions d’un modèle 3D en fonction de la distance par rapport à 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 occupe une petite partie de l'écran, et des versions plus détaillées lorsqu'il est plus proche ou occupe une plus grande partie de l'espace à l'écran. Cette approche permet une utilisation efficace des ressources du GPU tout en conservant la fidélité visuelle.
Qt Quick 3D propose à la fois un système de niveau de détail automatique et un système explicite. Le système automatique repose sur l’utilisation d’un maillage unique comportant plusieurs niveaux de détail stockés dans le fichier de maillage. Le système explicite repose 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 méthode pour utiliser la prise en charge automatique des niveaux de détail consiste à importer du contenu à l’aide de l’outil d’importation de ressources Balsam. En utilisant le drapeau « --generateMeshLevelsOfDetail » lors de l’importation des ressources, l’outil générera 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 ses caractéristiques générales. Il en résulte une géométrie supplémentaire ainsi que de nouvelles valeurs d’index pour chaque niveau de détail supplémentaire, sans oublier un facteur de distance utilisé pour déterminer quel 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 l’essentiel est d’obtenir un bon rapport géométrie/pixel. Ces données sont enregistrées dans le fichier .mesh et seront automatiquement prises en compte lorsqu’un modèle les utilisera.

Le compromis inhérent à ce système automatique, et la raison pour laquelle il n’est pas activé par défaut, réside dans le fait que la réduction de la géométrie peut entraîner l’apparition d’artefacts visuels. L’algorithme de simplification géométrique utilisé tente de préserver les caractéristiques du modèle, mais dans certains cas, il peut s’avérer nécessaire de recalculer les normales du maillage afin de conserver l’aspect visuel souhaité. Cela peut être réalisé en utilisant le drapeau « --recalculateLodNormals » lors de l’importation de la ressource. Le processus de recalcul des normales peut être affiné en transmettant des valeurs d’angles d’Euler aux arguments ` --recalculateLodNormalsMergeAngle ` et ` --recalculateLodNormalsSplitAngle ` afin de contrôler respectivement l’angle auquel les normales sont fusionnées ou divisées.
Le principal avantage du système automatique réside dans sa simplicité d’utilisation une fois que l’élément 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 faisant référence aux fichiers de maillage générés contenant des niveaux de détail géométriques choisiront automatiquement la géométrie appropriée en fonction du nombre de pixels occupés par le modèle à l’écran.
Il est possible d’ajuster le comportement de la sélection automatique du niveau de détail soit au niveau de l’ global level, soit au niveau de l’ per-model level, en utilisant la propriété « levelOfDetailBias » de l’une ou l’autre des propriétés suivantes : Camera ou Model. La valeur par défaut de 1,0 pour chacune de ces propriétés de décalage signifie que le système s’appuie sur la valeur calculée par le système automatique. Cette valeur représente un décalage par rapport à la valeur idéale : ainsi, une valeur inférieure à 1,0 nécessitera une taille de rendu encore plus petite avant de passer à un niveau de détail inférieur. Les valeurs supérieures à 1,0 entraîneront l’utilisation plus précoce de niveaux de détail inférieurs. Une valeur de 0,0 désactivera complètement l’utilisation des niveaux de détail et utilisera 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 l'absence de transition entre les différents niveaux de détail ; idéalement, cela ne devrait pas être nécessaire avec le niveau de détail automatique, mais peut s'avérer souhaitable dans certains cas d'utilisation.
Niveaux de détail explicites
Le système de niveaux de détail explicite est plus flexible que le système automatique, mais son utilisation nécessite davantage de travail. Le système explicite repose sur l’utilisation d’un composant « LodManager » pour spécifier les différents niveaux de détail en tant que composants enfants de type « Model ». Tout enfant du composant « LodManager » qui est une instance de « Model » sera considéré comme un niveau de détail. Cette fonctionnalité est très puissante, 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 » dispose également d’une propriété « distances » qui sert à déterminer quel composant enfant « Model » utiliser. Le nœud « LodManager » effectuera une transition vers le composant enfant suivant « Model » à mesure que la distance de la caméra s’approche de chaque limite de distance. La propriété « fadeDistance » permet de définir à quelle distance la transition en fondu enchaîné commence et se termine aux abords des limites de distance.
Voici un exemple d’utilisation du système explicite de niveaux de détail :

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 schéma illustrant ce qui est défini, qui met en évidence la manière dont 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 sert à définir la transition par fondu enchaîné.

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