Outils pour utilisateurs

Outils du site


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

3D : Théories et Mathématiques - PART 1

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…

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)

eta radian = 180 degre

Donc 1 radian vaut +/- 57.2958 degré d'angle (suivant la valeur de eta pour effectuer la conversion) pour connaître la valeur (exacte) d'un radian, il suffit de:

1 radian = 180/eta degre

Les formules de conversion sont donc les suivantes:

degré -> radian

x radian = angle * (eta/180)

radian -> degré

x degre = rad * (180/eta)

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

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, theta,varphi.

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 : rho, varphi et une distance : z

Conversions entre systèmes de références

Sphérique → Cartésien

x = r * sin (theta) * cos (phi)

y = r * sin (theta) * cos (phi)

z = r * cos (theta)

Cylindrique → Cartésien

x = rho cos(phi)

y = rho sin(phi)

z = z

Calculs et matrices: Méthode LICOL

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:

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)}}{|}

Pour la multiplication, on utilisera la technique “LICOL” (Ligne Colonne), on multiplie chaque ligne par la colonne.

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)}}{|}

Note sur la multiplication par 1

Dans un calcul simple, il est évident que, lorsque l'on multiplie n'importe quelle valeur par 1 on obtient toujours la valeur d'origine :

x prime = x * 1

et donc x' = x

En calcul matriciel , la valeur '1' se présente comme ceci:

delim{|}{matrix{2}{2}{1 0 0 1}}{|}

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:

(x,y,z)

et, ainsi la multiplication d'une matrice par '1' se présente comme ceci :

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}}{|}

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:

x prime = (x*1) + (y*0) + (z*0)

y prime = (x*0) + (y*1) + (z*0)

z prime = (x*0) + (y*0) + (z*1)

Ce qui dans ce cas précis peut s'optimiser par l'application des formules suivantes:

x prime = x * 1

y prime = y * 1

z prime = z * 1

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 :

delim{|}{matrix{4}{4}{ 
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1}}{|}

Il est en effet beaucoup plus simple d'appliquer la méthode LICOL sur des matrices qui ont le même nombre (pair) de lignes et de colonnes (par exemple une matrice 4×1 se multipliera très facilement avec une matrice 4×4)

Ce qui peut se traduire simplement :

x prime = (x*1) + (y*0) + (z*0) + (w*0)

y prime = (x*0) + (y*1) + (z*0) + (w*0)

z prime = (x*0) + (y*0) + (z*1) + (w*0)

w prime = (x*0) + (y*0) + (z*0) + (w*1)

Ou encore en mode “optimisé”, afin de démontré que les matrices, c'est simple :

x prime = x * 1

y prime = y * 1

z prime = z * 1

w prime = w * 1

En résumé, un produit matriciel d'une matrice point “P” avec une matrice de transformation “T” s'écrit comme ceci:

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
}}{|}

Et se résous avec les équations suivantes:

x prime = (x*xa) + (y*xb) + (z*zb) + (w*xd)

y prime = (x*ya) + (y*yb) + (z*yb) + (w*yd)

z prime = (x*za) + (y*zb) + (z*zb) + (w*zd)

w prime = (w*wa) + (w*wb) + (w*wb) + (w*wd)

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:

delim{|}{matrix{4}{4}{ 
ex  0  0  0 
 0 ey  0  0
 0  0 ez  0
 0  0  0  1
}}{|}

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:

x prime = (x*ex) + (y* 0) + (z* 0) + (w* 0)

y prime = (x* 0) + (y*ey) + (z* 0) + (w* 0)

z prime = (x* 0) + (y* 0) + (z*ez) + (w* 0)

w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)

Translation

Si il existe une transformation souvent sous estimée, c'est bien celle-ci, le déplacement d'un point dans l'espace:

delim{|}{matrix{4}{4}{ 
 1  0  0  0 
 0  1  0  0
 0  0  1  0
tx ty tz  1
}}{|}

Voici les formules a appliquer si l'on désire transformer un point particulier:

x prime = (x* 1) + (y* 0) + (z* 0) + (w*tx)

y prime = (x* 0) + (y* 1) + (z* 0) + (w*ty)

