+[dPO]+ Feb'99 -- TOULOUSe.fR ASTRAL CORPUSCULE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <<++] PROJECTiON 3D [++>> <<++++++++++++++++++++++>> La projection 3d, n'est pas compliquée ! Je vais vous expliquer et même vous faire un zouli schéma. Rassurez vous (!) je ne vais pas aborder le mapping, ni en flat, ni en gouraud, ni en 2d sur des triangles (de toute manière apres faut lui coller la projection pour mapper de la 3d). Je limite ici l'objectif à un starfield en 3D. Le but d'un algorithme de projection est simple: afficher sur un plan 2D (votre écran) des coordonnées spatiales. Les équations de la projection centrale sont très simples. Mais il y a un petit concept a comprendre d'abord. Imaginez vous avez un objet en 3D devant vous, et entre cet objet et vous il y a un plan de projection 2d (votre écran). Entre vous et ce plan il y a un distance, la distance de vision, que l'on va appeller D. Derrière le plan se trouve un objet dont les coordonnées d'un de ses point, sont A(x,y,z); Considérons le point A', projecté de A sur le plan 2d. Il me faut un schéma pour vous expliquer: A(x,y,z) * ^ \ | \ I | \ I A'(i,j) | * Y | I \ | I \ | Ij \ | I \ | I \ |M M'I \ \\|// Z <---------------------------------> (O.o) <-Observateur. <-------D----------> \°/ (point O) Distance de vision Je sais, c'est dur a comprendre un truc pareil. Bon, l'essentiel est d'y reconnaitre qu'il s'agit d'une configuration pouvant être résolu grâce au théorème de Thalès. Th. de Thàles: "Soit un triangle OM'A'. Un point M de la droite (OM') et un point A de la droite (OA'). Si (MA) // (M'A') alors OM/OM' = OA/OA' = AM/A'M'." Voilà pour la partie qui nous concerne. -(esperons pr vs, que je me sois pas planté)- Je vous laisse arriver tout seul a la conclusion, que voiçi: X', Y': coordonnées sur le plan 2d X, Y, Z: Coordonnées dans l'espace. D: distance de vision. TADAAAAA: X' = D * X / Z Y' = D * Y / Z Voilà tout simplement l'équation de projection. Mais il ne faut pas oublier que votre écran a une certaine dimension et un ratio du au mode video (genre 4/3 ou 16/9 pour les téléviseurs). Second pb, il s'agit d'une projection centrale, et votre écran possède un repère situé en haut à gauche: 1 2 3 4 5... O-->------------ 1 | | 2 \|/ | 3 | | 4 | | ... |_______________| Il faut donc recentrer la projection et ajouter: LARGEUR_ECRAN / 2 LONGUEUR_ECRAN /2 Xe = x' + LARGEUR_ECRAN / 2 Ye = -y' * RATIO + HAUTEUR_ECRAN / 2 Où Xe et Ye, sont les coordonnées sur l'écran. En résumé et en C: (considérons une résolution de 320x200) #define D 256 int X, Y, Z; int Xp, Yp, Xe, Ye; X=50; Y=50; Z=100; Xp = D*X / Z ; Yp = D*Y / Z ; Xe = Xp + 320/2; Ye = -Yp + 200/2; Ici, je me passe du ratio, mais là vous expérimenterez en changeant la Distance de vision; afin d'obtenir divers effets de profondeurs, + ou - réaliste ou bien carrément déformant ! Infos supplémentaires pour réaliser votre starfield: Argh ! J'allais oublié de vous signaler, que lorsque vous aurez fais vos étoiles et décroitre leur Z afin de les faires venir vers vous, à un certain moment, elles passeront dérrière vous (logique, n'est ce pas), il faut alors penser à ne pas les affichers. du style: if ( Z>10 ) buffer[Ye*W+Xe] = color; Vous pouvez biensûr ajouter un Z-buffering a vos étoiles.Il consiste à attribuer aux étoiles les plus lointaines des couleurs sombres, et au fur et à mesure qu'elles se raprochent, faire une montée chromatique vers des couleurs plus claires. Utilisez une palette en dégradé de gris, pour être top dans le Wind. Du noir en passant par touts les gris jusqu'au blanc. Voila, c'est fini c'est a peu près tout, avouez que ce n'est pas compliqué !? A++ +[DPO]+ (dpo@chez.com) http://www.chez.com/dpo http://astralc.citeweb.net