Modélisation 3D – Tour d’horizon

Dans cet article je vais faire un tour d’horizon sur le procédé de la 3D dans le monde du jeu vidéo en particulier. J’espère que ma qualité rédactionnelle ne s’est pas émoussée avec le temps que j’ai passé entre mes deux derniers articles, pour toujours offrir une expérience agréables a mes rares lecteurs, perdus sur mon blog :).

Comment sont générés et affichés les éléments ? Qu’elles sont les techniques pour les créer ? Qu’elles sont les perspectives possibles ? Quelles opérations peut on effectuer dans un monde 3D ? Voici quelques questions auxquelles j’essaierais d’apporter une réponse. Puis on passera sur quelques notions de mathématiques, pour parler notamment des courbes de Bézier, très utilisées pour créer des formes curvilignes et dans les logiciels de conception/création/retouches d’images. Enfin, on énumérera quelques méthodes pour identifier et supprimer les parties cachées, et je dédierais la fin de mon article à parler de l’éclairage dans une scène 3D.

Il est conseillé pour la lecture de cet article d’avoir des bases en anglais technique informatique, et de vaguement connaître la 3D (via l’utilisation des jeux, animations, etc …) mais aucune connaissance pratique ou poussée n’est nécéssaire.

Je précise que ceci est un tour d’horizon et que je n’entrerais pas dans les détails, mais je trouve intéressant de noter ces connaissances, pour savoir ou chercher et pour la culture générale. Bon, on attaque cette visite :)

Remarque : Cet article est découpé en 3 pages, vous pouvez changer de page en bas (c’est tout petit et peu visible voila pourquoi je le précise)

Pipeline de rendu

Quel est le processus qui permet de A à Z de traiter nos scènes en 3D puis de les afficher à l’écran ?

Le schéma suivant décrit les étapes du processus « normal » de traitement de la 3D par les machines. Il est important que ce traitement, est celui effectué environ toutes les 30 ms par la machine afin de gérer le rendu 3D. Je décrit plus bas à quoi correspondent ces étapes.

modelisation3d_schema1

  1. Modélisation : C’est l’action de tracer les formes de bases (cubes, sphères, cylindres, …) toute forme native au moteur 3D.
  2. La tesselation : Ici on va créer les formes plus complexes en assemblant les formes élémentaires entre elles. On forme ainsi des polygones.
  3. Le vertex pipeline : Ce traitement prend en compte la caméra qui se situe dans notre scène. On va effectuer toutes les transformations nécessaires (rotations, translation, homothéties) dans le champ de la caméra pour ce frame.
  4. Le clipping : Détermine les objets à afficher ou non selon le champ de vision de la caméra (pour éviter d’afficher des éléments que l’on ne voit pas, gain de performance).
  5. Le backface culling : Ici la phase va déterminer quel est l’avant ou l’arrière de chaque face des polygones par rapport à la caméra.
  6. Le tramage : On renseigne les informations comme les poids des objets, les couleurs, les textures appliquées …
  7. Le pixel pipeline : On applique les couleurs (calcul des nuances de gris pour les ombres), les textures (texturing), les couleurs (blending) tout en prenant en compte l’éclairage (ombres).
  8. Gestion des alphas & tests : Pour chaque pixel, on regarde si une information alpha (de transparence) est disponible. Ainsi on calcul la profondeur de champ derrière si l’élément est transparent, on regarde quels objets cachent quels objets. Il est possible d’appliquer à cette étape un test brouillon, qui va améliorer la gestion des ombres entre le positionnement et la transparence des éléments.
  9. Fog & Alpha blending : On gère ici la distance d’affichage. On ajoute une sorte de flou, on estompe les couleurs en fonction de la distance des objets par rapport à la caméra, afin de créer « l’illusion » du lointain.
  10. Le viewport transform : Toute la scène 3D est adaptée à la taille de la fenêtre, de la résolution au moment de ce cycle.
  11. Le frame buffer : C’est la dernière étape, ou on écrit les pixels à l’écran. Souvent maintenant, on utilise la technique du double buffering, pour préparer l’affichage de la prochaine frame. Ce qui évite un léger tressaut/scintillement lors du rafraichissement de la frame en single buffering.

Pour les mots que vous n’auriez pas compris, certains vont être expliqués un peu plus loin.

Espace 3D

Les systèmes de coordonnées

Les coordonnées cartésiennes

CoordinA gauche, on a un repère de coordonnées en 2D, et à droit un repère en 3D. C’est globalement le systèmes de coordonnées dans un plan le plus basique.

Pour la figure de gauche (2D) le point o peut se noter : o(x,y)

Sur celle de droite (3D) le point o se notera : o(x,y,z)

Les coordonnées cylindriques

cylin

 

Sur la figure de gauche on voit les coordonnées cylindrique 2D et sur celle de droite en 3D.

Pour les coordonnées cylindriques 3D du cylindre représenté en exemple, elles peuvent êtres notées de cette manière :

  • x = ρ.cos(φ)
  • y = h
  • z = ρ.sin(φ)

Les coordonnées sphériques