z prime = (x* 0) + (y* 0) + (z* 1) + (w*tz)

w prime = (x*tx) + (y*ty) + (z*tz) + (w* 1)

Rappelez vous que w = 1, et donc nos formules peuvent se traduire par:

x prime = x+tx

y prime = y+ty

z prime = z+tz

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):

delim{|}{matrix{4}{4}{
 1  0  0  0
 0  1  0  0
 0  0 (-1)  0
 0  0  0  1 }}{|}

Voici les formules a appliquer si l'on désire transformer un point particulier:

x prime = (x* 1) + (y* 0) + (z* 0) + (w* 0)

y prime = (x* 0) + (y* 1) + (z* 0) + (w* 0)

z prime = (x* 0) * (y* 0) * (z*-1) + (w* 0)

w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)

Effet miroir par rapport au plan x/z (chaque coordonnée 'y' sera inversée):

delim{|}{matrix{4}{4}{
 1  0  0  0
 0 (-1)  0  0
 0  0  1  0
 0  0  0  1 }}{|}

Voici les formules a appliquer si l'on désire transformer un point particulier:

x prime = (x* 1) + (y* 0) + (z* 0) + (w* 0)

y prime = (x* 0) + (y*-1) + (z* 0) + (w* 0)

z prime = (x* 0) * (y* 0) * (z* 1) + (w* 0)

w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)

Effet miroir par rapport au plan y/z (chaque coordonnée 'x' sera inversée):

delim{|}{matrix{4}{4}{
(-1)  0  0  0
 0  1  0  0
 0  0 1  0
 0  0  0  1 }}{|}

Voici les formules a appliquer si l'on désire transformer un point particulier:

x prime = (x*-1) + (y* 0) + (z* 0) + (w* 0)

y prime = (x* 0) + (y* 1) + (z* 0) + (w* 0)

z prime = (x* 0) * (y* 0) * (z* 1) + (w* 0)

w prime = (x* 0) + (y* 0) + (z* 0) + (w* 1)

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é

delim{|}{
matrix{4}{4}{
(cos(ay)) 0 (- sin(ay)) 0
      0  1   0   0
(sin(ay)) 0  (cos(ay)) 0
 0 0  0  1}}{|}

Voici les formules a appliquer si l'on désire transformer un point particulier:

x prime = (x* cos(ay)) + (y*       0) + (z* -sin(ay)) + (w* 0)

y prime = (x*       0) + (y*       1) + (z*       0) + (w* 0)

z prime = (x* sin(ay)) + (y*       0) + (z* cos(ay)) + (w* 0)

w prime = (x*       0) + (y*       0) + (z*       0) + (w* 1)

Autour de l'axe X, avec un angle de ax degré

delim{|}{
matrix{4}{4}{1 0 0 0 
0 (cos(ax))  (sin(ax)) 0
0 ( -sin(ax))  (cos(ax))  0
 0 0  0  1}}{|}

Voici les formules a appliquer si l'on désire transformer un point particulier:

x prime = (x*      1) + (y * 0) + (z * 0) + (w* 0)

y prime = (x*       0) + (y* cos(ax)) + (z* sin(ax)) + (w * 0)

z prime = (x* 0) + ( y * -sin(ax)) + (z* cos(ax)) + (w* 0)

w prime = (x*       0) + (y* 0) + (z*       0) + (w* 1)

Autour de l'axe Z, avec un angle de az °

delim{|}{matrix{4}{4}{
(cos(az)) (sin(az)) 0 0
( -sin(az)) (cos(az)) 0 0
       0       0 1 0
       0       0 0 1}}{|}

Voici les formules a appliquer si l'on désire transformer un point particulier:

x prime = (x*   cos(az)) + (y* sin(az)) + (z* 0) + (w* 0)

y prime = (x*  -sin(az)) + (y* cos(az)) + (z* 0) + (w* 0)

z prime = (x*       0) + (y*       0) + (z* 1) + (w* 0)

w prime = (x*       0) + (y*       0) + (z* 0) + (w* 1)

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).

back2root/programmation/3d-theories-et-mathematiques-part-1.txt · Dernière modification: 2021/08/05 10:51 de frater