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
-
une équation : couleur = f(x,y,z) on peut même
animer les textures : couleur = f(x,y,z,t).
-
on peut discrétiser la texture par un lattice (cube de matière échantillonné) .
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