coord_spheriques

 

Les coordonnées du point d’intersection entre les flèches bleue et rouge peut être notée comme suit :

  • Rayon (altitude)
  • Latitude
  • Longitude

 Orientation dans l’espace

Il existe plusieurs méthodes pour « s’orienter » dans l’espace (naviguer avec la caméra).

1ère méthode : Un vecteur permet de situer la caméra et donne la définition du haut/bas.

2ème méthode : Avec les angles d’Euler (alpha, bêta, gamma) on se positionne dans l’espace. Ces 3 angles sont aussi nommés précession, nutation et rotation propre.

On pourrait comparer ce type de positionnement avec les représentations dans l’espace des avions/bateaux :

  • La direction -> l’azimut
  • L’inclinaison gauche/droite -> le roulis
  • L’inclinaison avant/arrière -> le tangage

3ème méthode : Les quaternions. Ce sont des matrices de 4×4 qui permettent de définir des transformations et positions en tout genre.

Projection 3D vers 2D

 Projections cartographiques

Il existe des projections possibles entre le 3D vers le 2D. Ces projections peuvent par exemple servir à cartographier une zone. Aucune méthode n’est parfaite, on perd à chaque fois un minimum d’informations (précision des formes, échelles des éléments, …). Globalement, il existe deux types de projections. Si on veut se diriger en priorité vers de la conservation de formes, angles, … on utilisera un type conforme; ou alors, si on préfère garder les dimensions (échelles) proches de la réalité, on utilisera un type de méthode équivalent.Je vais liste en dessous certaines des méthodes les plus utilisées, mais sans décrire leur fonctionnement dans le détail :

  • Projection de Mercator : projection majoritairement utilisé pour faire les cartes
  • Projection de Peters : se caractérise par un étirement des coins
  • Projection de Lambert : elle permet de cartographier des pays. On pose un cône virtuel sur la terre, puis on met à plat la zone de contact entre le cône et la terre. Un peu à la manière d’un papier calque enroulé en cône que l’on ferait porter à la terre, pour ensuite décalquer les zones en contact.
  • Projection gnomonique : majoritairement utilisée pour cartographier les fonds sous-marins.

 

Projections de scène

Ici on va travailler sur les perspectives.

  • Perspective cavalière : Dans la perspective cavalière les x et les y sont respectés. Seul l’axe z est réduit (de 50 ou 30%) afin de donner à l’œil une représentation de la réalité.

mx281ci01

  • Perspective isométrique : C’est en quelque sorte une fausse représentation de la 3D, on se base sure une forme ressemblant a un « Y » pour construire les 3 arrêtes de devant de la forme.

33-CubedeKeplerOn distingue bien un hexagone avec un Y situé au centre, représentant les 3 arrêtes des différentes dimensions visible.

  • Perspective conique : Cette perspective permet de représenter des scènes avec 1, 2, 3 ou plus de points de fuite. Les points de fuite sont les axes sur lesquels la distance va être simulée.

Voici par exemple une perspective conique avec un point de fuite :

Perspec2

On constate que toutes les arrêtes on tendance à « fuir » vers le point F, ce qui donne l’impression de distance. J’ai fait un petit dessin (et oui on s’ennuie dans le train parfois :p) qui représente une perspective conique à deux points de fuite, donc j’en profite pour m’en servir comme schéma :

2014-11-03 19.54.48

  •  Perspective curviligne : Cette vue est aussi appelée Fish-Eye (que vous devez connaître). Dans la théorie, c’est une vue compressée en longitude sur les bords et étirée en latitude sur le centre. Voici un exemple de perspective curviligne :

 

source : http://www.acadesign.net

source : http://www.acadesign.net

D’où cette impression « œil de poisson », avec une vue élargie au centre.

Changements de repères

Passage d’un système de coordonnées à un autre

On peut passer du système de coordonnées cartésiennes en cylindriques par exemple grâce à la trigonométrie.

Voici les formules correspondantes; en admettant que le point P possède les coordonnées cartésiennes x, y et z, alors :

φ = arctan y/x = arcsin y/ρ = arccos x/ρ
z = z

A l’inverse, on peut passer du système de coordonnées cylindriques à cartésiennes avec le système suivant :

x = ρ · cos φ
y = ρ · sin φ
z = z

Les repères de la scène

Comme dans notre monde, la scène possède des repères. La scène c’est quoi ? C’est justement notre monde 3D, qui contient tout nos objets et notre caméra.

Et justement, pour pouvoir se positionner correctement dans l’espace, chaque entité possède un repère. A savoir la scène, la caméra et tous les objets.

Transformations

Nous allons voir dans ces parties, les différentes transformations que l’on peut appliquer aux objets dans notre scène.

Coordonnées homogènes

Les coordonnées homogènes sont simplement un changement d’échelle des coordonnées d’un objet.

homogène : (x, y, z, w) <-> ( x/w , y/w , z/w )   : avec w le coefficient d’échelle.

Exemple : Si un point est à 1;1;1, et qu’on lui applique un coefficient w de 0.5, il se trouvera sur 0.5;0.5;0.5.

