ContribCliquez ici pour proposer des corrections ou des compléments pour cette page.
Techniques 3D

Cette rubrique a pour but de vous expliquer comment créer et optimiser des objets 3D pour une utilisation optimale dans X-Plane. L'objectif: une belle modélisation utilisant un minimum de mémoire...

Comment X-Plane gère la 3D

X-Plane utilise la librairie graphique OpenGL. Dans ce mode, il existe des fonctions permettant d'optimiser la vitesse d'affichage, de gérer les conflits entre textures co-planaires,... et dans les objets d'X-Plane, on peut utiliser certaines de ces fonctions.

La première des optimisations c'est la

Suppression de tout ce qui est inutile

Cela peut paraître évident, moins le simulateur aura d'objets, de faces et de textures à afficher, mieux il tournera.

Pour les textures par exemple, il est souvent possible de caser dans la même image les parties qui serviront à habiller plusieurs objets. X-Plane aura ainsi moins de fichiers Image à lire sur le disque (temps de chargement) et il consommera moins de mémoire vidéo.

Pour les objets, X-Plane calcule à chaque instant s'il doit l'afficher ou non. Moins ils seront nombreux, et moins ce temps de calcul sera important. C'est pourquoi il peut être intéressant de regrouper des objets qui vont toujours ensemble en créant des bouquets d'arbres, des villages.

Autres optimisations

Strip et Fan

En OpenGL il est possible, lorsque les textures à appliquer peuvent être posées en continu, de réduire le nombre de points envoyés à la carte graphique pour affichage.

Exemple :

  1    3    5    7

  2    4    6    8

La démarche habituelle pour texturer les trois carrés ci-dessus consiste à poser un bout de texture sur 1 3 4 2, puis sur 3 5 6 4, et enfin sur 5 7 8 6.

En OpenGL, on peut "dérouler" la texture entre 1 2 et 7 8. Dans les objets d'X-Plane, on utilise alors la fonction quad_strip au lieu de la fonction quad de base.
Dans notre exemple, cela devient texturer 1 3 4 2 comme tout à l'heure mais ensuite on applique jusqu'à 5 6 puis jusqu'à 7 8. On a donc envoyé que 8 points au lieu de 12 par la méthode traditionnelle. On voit bien à cette occasion qu'il faut au minimum 3 faces pour que ça devienne intéressant.

Il existe l'équivalent lorsqu'on travaille avec des faces définies à l'aides de triangles (tri).
De 1 3 2 puis 2 3 4 puis 3 5 4, 5 6 4, 5 7 6 et 7 8 6, soit 18 points.
En tri_strip cela donne 1 3 2 puis 4 puis 5, 6, 7 et 8, soit seulement 8 points.

A propos des triangles, il existe une variante qui est le tri_fan. Cette fois le déroulement de la texture se fait en éventail.

X-Plane ne gère que quad_strip et tri_fan. Ces optimisations sont utilisées par le script d'export pour Blender.

La règle du crayon

Citée par Ben Supnik, le gourou des scènes v8, elle met l'accent sur la diminution du nombre de textures.

La pire chose à faire pour dégrader le taux d'images par secondes, c'est de changer de texture.
Dessiner avec OpenGL c'est comme dessiner avec un crayon. Changer de texture revient à poser le crayon pour en prendre un autre. Ca va beaucoup plus vite de faire tout le rouge puis tout le bleu que de changer sans arrêt entre les crayons rouge et bleu.
Ce qui n'arrange pas les choses c'est qu'au niveau matériel la nouvelle texture peut-être déjà dans la mémoire de la carte vidéo, ce qui est rapide, ou en RAM mais elle peut aussi être sur le disque dur qui lui est nettement plus lent.

D'où la recommandation de n'avoir qu'une seule texture par objet (obligation dans X-Plane) ou mieux encore de regrouper les nombreuses petites textures en d'autres plus grandes et moins nombreuses pour éviter de changer tout le temps.

LOD

Level Of Detail, traduction Niveau de détail.

Dans tout simulateur de vol on peut régler ce que l'on voit soit par la distance de visibilité, soit par une complexité variable en fonction de la distance.

Néanmoins il faut garder à l'esprit que ces points peuvent être coûteux. Pour la complexité par exemple, le simulateur garde en mémoire toutes les versions de l'objet. Ça ne devient intéressant que dans deux cas :
- Objet très complexe de près (10 faces de loin contre 200 de près par exemple)
- Objet répété très souvent (si on gagne seulement 10 faces sur un objet avec le LOD mais que l'objet est répété 20 fois, on gagne en tout 200 faces, des exemples types pouvant être des plots de piste ou des arbres génériques)

Régler les conflits visuels

- Mon objet au sol disparait ou clignote :

Voir la page Objets V8, chapitre Décalage de polygone et conflit "z-buffer".

- Le font du décor est affiché devant mon objet :

Voir la page Objets V8, chapitre Blending et contrôle de la composante Alpha.

- Mon Objet n'apparait pas derrière une vitre :

Si vous avez modélisé un pilote et ensuite une verrière translucide mais que votre pilote n'apparait pas à travers cette verrière dans X-Plane, ceci est dû à un problème d'ordre dans l'affichage des objets 3D. En effet, toute surface transparente doit-être dessinée en dernier par la carte-graphique car l'ordinateur ne pourra pas afficher ce qu'il y a derrière une partie vitrée si il n'a pas calculé avant ce qui doit être affiché derrière.

Dans l'image ci-dessus, la partie fixe de la verrière a été calculé après le pilote (le pilote est visible au travers) mais la bulle (partie mobile) de la verrière a été calculée avant le pilote (les pilotes sont invisibles). Pour régler ce problème, la solution est de faire en sorte que le code de votre objet contienne les parties transparentes en dernier. Dans Blender, le plus simple est de créer des groupes afin de hiérarchiser l'ordre d'affichage des objets. Pour cela, nous allons sélectionner toutes les parties de notre objet devant recevoir une texture transparente et choisir le menu "Objet" / "Group" / Add to new group" (voir image ci-dessous).

Une fois le groupe formé, nos parties d'objet deviennent vertes. Il nous reste maintenant à donner un nom à notre groupe pour que celui-ci soit dessiné en dernier. En effet, les lignes de codes correspondant à chaque groupe seront automatiquement classées suivant l'ordre alphabétique du nom de ces groupes. En clair, le groupe nommé "Agroup" sera dessiné avant le groupe "Bgroup" et ainsi de suite...
Pour nommer ce groupe, sélectionnez le mode "objet" et renommez le champ "GR" (voir image ci-dessous):

Il ne vous reste plus qu'à bien hiérarchiser vos groupes pour que ceux-ci apparaissent tous dans le bon ordre. Alors n'oubliez pas: l'objet solide doit-être dessiné avant l'objet transparent !