Outils pour utilisateurs

Outils du site


back2root:programmation:3d-theories-et-mathematiques-part-2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
tutoriaux:3d-theories-et-mathematiques-part-2 [2021/05/03 02:20] – créée fraterback2root:programmation:3d-theories-et-mathematiques-part-2 [2023/01/07 11:01] (Version actuelle) – ↷ Liens modifiés en raison d'un déplacement. frater
Ligne 1: Ligne 1:
-====== Tutoriaux: 3D : Théories et Mathématiques - PART ======+====== 3D : Théories et Mathématiques - PART ======
  
-===== Introduction ===== 
- 
-Petite piqûre de rappel; le calcul en 3 dimension n’est pas plus compliqué que le calcul en 2 (ou en 1) dimension, tous le monde est capable d'additionner et de multiplier des nombres... 
- 
-Le calcul en 1 dimension est en fait le calcul d’algèbre classique, que vous faites tous les jours en faisant vos courses par exemple. 
- 
-Le calcul en 2 dimension est de la géométrie simple, rappelez vous les translations, homothéties, rotations, (bon ce dernier point est souvent abordé en cours de trigonométrie), mais en réalité, le calcul 3D n’est jamais que l’extension des deux premiers espaces, ou si on est « positif », le calcul en 2 dimensions ou algébrique n’est jamais qu’une simplification du calcul en 3D. 
- 
-Malheureusement, pour comprendre et "masteriser" la 3d sur ordinateur, un gros bloc de théorie mathématique est a lire, je vais essayer de le faire aussi court mais complet que possible... 
- 
-===== Système de références ===== 
- 
-Tout est une question de références, il existes trois grands systèmes pour décrire un espace en trois dimensions, il existe trois grands « système » de représentation mathématique. 
- 
-==== Le système cartésien ==== 
- 
-Sans doute le plus simple a comprendre car le plus proche de notre mode « mathématique ». 
- 
-Une coordonnée est exprimée « simplement » avec avec trois coordonnées : x, y, z 
- 
-=== Radian vs Degré === 
- 
-Très souvent, dans les fonctions de trigonométriques informatiques, les angles sont exprimés en radian, et non en degrés (d'angle). 
- 
-un radian est une valeur réel, alors qu'un degré d'angle est généralement un entier. 
- 
-Notre cerveau a plus facile a manipuler la notion même de degré d'angle, car les valeurs nous sont plus communes : 0°, 90° pour un angle droit, 180°, etc... 
- 
-pourtant, il est impératif d'utiliser des radians lorsqu'on fait des calculs trigonométriques, nous allons directement voir la relation entre radian et degré d'angle (180 degré d'angle, correspondent à Π radian) 
- 
-<WRAP center round box 60%><m 14>eta radian = 180 degre</m></WRAP> 
- 
-Donc 1 radian vaut +/- 57.2958 degré d'angle (suivant la valeur de <m 14>eta</m> pour effectuer la conversion) pour connaître la valeur (exacte) d'un radian, il suffit de: 
- 
-<WRAP center round box 60%><m 14>1 radian = 180/eta degre</m></WRAP> 
- 
-Les formules de conversion sont donc les suivantes: 
- 
-== degré -> radian == 
- 
-<WRAP center round box 60%> 
-<m 14>x radian = angle * (eta/180)</m> 
-</WRAP> 
- 
- 
-== radian -> degré == 
- 
-<WRAP center round box 60%> 
-<m 14>x degre = rad * (180/eta)</m> 
-</WRAP> 
- 
- 
-=== le système sphérique === 
- 
-C’est le système qui est utilisé pour la géolocalisation ou la définition d’objets céleste ; on parle de coordonnées angulaire (appelées latitude et longitude dans la géolocalisation) et d’un rayon (l’altitude pour ce qui est de la géolocalisation, ou distance dans le cas d’objets céleste) :  
- 
-Une coordonnée est exprimée avec un rayon r et deux angles : r, <m 13>theta</m>,<m 13>varphi</m>. 
- 
-=== le système cylindrique === 
- 
-Ce système est le moins rependu, et souvent utilisé pour pour l’étude de mouvements hélicoïdaux ou en rotation autour d’un axe. 
- 
-Une coordonnée est exprimée via deux angles : <m 13>rho</m>, <m 13>varphi</m> et une distance : z 
- 
-=== Conversions entre systèmes de références === 
- 
-== Sphérique → Cartésien == 
- 
-<WRAP center round box 60%> 
- 
-<m 13>x = r * sin (theta) * cos (phi)</m> 
- 
-<m 13>y = r * sin (theta) * cos (phi)</m> 
- 
-<m 13>z = r * cos (theta)</m> 
-</WRAP> 
- 
- 
-== Cylindrique → Cartésien == 
- 
-<WRAP center round box 60%> 
-<m 13>x = rho cos(phi)</m> 
- 
-<m 13>y = rho sin(phi)</m> 
- 
-<m 13>z = z</m> 
-</WRAP> 
- 
- 
-===== Calculs et matrices ===== 
- 
-En calcul 3D, le calcul matriciel la méthode la plus simple pour résoudre les transformations que l'on veut appliquer. 
- 
-De plus, les opérations nécessaires se limitent surtout à deux opérations majeurs : la multiplication des matrices (produit matriciel) et l'addition de matrices. 
- 
-Pour additionner 2 matrices, il s’agit de faire la somme de leurs membres: 
-   
-<WRAP center round box 60%> 
-<m 14>delim{|}{matrix{2}{2}{a1 b1 a2 b2}}{|} + delim{|}{matrix{2}{2}{c1 d1 c2 d2}}{|} = delim{|}{matrix{2}{2}{(a1+c1) (b1+d1) (a2+c2) (b2+d2)}}{|}</m> 
-</WRAP> 
- 
-Pour la multiplication, on utilisera la technique "LICOL" (Ligne Colonne), on multiplie chaque ligne par la colonne. 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{2}{2}{a1 b1 a2 b2}}{|} *  
-delim{|}{matrix{2}{2}{c1 d1 c2 d2}}{|} =  
-delim{|}{matrix{2}{2}{(a1*c1)+(b1*c2) (a1*d1)+(b1*d2) (a2*c1)+(b2*c2) (a2*d1)+(b2*d2)}}{|}</m> 
-</WRAP> 
- 
-==== Note sur la multiplication par 1 ==== 
- 
-Dans un calcul simple, quand on multiplie n'importe quelle valeur par 1 on obtient toujours la valeur d'origine : 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = x * 1 </m> 
-</WRAP> 
- 
- 
-et donc x' = x 
- 
-En calcul matriciel , la valeur '1' se présente comme ceci: 
- 
-<WRAP center round box 60%> 
-<m 14>delim{|}{matrix{2}{2}{1 0 0 1}}{|}</m> 
-</WRAP> 
- 
- 
-Pour des questions pratiques, je ne me pencherais que sur le système cartésien, plus lisible et surtout plus commun, mais sachez qu’il est tout a fait possible de convertir une carte de la galaxie (qui est trouvable en coordonnées sphérique) dans un système cartésien:  
- 
-<WRAP center round box 60%> 
-<m 14>(x,y,z)</m> 
-</WRAP> 
- 
-et, ainsi la multiplication d'une matrice par '1' se présente comme ceci :  
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{3}{1}{x y z}}{|} =  
-delim{|}{matrix{3}{1}{x y z}}{|} *  
-delim{|}{matrix{3}{3}{1 0 0 0 1 0 0 0 1}}{|}</m> 
-</WRAP> 
- 
- 
-Comme tous les langages de programmations n'incluent pas nativement le support de calcul matriciel, il convient de traduire ce produit matriciel en fonction simple (ou en une dimension) et de le faire pour chaque membre de la coordonnée que l'on veut calculer, vu la méthode LICOL que nous avons vu plus haut, cela devient donc: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x*1) + (y*0) + (z*0)</m> 
- 
-<m 14>y prime = (x*0) + (y*1) + (z*0)</m> 
- 
-<m 14>z prime = (x*0) + (y*0) + (z*1)</m> 
-</WRAP> 
- 
- 
-Ce qui dans ce cas précis peut s'optimiser par l'application des formules suivantes: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = x * 1</m> 
- 
-<m 14>y prime = y * 1</m> 
- 
-<m 14>z prime = z * 1</m> 
-</WRAP> 
- 
-==== Coordonnées homogènes ==== 
- 
-Toutefois, pour pouvoir correctement appliquer certaines transformations (notamment la translation), dans certaines littératures, on rends homogènes les matrices, en ajoutant une 4ème valeur w, qui doit TOUJOURS être mise à 1, on parle alors de matrices homogènes : 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{4}{  
-1 0 0 0  
-0 1 0 0  
-0 0 1 0  
-0 0 0 1}}{|} 
-</m> 
-</WRAP> 
- 
-Ce qui peut se traduire simplement :  
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x*1) + (y*0) + (z*0) + (w*0)</m> 
- 
-<m 14>y prime = (x*0) + (y*1) + (z*0) + (w*0)</m> 
- 
-<m 14>z prime = (x*0) + (y*0) + (z*1) + (w*0)</m> 
- 
-<m 14>w prime = (x*0) + (y*0) + (z*0) + (w*1)</m> 
-</WRAP> 
- 
-Ou encore en mode "optimisé", afin de démontré que les matrices, c'est simple :  
- 
-<WRAP center round box 60%> 
-<m 14>x prime = x * 1</m> 
- 
-<m 14>y prime = y * 1</m> 
- 
-<m 14>z prime = z * 1</m> 
- 
-<m 14>w prime = w * 1</m> 
-</WRAP> 
- 
-En résumé, un produit matriciel d'une matrice point "P" avec une matrice de transformation "T" s'écrit comme ceci: 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{1}{ nx ny nz nw}}{|} =  
-delim{|}{matrix{4}{1}{ x y z w}}{|} *  
-delim{|}{matrix{4}{4}{  
-xa xb xc xd 
-ya yb yc yd 
-za zb zc zd 
-wa wb wc wd 
-}}{|} 
-</m> 
-</WRAP> 
- 
-Et se résous avec les équations suivantes: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x*xa) + (y*xb) + (z*zb) + (w*xd)</m> 
- 
-<m 14>y prime = (x*ya) + (y*yb) + (z*yb) + (w*yd)</m> 
- 
-<m 14>z prime = (x*za) + (y*zb) + (z*zb) + (w*zd)</m> 
- 
-<m 14>w prime = (w*wa) + (w*wb) + (w*wb) + (w*wd)</m> 
-</WRAP> 
- 
-On constate immédiatement que l'ajout de la coordonnée "w" a dans cette série d'équations peut influencé grandement (ou pas) les résultats. 
- 
-===== Transformations ===== 
- 
-Tout ensemble de transformations géométrique doit se faire dans un certain ordre qu'il convient de décider à l'avance. 
- 
-Une rotation suivit d'une translation et d'un changement d'échelle, dans cet ordre, ne donneront pas le même résultat qu'un changement d'échelle suivit d'une rotation et enfin de la translation...  
- 
-Sans compter qu'il existe des transformations "plus fun" comme le scissaillement ou le mirroir suivant un plan... 
- 
-Dans cette je ne fournirais que les matrices (et leurs traductions sans optimisation). 
- 
-====== Les changement d'échelle ====== 
- 
-Sans doute la matrice la plus simple, la matrice de transformation d'échelle: 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{4}{  
-ex  0  0  0  
- 0 ey  0  0 
-  0 ez  0 
-  0  0  1 
-}}{|}</m> 
-</WRAP> 
- 
-On peut soit avoir une même échelle pour tout les axes : ex = ey = ez = échelle ou faire un changement d'échelle propre à chaque axes (ce qui peut amener des résultats rigolo). 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x*ex) + (y* 0) + (z* 0) + (w* 0)</m> 
- 
-<m 14>y prime = (x* 0) + (y*ey) + (z* 0) + (w* 0)</m> 
- 
-<m 14>z prime = (x* 0) + (y* 0) + (z*ez) + (w* 0)</m> 
- 
-<m 14>w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)</m> 
-</WRAP> 
-====== Translation ====== 
- 
-Si il existe une transformation souvent sous estimée, c'est bien celle-ci, le déplacement d'un point dans l'espace: 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{4}{  
-  0  0  0  
-  1  0  0 
-  0  1  0 
-tx ty tz  1 
-}}{|}</m> 
-</WRAP> 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x* 1) + (y* 0) + (z* 0) + (w*tx)</m> 
- 
-<m 14>y prime = (x* 0) + (y* 1) + (z* 0) + (w*ty)</m> 
- 
-<m 14>z prime = (x* 0) + (y* 0) + (z* 1) + (w*tz)</m> 
- 
-<m 14>w prime = (x*tx) + (y*ty) + (z*tz) + (w* 1)</m> 
-</WRAP> 
- 
-Rappelez vous que w = 1, et donc nos formules peuvent se traduire par: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = x+tx</m> 
- 
-<m 14>y prime = y+ty</m> 
- 
-<m 14>z prime = z+tz</m> 
-</WRAP> 
- 
-Ce qui doit normalement vous rappeler des souvenirs. 
- 
-====== Réflexion par rapport à un axe ====== 
- 
-Avec cette transformation, il est facile d'avoir le miroir d'un point par rapport à un des axes, cela peut servir soit pour créer un double de l'objet, soit pour le représenter "en mode miroir"... (a vous de voir si vous dupliquez ou non le point) 
- 
-Le plan de "miroir" est toujours défini par rapport a deux axes: 
- 
-Effet miroir par rapport au plan x/y (chaque coordonnée 'z' sera inversée): 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{4}{ 
-  0  0  0 
-  1  0  0 
-  0 (-1)  0 
-  0  0  1 }}{|} 
-</m> 
-</WRAP> 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x* 1) + (y* 0) + (z* 0) + (w* 0)</m> 
- 
-<m 14>y prime = (x* 0) + (y* 1) + (z* 0) + (w* 0)</m> 
- 
-<m 14>z prime = (x* 0) * (y* 0) * (z*-1) + (w* 0)</m> 
- 
-<m 14>w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)</m> 
-</WRAP> 
- 
- 
-Effet miroir par rapport au plan x/z (chaque coordonnée 'y' sera inversée): 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{4}{ 
-  0  0  0 
- 0 (-1)  0  0 
-  0  1  0 
-  0  0  1 }}{|} 
-</m> 
-</WRAP> 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x* 1) + (y* 0) + (z* 0) + (w* 0)</m> 
- 
-<m 14>y prime = (x* 0) + (y*-1) + (z* 0) + (w* 0)</m> 
- 
-<m 14>z prime = (x* 0) * (y* 0) * (z* 1) + (w* 0)</m> 
- 
-<m 14>w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)</m> 
-</WRAP> 
- 
-Effet miroir par rapport au plan y/z (chaque coordonnée 'x' sera inversée): 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{4}{ 
-(-1)  0  0  0 
-  1  0  0 
-  0 1  0 
-  0  0  1 }}{|} 
-</m> 
-</WRAP> 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x*-1) + (y* 0) + (z* 0) + (w* 0)</m> 
- 
-<m 14>y prime = (x* 0) + (y* 1) + (z* 0) + (w* 0)</m> 
- 
-<m 14>z prime = (x* 0) * (y* 0) * (z* 1) + (w* 0)</m> 
- 
-<m 14>w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)</m> 
-</WRAP> 
- 
-====== Rotation autour des axes de références ====== 
- 
-C'est dans les rotations que les choses se compliquent, et que la trigonométrie commence, c'est aussi dans les rotations que l'on prends vraiment la troisième dimension "dans les yeux"; Nous allons différencier les 3 axes, mais en réalité les matrices sont particulièrement similaires... 
- 
-======= Autour de l'axe Y, avec un angle de ay degré ======= 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{ 
-matrix{4}{4}{ 
-(cos(ay)) 0 (- sin(ay)) 0 
-      0  1     0 
-(sin(ay)) 0  (cos(ay)) 0 
- 0 0  0  1}}{|} 
-</m>                    
-</WRAP> 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
- 
-<WRAP center round box 60%> 
- 
-<m 14>x prime = (x* cos(ay)) + (y*       0) + (z*-sin(ay)) + (w* 0)</m> 
- 
-<m 14>y prime = (x*       0) + (y*       1) + (z*       0) + (w* 0)</m> 
- 
-<m 14>z prime = (x* sin(ay)) + (y*       0) + (z* cos(ay)) + (w* 0)</m> 
- 
-<m 14>w prime = (x*       0) + (y*       0) + (z*       0) + (w* 1)</m> 
- 
-</WRAP> 
- 
- 
-======= Autour de l'axe X, avec un angle de ax degré ======= 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{ 
-matrix{4}{4}{1 0 0 0  
-0 (cos(ax))  (sin(ax)) 0 
-0 ( -sin(ax))  (cos(ax))  0 
- 0 0  0  1}}{|} 
-</m> 
-</WRAP> 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
-<WRAP center round box 60%> 
- 
-<m 14>x prime = (x* cos(ax)) + (y* 0) + (z*-sin(ay)) + (w* 0)</m> 
- 
-<m 14>y prime = (x*       0) + (y* 1) + (z*       0) + (w* 0)</m> 
- 
-<m 14>z prime = (x* sin(ax)) + (y* 0) + (z* cos(ay)) + (w* 0)</m> 
- 
-<m 14>w prime = (x*       0) + (y* 0) + (z*       0) + (w* 1)</m> 
-</WRAP> 
- 
- 
- 
-======= Autour de l'axe Z, avec un angle de az ° ======= 
- 
-<WRAP center round box 60%> 
-<m 14> 
-delim{|}{matrix{4}{4}{ 
-(cos(az)) (sin(az)) 0 0 
-( -sin(az)) (cos(az)) 0 0 
-             0 1 0 
-             0 0 1}}{|}</m> 
-</WRAP> 
- 
- 
- 
-Voici les formules a appliquer si l'on désire transformer un point particulier: 
- 
-<WRAP center round box 60%> 
-<m 14>x prime = (x* cos(az)) + (y* sin(az)) + (z* 0) + (w* 0)</m> 
- 
-<m 14>y prime = (x*-sin(az)) + (y* cos(az)) + (z* 0) + (w* 0)</m> 
- 
-<m 14>z prime = (x*       0) + (y*       0) + (z* 1) + (w* 0)</m> 
- 
-<m 14>w prime = (x*       0) + (y*       0) + (z* 0) + (w* 1)</m> 
- 
-</WRAP> 
- 
- 
-====== Conclusions temporaires ====== 
- 
-Avec ces outils, il est possible de modifier un point (ou des points) dans l'espace, et de le(s) placer avec précision où l'on veut (on peut aussi appliquer une transformation puis une autre dans n'importe quel ordre), et créer a chaque fois un nouveau point...  
- 
-Ces transformations modifient la positions des points dans l'univers; nous y reviendrons plus tard... 
- 
-Il est important de noter que ces transformations sont des outils aidant à créer d'autre points, ainsi si l'on dessine une forme (avec des points) sur un plan X/Y, il est très facile de dupliquer ces points en faisant 36 rotations de 10° à chaque fois, et ainsi de créer un objet en 3D "tourné" a partir d'un simple profile. 
- 
-Dans la suite de cet article, je resterais (sauf exception) sur des matrices "classiques" à 3 valeurs (x,y,z). 
  
 ===== Projection sur l'écran ===== ===== Projection sur l'écran =====
Ligne 493: Ligne 14:
 Si l'on désire représenter un point 3D en 2D, après transformation(s), on peut simplement ignorer la coordonnées 'Z' Si l'on désire représenter un point 3D en 2D, après transformation(s), on peut simplement ignorer la coordonnées 'Z'
  
-<WRAP center round box 60%>+<WRAP round box 60%>
 <m 14>x prime = x</m> <m 14>x prime = x</m>
  
Ligne 505: Ligne 26:
  
 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'écran et d'éliminer les valeurs "hors écran" 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'écran et d'éliminer les valeurs "hors écran"
-x' = x' - (sizex/2) 
-y' = y' - (sizey/2)  
  
-if ((x'>=0) and (x'<sizex) and (y'>=0) and (y<sizey)+<code c> 
-  draw_pixel(x',y',1)+x_screen x_transformed - (sizex/2)
 +y_screen y_transformed - (sizey/2;
  
 +if ((x_screen>=0) and (x_screen<sizex) and (y_screen>=0) and (y_screen<sizey))
 +  draw_pixel(x_screen,y_screen,1);
 +</code>
 ==== Projection Simple dit aussi Projection du pauvre ==== ==== Projection Simple dit aussi Projection du pauvre ====
  
 Si l'on désire représenter un point 3D en 2D, après transformation(s), on simuler l'éloignement (par rapport à l'observateur) en faisant un rapport sur la valeur z, après transformation: Si l'on désire représenter un point 3D en 2D, après transformation(s), on simuler l'éloignement (par rapport à l'observateur) en faisant un rapport sur la valeur z, après transformation:
-x' = x / z 
-y' = y / z 
  
-Cette projection transforme un point 3D en 2D en tenant compte de l'éloignement, plus le Z est grand, plus les points projetés se "rapprochent" les un des autres autour du 0,0, et donc donneront l'ilusion d'etre "plus loin".+<WRAP round box 60%> 
 + 
 +<m 14>x prime = x / z</m> 
 + 
 +<m 14>y prime = y / z</m> 
 +</WRAP> 
 + 
 +Cette projection transforme un point 3D en 2D en tenant compte de l'éloignement, plus le Z est grand, plus les points projetés se "rapprochent" les un des autres autour du 0,0, et donc donneront l’illusion d’être "plus loin".
  
 C'est la technique qui est utilisée en peinture (technique du "point de fuite") pour donner un sentiment de "profondeur" à l'image, on parle alors de perspective. C'est la technique qui est utilisée en peinture (technique du "point de fuite") pour donner un sentiment de "profondeur" à l'image, on parle alors de perspective.
Ligne 528: Ligne 56:
  
 <code c> <code c>
-if (z==0)+if (z_screen==0)
 { {
-  x' x +  x_screen x_screen; 
-  y' y+  y_screen y_screen;
 } }
 else else
 { {
-  x' z +  x_screen x_screen z_screen; 
-  y' z+  y_screen y_screen z_screen;
 } }
 </code> </code>
Ligne 547: Ligne 75:
  
 la projection sera dès lors calculée avec les formules suivantes la projection sera dès lors calculée avec les formules suivantes
-x= x*(ez/z) + ex + 
-y= y*(ez/z) + ey+<WRAP round box 60%> 
 +<m 14>prime = x*(ez/z) + ex</m> 
 + 
 +<m 14>prime = y*(ez/z) + ey</m> 
 +</WRAP>
  
 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'écran... 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'écran...
Ligne 560: Ligne 92:
 Si l'on désire appliquer les transformations en prenant en compte la position de l'observateur, il convient d'appliquer la transformation de la caméra, cette transformation inclu une rotation autour de l'axe Z, de l'axe Y et de l'axe X de chaque point par rapport à la position de l'observateur/caméra et à son orientation (du regard). Si l'on désire appliquer les transformations en prenant en compte la position de l'observateur, il convient d'appliquer la transformation de la caméra, cette transformation inclu une rotation autour de l'axe Z, de l'axe Y et de l'axe X de chaque point par rapport à la position de l'observateur/caméra et à son orientation (du regard).
  
-Soit:+ 
 +<WRAP round info 100%>
 x,y,z : coordonnées cartésienne du point a transformer x,y,z : coordonnées cartésienne du point a transformer
 +
 ox,oy,oz : coordonnées cartésienne, position de l'oeil dans l'espace. ox,oy,oz : coordonnées cartésienne, position de l'oeil dans l'espace.
 +
 ax,ay,az : angles de vue , ces angles définissent la direction du regard à partir du point de l'observateur (ox,oy,oz). ax,ay,az : angles de vue , ces angles définissent la direction du regard à partir du point de l'observateur (ox,oy,oz).
 +</WRAP>
  
 Alors la matrice de transformation devient Alors la matrice de transformation devient
-|x'  | 1        0       0|   | cos(ay) 0 -sin(ay)|   | cos(az) sin(az) 0|    |x|   |ox| 
-|y'| = | 0  cos(ax) sin(ax)| * |                1| * |-sin(az) cos(az) 0| * (|y| - |oy|) 
-|z'  | 0 -sin(ax) cos(ax)|   | sin(ay) 0  cos(ay)|               0 1|    |z|   |oz| 
  
-Note: +<WRAP round box 95%> 
 +<m 14> 
 +delim{|}{  matrix{4}{1}  {nx ny nz nw}}{|} =  
 +delim{|}{  matrix{4}{4}  { 1  0  0 0 0 (cos(ax)) (sin(ax)) 0  0 ( -sin(ax)) (cos(ax)) 0 0 0 0 1 }}{|} * 
 +delim{|}{  matrix{4}{4}  { (cos(ay))  0  ( -sin(ay)) 0 0  0  1 0 (sin(ay)) (cos(ay)) 0 0 0 0 0 1 }}{|} *  
 +delim{|}{  matrix{4}{4}  { (cos(az))  ( -sin(az)) 0  0 ( -sin(az)) (cos(az)) 0 0  0 0 1 0 0 0 0 1 }}{|} * ( 
 +delim{|}{  matrix{4}{1}  { x y z w}}{|} -  
 +delim{|}{  matrix{4}{1}  { ox oy oz ow }}{|}  
 +
 +</m> 
 +</WRAP>
  
-Dans l'introduction à la projection, j'ai évoqué l'observateur comme étant un point remarquable du système localisé en (0,0,0), et ayant une direction de regard a angle nul (0°,0°,0°) 
  
-Si l'on n'a pas d'angle de vue (ax=ay=az=0), les matrices de rotation deviennent des matrices "unités" (car (sin(0)=0 et cos(0)=1), et l'on peut dès lors simplifier le produit en "translation" + 
-|x'  |x|   |ox| +<WRAP round tip 100%> 
-|y'| = |y| - |oy| +Dans l'introduction à la projection, j'ai évoqué //l'observateur// comme étant un point remarquable du système localisé en (0,0,0), et ayant une direction de regard a angle nul (0°,0°,0°) 
-|z'  |z|   |oz|+ 
 +Si l'on n'a pas d'angle de vue (ax=ay=az=0), les matrices de rotation deviennent des matrices "unités" (car (sin(0)=0 et cos(0)=1), et l'on peut dès lors simplifier le produit en "translation": 
 + 
 +<WRAP round box 60%> 
 +<m 14> 
 +delim{|}{  matrix{4}{1}  {nx ny nz nw}}{| 
 +delim{|}{  matrix{4}{1}  {x z w}}{|
 +delim{|}{  matrix{4}{1}  {ox oy oz ow}}{|}  
 +</m> 
 +</WRAP>
  
 Mais il ne faut pas oublié que l'observateur est le 0,0,0; ce qui veut dire que ox=oy=oz=0, alors  Mais il ne faut pas oublié que l'observateur est le 0,0,0; ce qui veut dire que ox=oy=oz=0, alors 
-|x'  |x| + 
-|y'| = |y| +<WRAP round box 60%> 
-|z'  |z|+<m 14> 
 +delim{|}{  matrix{4}{1}  {nx ny nz nw}}{| 
 +delim{|}{  matrix{4}{1}  {x z w}}{| 
 +</m> 
 +</WRAP>
  
 Et l'on retombe bien sur une matrice toute simple. Et l'on retombe bien sur une matrice toute simple.
 +</WRAP>
 +
  
 ===== Conclusions ===== ===== Conclusions =====
Ligne 592: Ligne 149:
 vec quelques définitions voici les formules que nous allons implémenter. vec quelques définitions voici les formules que nous allons implémenter.
  
-soit:+<WRAP round info 95%>
 ox,oy,oz    : coordonnées cartésienne, position de l'oeil dans l'espace. ox,oy,oz    : coordonnées cartésienne, position de l'oeil dans l'espace.
 +
 +w           : 1 (valeur de 1 pour simplifier)
 +
 x[],y[],z[] : coordonnées cartésienne des points a transformer x[],y[],z[] : coordonnées cartésienne des points a transformer
-ex,ey,ez    : coordonnées cartésienne de l'écran + 
-                   avec ex=-(sizex/2), ey=-(sizey/2) et ez=1+ex,ey,ez    : coordonnées cartésienne de l'écran avec ex=-(sizex/2), ey=-(sizey/2) et ez=1 
 ax,ay,az    : angles de vue , ces angles définissent la direction du regard à partir du point de l'observateur (ox,oy,oz). ax,ay,az    : angles de vue , ces angles définissent la direction du regard à partir du point de l'observateur (ox,oy,oz).
-                   cx = cos(ax), sx = sin(ax), cy = cos(ay), ...+ 
 +cx = cos(ax), sx = sin(ax), cy = cos(ay), ... 
 nx,ny,,nz   : coordonnées cartésienne, position temporaire de calcul nx,ny,,nz   : coordonnées cartésienne, position temporaire de calcul
 +</WRAP>
  
 pseudo code: pseudo code:
 +
 +<code>
 foreach  foreach 
 { {
Ligne 615: Ligne 181:
   y' = ny*(ez/nz) + ey   y' = ny*(ez/nz) + ey
 } }
 +</code>
 +
 +<nspages back2root/programmation -simpleList -h1 -exclude:start -textPages="Back2Root">
  
 ====== Références ====== ====== Références ======
 +<WRAP round box>
  
 +<WRAP group>
 +<WRAP column>
 +{{ books:covers:3-d-et-vrai-relief-images-de-synthese.jpg?nolink}}
 +</WRAP>
 +<WRAP column>
 **3D et vrai Relief**  **3D et vrai Relief** 
-J.J.Meyer + 
 +J.J.Meyer 
 ISBN: 2-7091-0990-5 ISBN: 2-7091-0990-5
 +
 https://www.amazon.co.uk/3D-vrai-relief-images-synthese/dp/2709109905 https://www.amazon.co.uk/3D-vrai-relief-images-synthese/dp/2709109905
  
 +https://archive.org/details/3-d-et-vrai-relief-images-de-syntheseacme-rare/mode/2up
 +</WRAP>
 +</WRAP>
 +
 +<WRAP group>
 +<WRAP column>
 +{{ books:covers:pcinterdit.jpg?nolink|}}
 +</WRAP>
 +<WRAP column>
 **PC Interdit 2eme édition Windows 95 & Jeux 3D**  **PC Interdit 2eme édition Windows 95 & Jeux 3D** 
 +
 Boris Bertelsons, Mathias Rasch et Jan Erik Hoffmann Boris Bertelsons, Mathias Rasch et Jan Erik Hoffmann
 +
 ISBN: 2-7429-0500-6 ISBN: 2-7429-0500-6
 +
 https://www.amazon.fr/PC-interdit-Collectif/dp/2742905006 https://www.amazon.fr/PC-interdit-Collectif/dp/2742905006
  
 +https://archive.org/details/pcinterdit0000bert/page/n6/mode/2up
 +</WRAP>
 +</WRAP>
 +
 +<WRAP group>
 +<WRAP column>
 +{{ books:covers:internetfordummies.jpg?nolink|}}
 +</WRAP>
 +<WRAP column>
 **Mathematics of 3D Graphics** **Mathematics of 3D Graphics**
 +
 Juan David Gonzalez Cobas Juan David Gonzalez Cobas
 +
 Universidad de Oviedo Universidad de Oviedo
 +
 Blender Conference 2004 Blender Conference 2004
 +
 https://www.cs.trinity.edu/~jhowland/class.files.cs357.html/blender/blender-stuff/m3d.pdf https://www.cs.trinity.edu/~jhowland/class.files.cs357.html/blender/blender-stuff/m3d.pdf
- 
-http://www.ecere.com/3dbhole/mathematics_of_3d_graphics.html 
  
 https://en.wikipedia.org/wiki/3D_projection https://en.wikipedia.org/wiki/3D_projection
  
-https://fr.wikipedia.org/wiki/Projection_(g%C3%A9om%C3%A9trie)+ 
 +https://fr.wikipedia.org/wiki/Projection_affine 
  
 https://fr.wikipedia.org/wiki/Perspective_axonom%C3%A9trique https://fr.wikipedia.org/wiki/Perspective_axonom%C3%A9trique
 +</WRAP>
 +</WRAP>
 +</WRAP>
 +
 +
 +
back2root/programmation/3d-theories-et-mathematiques-part-2.1620001218.txt.gz · Dernière modification : 2021/05/03 02:20 de frater