FlightGear - Création d'avions et autres / Creation of aircraft and other

Vous désirez aider à améliorer les avions de Hangar de Helijah, c'est ici que cela se passe / You would like to help improving aircraft from Helijah's hangar, this is where it happens

Vous n'êtes pas identifié(e).

#1 2013-01-18 18:12:10

Helijah
Administrateur
Lieu : Chartres
Inscription : 2011-12-14
Messages : 2 011
Site Web

Comment afficher des objets 3D sur un écran (2D donc)

Bonjour à tous,

Voilà, je me lance. Je ne vais pas ici vous donner les algorithmes et les formules, ni vous remplir la tête de détails importants seulement pour ceux qui tentent de développer des logiciels 3D. Au contraire je vais tenter de rester le plus généraliste possible dans le seul but de faire comprendre, à ceux qui ne savant pas, comment les cartes 3D fonctionnent et pourquoi je suis parfois (souvent même) chiant avec mes histoires d'optimisations, de normales inversées etc...

Tout d'abord, les projections.

Un objet 3D est définis par des points et des facettes. Chaque point est défini par 3 coordonnées (X Y et Z) pour la 3D et 2 coordonnées (U et V) pour la texture. Mais vous reconnaîtrez qu'un écran d'ordinateur n'a que 2 dimensions. Hauteur et largeur. De ce fait, il faut réaliser une projection 3D->2D. Cela dit, c'est un des calculs les plus lourds mais des plus importants. Maintenant lors de ces projections il existe plusieurs méthodes pour rendre les objets à l'écran.

Nous prendrons par défaut des triangles pour l'exemple (mais c'est généralement ce qui est fait car les triangles ne sont jamais concave.
concave-convexe.png

Je vais parler d'intensité ce qui peut être assimilé à la couleur. Mais la couleur étant indépendante de l'intensité ce n'est pas vraiment correcte, mais je simplifie smile

