Ci-dessous, les différences entre deux révisions de la page.
Révision précédente | |||
back2root:programmation:3d-theories-et-mathematiques-part-2 [2021/08/04 19:55] – [Conclusions] frater | — | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== 3D : Théories et Mathématiques - PART 2 ====== | ||
- | |||
- | ===== Projection sur l' | ||
- | |||
- | Il nous reste à aborder le passage de la 3D à la 2D (pour nos " | ||
- | |||
- | Nous avons transformé des points (qui peuvent former des objets) dans un espace à 3 dimensions, avec un point remarquable (0,0,0) qui est le centre de l' | ||
- | |||
- | Par défaut, si l'on applique les formules de projection ci-dessous, l' | ||
- | |||
- | ==== Projection sans distance, projection orthonormée (projection du fainéant) ==== | ||
- | |||
- | Si l'on désire représenter un point 3D en 2D, après transformation(s), | ||
- | |||
- | <WRAP center round box 60%> | ||
- | <m 14>x prime = x</m> | ||
- | |||
- | <m 14>y prime = y</m> | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||
- | === Centrer l' | ||
- | |||
- | Sachant qu'un écran informatique peut afficher des points de 0,0 à sizex, sizey et que les valeurs de x' et y' peuvent quand à elles varier t entre -∞ et +∞, il convient de centrer le 0,0 sur l' | ||
- | |||
- | <code c> | ||
- | x_screen = x_transformed - (sizex/2); | ||
- | y_screen = y_transformed - (sizey/2) ; | ||
- | |||
- | if ((x_screen> | ||
- | draw_pixel(x_screen, | ||
- | </ | ||
- | ==== Projection Simple dit aussi Projection du pauvre ==== | ||
- | |||
- | Si l'on désire représenter un point 3D en 2D, après transformation(s), | ||
- | |||
- | <WRAP center round box 60%> | ||
- | |||
- | <m 14>x prime = x / z</m> | ||
- | |||
- | <m 14>y prime = y / z</m> | ||
- | </ | ||
- | |||
- | Cette projection transforme un point 3D en 2D en tenant compte de l' | ||
- | |||
- | C'est la technique qui est utilisée en peinture (technique du "point de fuite" | ||
- | |||
- | Dans cette projection, Il convient toutefois de prendre en compte le risque d' | ||
- | |||
- | === Cas du ' | ||
- | |||
- | On peut soit ignorer les points qui sont sur l' | ||
- | |||
- | <code c> | ||
- | if (z_screen==0) | ||
- | { | ||
- | x_screen = x_screen; | ||
- | y_screen = y_screen; | ||
- | } | ||
- | else | ||
- | { | ||
- | x_screen = x_screen / z_screen; | ||
- | y_screen = y_screen / z_screen; | ||
- | } | ||
- | </ | ||
- | |||
- | Cette gestion ne vous empêches pas de quand même centrer votre 0,0 et les " | ||
- | |||
- | === Projection sur l' | ||
- | |||
- | Considérons un instant l' | ||
- | |||
- | la projection sera dès lors calculée avec les formules suivantes | ||
- | |||
- | <WRAP center round box 60%> | ||
- | <m 14>x prime = x*(ez/z) + ex</ | ||
- | |||
- | <m 14>y prime = y*(ez/z) + ey</ | ||
- | </ | ||
- | |||
- | Si l'on considère que ex = -(sizex/2) et ey = -(sizey/2), et que ez=1, alors nous retombons sur la formule de la projection du pauvre... qui tiens nativement compte du centrage de l' | ||
- | |||
- | ==== Caméra et point de vue ==== | ||
- | |||
- | Dans les projections précédentes, | ||
- | |||
- | Si l'on désire faire entrer la notion d' | ||
- | |||
- | Si l'on désire appliquer les transformations en prenant en compte la position de l' | ||
- | |||
- | |||
- | <WRAP center round info 100%> | ||
- | x,y,z : coordonnées cartésienne du point a transformer | ||
- | |||
- | ox,oy,oz : coordonnées cartésienne, | ||
- | |||
- | ax,ay,az : angles de vue , ces angles définissent la direction du regard à partir du point de l' | ||
- | </ | ||
- | |||
- | Alors la matrice de transformation devient | ||
- | |||
- | <WRAP center round box 95%> | ||
- | <m 14> | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | ) | ||
- | </m> | ||
- | </ | ||
- | |||
- | <WRAP center round tip 100%> | ||
- | Dans l' | ||
- | |||
- | Si l'on n'a pas d' | ||
- | |||
- | <WRAP center round box 60%> | ||
- | <m 14> | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | </m> | ||
- | </ | ||
- | |||
- | Mais il ne faut pas oublié que l' | ||
- | |||
- | <WRAP center round box 60%> | ||
- | <m 14> | ||
- | delim{|}{ | ||
- | delim{|}{ | ||
- | </m> | ||
- | </ | ||
- | |||
- | Et l'on retombe bien sur une matrice toute simple. | ||
- | </ | ||
- | |||
- | |||
- | ===== Conclusions ===== | ||
- | |||
- | Il est impossible de conclure simplement, mais je vais tenter de résumer au mieux tout ce qui a été vu, et de fournir une matrice/ | ||
- | |||
- | vec quelques définitions voici les formules que nous allons implémenter. | ||
- | |||
- | <WRAP center round info 95%> | ||
- | ox, | ||
- | |||
- | x[],y[],z[] : coordonnées cartésienne des points a transformer | ||
- | |||
- | ex, | ||
- | |||
- | ax, | ||
- | |||
- | cx = cos(ax), sx = sin(ax), cy = cos(ay), ... | ||
- | |||
- | nx, | ||
- | </ | ||
- | |||
- | pseudo code: | ||
- | |||
- | < | ||
- | foreach | ||
- | { | ||
- | dx = x[]-ox | ||
- | dy = y[]-oy | ||
- | dz = z[]-oz | ||
- | |||
- | nx = cy*(sz*dy + cz*dx) - sy*dz | ||
- | ny = sx*(cy*dz + sy*(sz*dy + cz*dx)) + cx*(cz*dy - sz*dx) | ||
- | nz = cx*(cy*dz + sy*(sz*dy + cz*dx)) - sx*(cz*dy - sz*dx) | ||
- | |||
- | x' = nx*(ez/nz) + ex | ||
- | y' = ny*(ez/nz) + ey | ||
- | } | ||
- | </ | ||
- | |||
- | <nspages back2root/ | ||
- | |||
- | ====== Références ====== | ||
- | |||
- | **3D et vrai Relief** | ||
- | J.J.Meyer | ||
- | ISBN: 2-7091-0990-5 | ||
- | https:// | ||
- | |||
- | **PC Interdit 2eme édition Windows 95 & Jeux 3D** | ||
- | Boris Bertelsons, Mathias Rasch et Jan Erik Hoffmann | ||
- | ISBN: 2-7429-0500-6 | ||
- | https:// | ||
- | |||
- | **Mathematics of 3D Graphics** | ||
- | Juan David Gonzalez Cobas | ||
- | Universidad de Oviedo | ||
- | Blender Conference 2004 | ||
- | https:// | ||
- | |||
- | http:// | ||
- | |||
- | https:// | ||
- | |||
- | https:// | ||
- | |||
- | https:// |