A(2;3;4) -> (2;3;4;1) donc donc pour un w=2 : (4;6;8;2)

Translation

Soit la translation t (tx, ty, tz), on peut la symboliser de la manière suivante P’ = T . P avec P le point d’origine, P’ le point après la translation et T le quaternion de translation.

Avant de hurler sauvagement en sautant sur votre moteur de recherche favori, je vais vous donner une petite définition du quaternion. Basiquement, c’est une matrice de 4×4, avec laquelle on va effectuer un produit de matrices afin de déterminer le coordonnées d’un point après la transformation qu’elle représente. Pour un quaternion de transformation, il ressemble à cela :

1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1

Voici à quoi ressemble un quaternion de translation. Ces seules variables sont les nouvelles coordonnées de points après translation, le reste de la matrice ne bouge pas.

Rotations

La rotation se caractérise comme suit : P’ = R . P. Comme précédemment, nous allons modéliser les différents quaternions de rotation qui peuvent être utilisés. Il en existe 3 modèles : 1 pour la rotation sur chaque axe.

Quaternion d’une rotation sur x :

1 0 0 0
0 cos(α) -sin(α) 0
0 sin(α) cos(α) 0
0 0 0 1

Quaternion d’une rotation sur y :

cos(β) 0 sin(β) 0
0 1 0 0
-sin(β) 0 cos(β) 0
0 0 0 1

Quaternion d’une rotation sur z :

cos(δ) -sin(δ) 0 0
sin(δ) cos(δ) 0 0
0 0 1 0
0 0 0 1

On remarque qu’il y a toujours des 1 sur la diagonale et que les variables sont situées en carré et disposées différemment selon le type de rotation à effectuer.

Homothétie

On va diminuer ou agrandir un objet avec cette transformation. On peut le faire proportionnellement ou sur un seul axe. C’est la maniabilité des objets 3D qui se caractérise par un coefficient. De la même manière que les coordonnées homogènes, ce coefficient multiplie ou divise les grandeurs. On pose F’ = H . F ou H est le quaternion d’homothétie.

Quaternion :

hx 0 0 0
0 hy 0 0
0 0 hz 0
0 0 0 1

On remarque donc que les chiffres variables ici, sur cette diagonale représentent l’échelle de la structure.

Les projections

Nous allons voir deux types de projections : les projections coniques et cavalières. Respectivement, leur quaternions sont les suivants :

Quaternion de projection conique :

1 0 0 0
0 1 0 0
0 0 1 0
0 0 1/f 0

Quaternion de projection cavalière

1 0 0 0
0 1 0 0
0 0 0 f
0 0 0 1

Note : Dans ces quaternions le chiffre qui passe au 0 en rouge, indique que l’on supprime une profondeur.

Note : Les valeurs en bleu représentent la distance à partir de laquelle se trouve le plan.

Compositions de transformations

Nous allons maintenant appliquer en exemple ce que nous avons vu, en assemblant plusieurs transformations à la suite pour arriver d’un point à un autre. Je vais vous donner un petit exemple.

Admettons que nous partons d’un point P. Nous voulons lui appliquer 3 translations à la suite, puis calculer ses nouvelles coordonnées suite à ces transformations.

On pose donc P’ = T . T . T . P  :  P étant notre point d’origine, P’ le point modifié et T nos translations. On peut décomposer le calcul comme suit :

(1) : P1 = T1 . P

(2) : P2 = T2 . P1

(3) : P3 = T3 . P2  donc P’ = T3 . T2 . T1 . P !

Pour le cas concret je possède un point de coordonnées A(2;3;1) et je veux lui appliquer une translation de 2 sur l’axe des x puis une homothétie de facteur 3.

Je prend le point A(2;3;1;1) et je vais faire un produit matriciel avec mon quaternion de translation de 2 sur l’axe des x :

2
3
1
1

x

1 0 0 2
0 1 0 0
0 0 1 0
0 0 0 1

x

3 0 0 0
0 3 0 0
0 0 3 0
0 0 0 1

= A’

Décomposons le calcul :

On applique en premier la translation au point A :

  • xa1 =  2*1 + 3*0 + 1* 0 + 1*2 =4
  • ya1 = 2*0 + 3*1 + 1*0 + 1*0 = 3
  • za1 = 2*0 + 3*0 + 1*1 + 1*0 = 1
  • wa1 = 1*0 + 1*0 + 1*0 + 1*1 = 1

Les coordonnées du point A1 (après translation) sont donc A1(4;3;1;1) ! Mais il nous reste encore l’homothétie à appliquer. Pas besoin de reposer les matrices et de faire un produit cette fois. Comme on est sur tous les axes, on peut directement multiplier par 3 chaque coordonnées. Pour arriver donc à :

A’ = H . A1 -> A'(12;9;3;1).

Notre point A après une translation de 2 sur l’axe des x et une homothétie de 3 sur tout les axes à donc pour coordonnées 12 en x, 9 en y et 3 en z.

Pages: 1 2 3

Laisser un commentaire