1 - La plus ancienne le mode FLAT (ombrage de Lambert) :  Chaque face est considéré dans son ensemble. On prend la normale à la face on calcul son intensité lumineuse (l'angle entre la face et une ou des sources de lumières) et on trace toute la face avec cette luminosité. Avantage la face peut être tracé en une fois via des fonctions spécifiques de remplissage puisque toute la face est d'une seule couleur.
220px-Flat_shading.png
image source wikipedia

2 - La méthode GOURAUD (ombrage de Gouraud) : Plus complexe mais au rendu bien meilleur, voici simplement (enfin tout est relatif) le principe.

On crée des normales à la face aux 3 points. De ces normales on calcul les intensité pour ces 3 points. Ensuite on interpole les intensité du point 1 au point 3 puis 1 au point 2 puis du point 2 au point 3 (j'ai donné un ordre des point tout à fait au hasard smile ). Ensuite pour chaque ligne de la face on interpole les intensités d'un coté à l'autre.....Hum.... hein quoi ? Qu'est ce qu'il dit ?... Vite vite un dessin !
gouraud.png

Bien évidement cela oblige à tracer chaque face ligne par ligne et chaque ligne point par point ce qui est déjà beaucoup plus gourmand en temps machine. Par contre si une source lumineuse éclaire le centre d'une face de prêt cela ne se verra pas.
Gouraud_shading.jpg
image source wikipedia

3 - La méthode Phong (ombrage de Phong) : Encore plus complexe, nous franchissons là une étape importante pour un rendu plus réaliste puisque la lumière spéculaire va être prise en compte.....

On part sur le même principe que précédemment. Création des normales aux 3 points de la face. C'est à partir de là que cela change. Nous allons maintenant interpoler ces normales le long des cotés. Puis pour chaque ligne nous allons interpoler les normales d'un coté à l'autre. Et à chaque normale interpolé, nous pouvons enfin calculer l’intensité du point considéré..... Est ce clair ????
phong.png

Bien évidement tout ceci est à faire pour chaque face. Imaginez un peu le travail nécessaire pour une scène basique dans FG avec 5 avions volant de concert. Des milliers de face elles même constitués de dizaines ou centaines de points. La machine doit calculer des normales pour des milliers de points puis calculer les intensité grâce au normales puis modifier la couleur en fonction de l'intensité (couleur qui peut être récupérée dans la texture grace au coordonnées U et V avec encore une fois des interpolation pour chaque point de la face.... Bref beaucoup de travail....
Phong_shading.png
Image source wikipedia

Bien j'arrête pour le moment. Le repas à préparer. Ensuite je vous parle de tout ce qui accompagne ces méthodes, à savoir le Z-Buffer et la détection des faces cachées smile

Amicalement Emmanuel


Quelques avions pour FlightGear
http://helijah.free.fr

Hors ligne

#2 2013-01-18 19:52:57

Helijah
Administrateur
Lieu : Chartres
Inscription : 2011-12-14
Messages : 2 011
Site Web

Re : Comment afficher des objets 3D sur un écran (2D donc)

Bien. J'ai le ventre plein, mon fils aussi, je continue donc un peu..... pas trop quand même hein !

Alors bien évidement, vous devinerez que si les méthodes précédentes de rendus sont utilisés seules, il faut leur adjoindre d'autres algorithmes pour améliorer le rendu et optimiser les temps de calcul. Au passage je tiens à vous notifier que depuis déjà quelques années c'est la méthode de Phong qui a pris le pas sur les deux autres.

Commençons donc par éliminer des faces de la liste des faces qui vont être tracés..... En effet, vue depuis la caméra (ou l'oeil au choix) certaines faces sont vue de dos et donc invisibles. Mais comment déterminer si une face est visible ou non pour celui qui regarde la scène.... Et c'est là qu'interviennent les normales dont je parle très souvent (certes ce sont les même que précédemment mais leur utilisation'est pas la même).

La normale à une face est un vecteur directeur perpendiculaire à la face et dirigé vers l'extérieur (enfin ce dernier point est une convention, il n'y a pas d’intérieur/extérieur en 3D) ce qui correspond en fait au produit vectoriel ramené au centre de la face.
Il est important de noter qu'il faut définir un sens de création des points d'une face au départ. En effet la normale est dépendante de ce sens. Selon le sens de création des points la normale sera d'un coté ou de l'autre. Mais cela n'est pas l'objet de ce texte smile
normale.png

Mais que faire de ce vecteur et comment déterminer si la face est visible ou non ?
Si l'on considère l'oeil comme un point dans l'espace et la direction du regard comme un vecteur directeur nous avons donc un autre vecteur directeur placé dans l'espace. Grâce à un produit scalaire entre le vecteur de l'oeil et la normale à la face nous obtenons une valeur positive ou négative. (selon le sens déterminé au départ...). L'un des deux cas nous dis que la face est visible et l'autre bien évidement qu'elle est invisible (dans le cas d'une valeur nulle, la face est vue parfaitement de coté, c'est donc un simple trait, là il faut choisir si l'on affiche le trait ou non). Du coup nous savons si la face est visible ou non. Dans le cas ou elle est invisible elle est retiré de la liste des faces à traiter via les méthodes vue précédemment..... Ce qui bien évidement permet de gagner beaucoup de temps.
Voici un exemple simple :
visible.png
A gauche, toutes les faces sont visibles, 6 faces seront donc traitées et tracées.
A droite les faces visibles seules sont traitées. 3 faces seront donc traitées et tracées.
Cet exemple est simple et montre 50% de faces en moins. Imaginez sur plusieurs milliers de face combien peuvent ne pas être traitées smile

Voilà pour les faces cachées. Vous comprendrez maintenant pourquoi il est important de TOUJOURS surveiller les normales aux faces pour qu'elles soient toujours dirigées vers l'extérieur des objets. Alors la petite info qui fera plaisir. Comment afficher les normales dans Blender :
normale2.png
Via la touche "n" on affiche la zone d'information (à droite), dans cette dernière on cherche la section "Affichage de mesh" et là nous y trouvons la zone "Normales" les icônes permettent d'afficher les normales au points ou à la face et la valeur à coté permet de définir la taille des normales en bleu dans le vue 3D.

Alors bien sur, avant de traiter les faces et de les afficher, il nous faut les trier par rapport à l'oeil. Cela se nomme la méthode du peintre. C'est assez simple à comprendre. Si vous désirez peindre une pomme sur une table, vous allez commencer par la table puis vous aller dessiner la pomme. L'inverse serait idiot, la table recouvrirai la pomme smile

Donc à chaque fois que nous allons déterminer la normale à une face, nous allons aussi mettre dans un tableau ses coordonnées pour déterminer sa distance par rapport à l'euil. Grâce à cela nous allons pouvoir trier les faces visibles restantes de la plus éloignée à la plus proche. Et bien sur nous commencerons par dessiner les plus éloignées pour que les plus proche les recouvrent tout simplement. Encore du temps machine nécessaire bien sur. Vous voyez ce n'est pas si simple smile

Mais cette méthode à ces limites. En effet revenons à l'exemple de la table et de la pomme. Si la pomme est prêt de nous tout va bien mais si la pomme est à l'autre bout de la table ?

z-buffer.png

Vous voyez vite que dans le cas 1, la distance séparant le point de départ du vecteur normale à la pomme à l'oeil est inférieure à celui du vecteur normale à la table. Ok la table sera donc affiché avant la pomme et la pomme sera bien sur la table smile
Mais dans le second cas, la pomme sera cachée par la table car la distance qui la sépare du l'oeil est supérieur à celui de la table. Et oui, en 3D la méthode du peintre à ces limites..... Mais comment y remédier. Et bien il faut mettre en place un Z-Buffer.... aaaahhhhh nous y voilà smile

Alors grossièrement le Z-Buffer est une zone mémoire de la taille de l'image générée (si vous êtes en plein écran c'est la taille de l'écran donc smile ). Ce buffer sera au départ rempli de valeur représentant la distance la plus grande possible. Ensuite pour chaque point que l'on veut afficher (une fois tout les traitement précédent effectué bien sur), on vérifie d'abord si la distance de ce point avec l'euil est inférieur à celle présente dans le Z-Buffer à cette même position. Si c'est le cas alors on trace sinon on passe au suivant directement. Si deux points doivent être affiché au même endroit c'est donc le Z-Buffer qui déterminera lequel sera tracé smile


Bon j'arrête pour ce soir. Je vous laisse lire tout cela et trouver des questions le cas échéant smile

Amicalement Emmanuel


Quelques avions pour FlightGear
http://helijah.free.fr

Hors ligne

#3 2013-01-18 20:11:47

Helijah
Administrateur
Lieu : Chartres
Inscription : 2011-12-14
Messages : 2 011
Site Web

Re : Comment afficher des objets 3D sur un écran (2D donc)

Argh ! J'ai oublié un détail sur la méthode de Phong. Et c'est important.

Lors du calcul des normales aux trois points d'une face, nous prenons la moyenne de toutes les normales des faces qui contiennent ce point. Sinon la normale serait perpendiculaire à la face aux 2 points et cela ne changerais pas grand chose au rendu par rapport à du Gouraud.

phong2.png

Il faut donc pour chaque sommet calculer la normale de toutes les faces comprenant ce point puis faire une moyenne pour obtenir une normale en ce point. Et cela 3 fois pour des faces à 3 points smile

Amicalement Emmanuel


Quelques avions pour FlightGear
http://helijah.free.fr

Hors ligne

#4 2013-01-18 20:14:39

C-VALL
Developpeur
Inscription : 2012-11-15
Messages : 611

Re : Comment afficher des objets 3D sur un écran (2D donc)

Yes!  Keep on rockin' man!
Je vous suit religieusement docteur!


In Vino Veritas

Hors ligne

#5 2013-01-18 23:07:16

Didier1963
Developpeur
Lieu : Poitiers
Inscription : 2012-10-24
Messages : 1 233

Re : Comment afficher des objets 3D sur un écran (2D donc)

Alors j'ai une question très importante : les aspirine, il faut en prendre combien? un seul ou deux ?


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

#6 2013-01-19 00:30:00

Helijah
Administrateur
Lieu : Chartres
Inscription : 2011-12-14
Messages : 2 011
Site Web

Re : Comment afficher des objets 3D sur un écran (2D donc)

Et bien Didier c'est à ta convenance.

Mais c'est une boîte qu'il faudrait si j'avais mis les formules avec smile

Amicalement Emmanuel


Quelques avions pour FlightGear
http://helijah.free.fr

Hors ligne

#7 2013-01-19 15:13:32

Didier1963
Developpeur
Lieu : Poitiers
Inscription : 2012-10-24
Messages : 1 233

Re : Comment afficher des objets 3D sur un écran (2D donc)

Bon, aller on s'y colle, on va essayer de suivre.
Donc tu peux enlever le message précédent pour ne pas polluer ce post.


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

#8 2013-01-19 16:37:19

Helijah
Administrateur
Lieu : Chartres
Inscription : 2011-12-14
Messages : 2 011
Site Web

Re : Comment afficher des objets 3D sur un écran (2D donc)

RRRROOOO Lui hé !

Faut assumer tongue non mais des fois ! lol

Amicalement Emmanuel


Quelques avions pour FlightGear
http://helijah.free.fr

Hors ligne

#9 2013-01-19 17:16:27

Didier1963
Developpeur
Lieu : Poitiers
Inscription : 2012-10-24
Messages : 1 233

Re : Comment afficher des objets 3D sur un écran (2D donc)

Pas de problème, j'assume, mais je me met à la place d'un invité qui lis le post et qui trouve nos petites plaisanteries au milieux.
Alors pourquoi ne pas créer une rubrique "messages déplacés", où l'on indique l'endroit initial du post.


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

Pied de page des forums

Propulsé par FluxBB 1.4.8