TECHNIQUES 3D

Le problème de représentation d'un espace dans un plan ne date pas de l'arrivée des écrans, au fil de l'histoire, des egyptiens à certains peintres de la renaissance plusieurs techniques ont été mises au point.

Il existe plusieurs types de projections (parallele, isométrique, dimétroique, trimétrique, perspective).

La projection parallèle conserve la forme et les proportions. La perspective ne conserve plus la forme mais la déforme tel que l'humain projette l'espace en un point (l'oeuil). Les objets ont donc un effet de racourci et aussi un (ou plusieurs) point de fuite.

Généralement dans un rendu 3D temps-réel on utilise la projection perspective.

Evidemment, la technique la plus rapide (et aussi la plus simple) est la projection parallele que j'ai choisie d'implementer.

PROJECTION

On effectue les calculs de projection par matrices de transformation.
Les rotations sont réalisées en partie grace aux opérations trigonométriques (sin & cos) , ce qui en terme de rapidité a un coût (plus de 20 cycles). Donc on peut y remédier en précalculant une table de sinus et cosinus pour un angle de 0 à 360 degrés avec une résolution appropriée.

ELIMINATION DES PARTIES CACHEES

L'élimination des parties cachées est un problème à plusieurs solutions :
Algo Z-Sorting (algo du peintre) :
- pour chaque facette de la geometrie
   - calculer le centre de gravité
- trier les facettes par rapport à la composante z du centre
- pour chaque facette de la plus lointaine à la plus proche
   - tracer la facette
L'opération consiste à trier les facettes de la plus lointaine à la plus proche de la caméra et ensuite de les dessiner une à une, ainsi les facettes lointaines sont recouvertes par les proches.
On travaille donc dans l'espace Objet puis dans l'espace Image.
Cette technique naïve provoque des incohérences dans le cas d'intersections de facettes. De plus l'opération de tri (même algos rapides) est fastidieuse et le temps de calcul croît avec le carré du nombre de facettes.

Cf: [Robert-1963] , [Appel-1967] , [Loutrel-1967] , [Galimberti/Montanari-1969]

Algo Zbuffer :
- pour chaque facette de la géométrie
   - calculer le triangle projeté
      - pour chaque pixel du triangle : screen[x][y]
          - calculer le point correspondant dans l'espace 3D
             - si le point.Z > zbuffer[x][y] {
                  zbuffer[x][y] = point.Z
                  dessinne le pixel de la couleur de la facette
                    
Une autre approche est de faire le chemin inverse du pixel au point 3D. On travaille donc dans l'espace Image puis dans l'espace Objet.
Ainsi on discrétise le traitement, et on obtient rapidement des surfaces colorées et nuancées à l'écran.

Cf: [Rommey-1967] , [Warnock-1968] , [Bouknight-1969] , [Watkins-1970] , [Atherton-1983]

Mon implantation actuelle du Zbuffer fournit des résultats relativement satisfaisants, mais il faut faire attention aux problèmes d'approximation lorsque les facettes deviennent minuscules.

Algos Hybrides :
Ceux-ci consistent à travailler séquentiellement dans les deux espaces, ainsi on optimise la 2eme passe qui parcourt les facettes dans l'ordre optimal
Cf: [Schumacker-1969] , [Newell-1972] (Algorithme du peintre)
Algo S-buffer :
Approximation du Zbuffer, le traitement se fait ligne par ligne et non plus pixel par pixel, l'accélération est considérable.
Algo BSP Tree :
Le BSPtree (Binary space Partitioning tree) est une bonne technique mais son implémentation est beaucoup plus rude. L'idée est de décomposer les facettes et leur intersection dans un arbre binaire.

SURFACE

Différentes techniques de rendu 3D permettent d'augmenter le réalisme, ceci en donnant un aspect aux facettes.

Remplissage de Triangles
L'algorithme optimal et de décomposer un triangle en deux triangles : suppérieur et inférieur et de balayer ligne par ligne (calculer les coefficients directeurs des droites limites)
Notes java : cependant cet algorithme est moins performant que l'utilisation de la classe Polygon de java.awt : En effet, les classes java.awt.* sont natives c'est à dire qu'elles sont executées par l'OS et non la JVM.
Lissage de Gouraud :
Calcul de la couleur aux arrêtes puis interpolation.
Lissage de Phong :
interpolation des normales
Textures Procédurales :
Les surfaces des matériaux sont définies en 3D, soit par Le résultat est plus réaliste car la projection d'un plan sur une facette engendre des défauts (déformations).
Bumpmapping :
Technique avancée permettant de créer un effet de relief aux surfaces parfaitement planes (rugosité d'un crépis ...). Ceci en perturbant la normale au point (pour le modèle d'illumination).
Environement Mapping
Reflexion map

RESSOURCES

Cours :
Cours & Exemples : http://www.hornet.org/code/3d
Tutorial : http://3dica.foxfiber.net , http://www.geocities.com/SiliconValley/Park/9784/tut.html
Demo-makers :
http://www.demoscene.org , http://www.ojuice.net , http://www.cfxweb.net/pages/Articles/Java/
Misc :
NVidia : http://www.nvidia.com/Marketing/Developer/DevRel.nsf/WhitepapersFrame?OpenPage