ContribCliquez ici pour proposer des corrections ou des compléments pour cette page.
LOD (Level of Detail)

Voilà un petit tuto sur l'utilisation et la détermination du ou des niveaux de LOD les plus adaptés afin d'optimiser les ressources, fait par Guillaume.

Tout d'abord, LOD signifie Level Of Detail. C'est une valeur exprimée en mètres et le paramètre est déterminé sous la forme d'une fourchette. Son utilisation est optionnelle.

Avant d'aller plus loin, vous pourrez trouver beaucoup d'informations sur le format OBJ 8 utilisé depuis la version 8.16 de X-plane à cette adresse, traduit ici.

Où est défini ce paramètre ?

À la fin d'un objet au format .obj que vous pouvez éditer à l'aide de n'importe quel éditeur de texte :

Est-il possible de renseigner ces paramètres au moment de la création d'un objet ?

Blender version supérieure à la 2.49

Oui, sous Blender par exemple. Mais si vous voulez pousser son utilisation plus loin, vous aurez sans doute un peu d'édition à faire manuellement dans le fichier .obj vous-même. Voici où le déterminer dans Blender (je n'utilise que ce programme pour le moment), une fois que vous aurez installé correctement le superbe plugin Xplane2Blender.

Mais alors à quoi correspond cette fourchette !?!

Dans le premier exemple, l'attribut ATTR_LOD définit une fourchette entre 0 et 12000. Ca veut dire que l'objet s'affichera tant que vous êtes à une distance inférieure à 12km de son origine.

Mais quand on définit un LOD max à tant, il disparaît sous X-Plane beaucoup plus tôt que prévu, parce qu'il y a un autre paramètre très important à prendre en compte : le FOV (Field of View), un angle en degrés, déterminé par l'utilisateur dans les paramètres graphiques de X-Plane. En fait, l'objet ci-dessus s'affichera entre 0 et 12km à un FOV de 32° (valeur empirique issue de mes tests).

Comment calculer la distance max d'affichage la plus adaptée à mon objet ?

On arrive au coeur du sujet : théoriquement, il est inutile d'afficher un objet si sa taille est inférieure à un pixel. Calculons donc, avec un FOV de 32°, à quelle distance notre objet a une dimension de 1 pixel :

LODmax = DIMcaract*SQRT(pixL²+pixl²)/(2*TAN(32/2))

Tout d'abord, il faut déterminer une dimension caractéristique de votre objet. Si c'est un maison de 8m de large,12m de long, 6m de haut, c'est assez facile, vous pouvez prendre 10m à la louche sans trop vous tromper. DIMcaract=10m
Si c'est un objet de type antenne, disons une antenne de 30cm de diamètre et de 40 m de haut,
vous pouvez considérer que :
DIMcaract=SQRT(0,3*40)=3,46m

D'une manière générale, si vous ne savez pas trop, vous pouvez multiplier n dimensions pertinentes et appliquer une puissance 1/n au résultat. ça vous donnera une dimension caractéristique intéressante. Reprenons l'exemple précédent de la maison :
DIMcaract=(8*12*6)^(1/3)=8,3m

Après, vous pouvez toujours ajuster en faisant des essais.

Au niveau de la résolution des écrans, on peut considérer que le Full HD est désormais standardisé :
pixL=1920
pixl=1080

Attention à régler votre calculatrice en mode degrés pour les calculs de trigonométrie. Si ça n'est pas le cas, il vous suffit de convertir les degrés en radians :
32 ° = 32*180/3,14 rad

La magie de tout ça, c'est que quand vous réglerez votre FOV à 80°, vos objets disparaîtront à partir du moment où la dimension caractéristique que vous aurez choisie s'affichera sur moins de 1 pixel de large. A quelle distance de votre objet serez-vous à ce moment là?

Disparition=LODmax*TAN(32/2)/TAN(FOV/2)

Si FOV=80°, Ddisparition~LODmax/3

A l'usage, vous vous rendrez vite compte que la limite d'affichage à 1 pixel n'est pas forcément pertinente. Vous aurez très vite des LOD très grands. De plus, sous X-Plane, la disparition des objets n'est pas soudaine mais se fait de façon graduelle à partir du moment où on dépasse la distance d'affichage théorique. En d'autres termes, tant que votre caméra sera à l'intérieur de la fourchette du LOD, l'objet sera affiché à 100%. Au delà, il deviendra de plus en plus transparent jusqu'à disparition totale. Dans la pratique, il est souvent inutile d'afficher un objet s'il s'affiche sur moins de 4 pixels. Vous pouvez donc facilement diviser tous vos LOD calculés précédemment par 4.

Tout ceci nous donne, de façon beaucoup plus simple : LODmax~DIMcaract*1000

Il est également souvent inutile d'afficher un objet s'il est situé à plus de 40 km. Ca correspond à des cas assez rares de très bonnes vibilité. Se fixer un LOD max inférieur ou égal à 120 000 est donc assez pertinent.

Vous pourrez également prendre en compte le contraste global dans la zone d'affichage, afin de réduire ou d'augmenter la fourchette du LOD et le contraste de l'objet dans le paysage.

En vrai un château d'eau blanc sera très visible de loin sur un paysage de forêts ou de champs verts. Ce sera moins le cas s'il est au milieu de bâtiments aux murs blancs. On peut se servir du LOD pour représenter cette meilleure ou moins bonne visibilité.

Est-ce que je peux déterminer plusieurs niveaux de LOD ?

Oui, et c'est là que le système prend tout son sens. On pourra afficher certains détails ou non d'un objet selon la distance à laquelle on se trouve. Cependant, il y a plusieurs règles à respecter :

-Le premier niveau de LOD d'un objet commence forcément à 0

-les fourchettes doivent être juxtaposées sans superposition. Exemple :
LOD 0 100
blablabla
LOD 100 500
blablabla
LOD 500 120000
blablabla

-Si votre objet contient des lumières, chaque lumière doit être décrite de façon constante et chaque lumière doit être décrite dans chaque niveau de LOD. (à l'heure où est écrit cet article. Cf le lien en début de page pour confirmation)

Prenons l'exemple suivant :

Petites précisions :

Un objet .obj X-Plane peut être composé de plusieurs objets Blender, compilés dans le même fichier.

L'exemple montré ici est celui représenté sur la capture d'écran Blender. Pour plus de clarté, j'ai nommé mes différents objets Blender de la façon suivante :
DH : Detailed House
Chien : chiens assis sur le toit.
H : House
ChienW : Vitres des chiens assis
DHW : Vitres de la maison détaillée

En observant la façon dont se succèdent les index, vous aurez remarqué que j'ai modifié l'ordre dans lequel je les décris, principalement pour m'assurer que X-Plane dessinera les vitres transparentes en dernier afin de régler au maximum les problèmes d'ordre d'affichage. Si vous avez des idées plus automatisées, n'hésitez pas à m'en faire part !

Voici donc un petit montage de captures d'écran afin de comparer plus facilement ce qui diffère d'un niveau de LOD à l'autre :

Vous aurez compris que le # placé en début de ligne sert à l'inhiber.

Remarques :

Guillaume a remarqué que l'attribut ATTR_shiny_rat consomme beaucoup de temps de calcul.

Et aussi, qu'une image 4K ne réduit pas de manière sensible la fluidité mais chargera beaucoup plus vite la mémoire. Pour rappel, il est préférable d'utiliser des textures au format DDS, plus facilement traitées par les cartes 3D. L'outil Xgrinder de Laminar Research est là pour nous aider à manipuler ce format.

Pour illustrer de façon plus concrète, un aperçu Blender de la forme 3D que X-plane affichera :

Et bien sûr, si l'objet est amené à être dupliqué à outrance, rien de tel qu'un test adapté.