CODING ★ 3D TEMPS REEL : Les vecteurs ★

3D en Temps Reel

Halte à la précipitation ! La 3D en temps réel (communément appelée cyper-multimédîa-monde-viruel) est un domaine relativement complexe. Plutôt que de nous précipiter sur notre compilateur, nous vous proposons un peu de théorie (m'enfin... pourquoi vous partez ? )

Dans le numéro 28 de PC Team (octobre 97), nous avions donné une définition de l'espace à trois dimensions, composé des éléments suivants : le centre (ou origine), les trois axes x,y, z. Nous avions vu comment représenter un point dans cet espace en utilisant trois coordonnées. Cependant, nous ne pourrions pas faire grand chose si nous ne disposions que de ces fameux points. Nous allons donc découvrir ensemble des outils mathématiques qui vont nous aider à gérer ce fameux espace tridimensionnel. Commençons par les vecteurs, nous aborderons les matrices le mois prochain.

Les vecteurs

Un point de l'espace est un triplet du type : ( x ,  y ,   z  )

où x, y et z sont les coordonnées de ce point relativement aux axes x, y et z. On définit aussi deux types de vecteurs : les vecteurs lignes et les vecteurs colonnes :

[ x y z ]    : vecteur ligne
|   x   | : vecteur colonne
|   y   |
|   Z   |


Figure 1 : quelques vecteurs [ 1 1 1 ] parmi tant d'autres

Nous verrons les différences entre ces deux types de vecteurs un peu plus tard, retenons pour l'instant les vecteurs lignes plus faciles à représenter avec du texte. Contrairement aux points, les vecteurs ne donnent pas une position précise dans l'espace mais une longueur, une direction (orientation) et un sens. Un vecteur se représente par un segment (direction et longeur) ainsi qu'une flèche (sens). Par exemple, le vecteur [ 1,0, 0 ] donne la même orientation que l'axe des x et la flèche pointe vers les x croissants. Avec seulement trois informations (x,y,z), il faut bien comprendre qu'un vecteur ne peut plus donner d'information de position. Il y a donc une infinité de vecteurs de mêmes coordonnées dans l'espace. La figure 1 montre par exemple plusieurs vecteurs [1  1  1 ]. Dans le même ordre d'idée, les vecteurs lignes et colonnes de mêmes coordonnées désignent la même direction et le même sens, seule leur écriture diffère. On dit que deux vecteurs sont coli-néaires s'ils ont la même direction et le même sens.


Figure 2 : définitions et opérations de base sur les vecteurs du plan.

Avec deux points, nous pouvons représenter une droite (la droite passant par ces deux points) mais c'est une méthode peu pratique. On préfère en effet désigner une droite par son orientation, c'est le premier intérêt des vecteurs. Supposons qu'une droite passe par les points A ( xA, yA, zA) et B ( xB, yB, zB). On peut définir le vecteur [AB] = [ xB-xA yB-yA zB-zA ]. Dès lors, on peut utiliser A et B ou A et [AB] pour désigner notre droite AB. L'utilisation du vecteur donne une information supplémentaire : le sens, vous verrez que cela peut être très utile.

La longueur d'un vecteur est donnée par la formule suivante :

d  (   [ x    y    z]   )   =    racine   (    x*x    + y*y +  z*z  )

Un vecteur unitaire est un vecteur de longueur 1. Pour obtenir le vecteur unitaire correspondant à un vecteur quelconque, il suffit de calculer : vecteur unitaire =  [  x / d    y/d   z/d ]

où d est la longueur du vecteur. Les vecteurs unitaires sont très souvent utilisés, notamment dans le cadre du produit vectoriel (voir plus loin).

Pour l'instant, nous nous sommes placés dans un espace à trois dimensions dans lequel un vecteur est généralement représenté (vous verrez que ce n'est pas toujours le cas) avec trois coordonnées mais les vecteurs se généralisent dans des espaces à n dimensions (voir encadré). On appelle dimension du vecteur le nombre de coordonnées. Par exemple, un vecteur du plan est généralement représenté avec seulement deux coordonnées : x et y.

Opérations de base

Certaines opérations usuelles sont disponibles sur les vecteurs. Ces opérations de base supposent que les vecteurs sont de même type (colonne ou ligne) et de même dimension. Pour simplifier les choses, nous nous plaçons dans un espace à deux dimensions (enlevez le 2). Dans tout ce qui suit, u et v sont des vecteurs de même type et de même dimension.

- Vecteur opposé : - [ x   y ] = [ -x  -y ]

- Addition de vecteurs : [ x  y ] + [ x'  y' ] = [ x + x' y + y' ]

remarque : u - v   =   u + (-v)

- Multiplication par un réel : a * [ x y ] = [ a * x   a * y ]

La figure 2 permet de se rendre compte de l'effet de ces opérations sur des vecteurs du plan.

Le produit scalaire de deux vecteurs

Cette opération sur les vecteurs est fondamentale, lisez et relisez cette section tant que vous n'avez pas compris comment cela fonctionne. Une première définition de ce produit scalaire sur des vecteurs à trois dimensions est la suivante :

[ x  y  Z] . [ x'  y'  z']  =  x * x'  +  y * y' + z * z'

Le produit scalaire est donc un nombre et non un vecteur mais cette formule ne nous dit pas grand chose sur la signification de cette valeur. Nous avons donc une deuxième définition, beaucoup plus explicite :

u.v = d  (u)   *    d  (v)     * cos   (u,v)

En français, cela s'interprète de la manière suivante : Le produit scalaire de u et de v est égal à la longueur de u que multiplie la longueur de v que multiplie le cosinus de l'angle entre u et v. Le principal intérêt du produit scalaire est donc le calcul de l'angle entre deux vecteurs. On utilise la formule suivante :

cos  (u,v )     >      u.v    /     ( d  (u)   * d(v)   )

d'où angle (u,v) = acos (cos(u,v)) = acos ( u.v / ( d (u) * d(v) ) )

remarque : acos est le cosinus inverse :  acos( cos (alpha)) = alpha

Exemple :

Si u = ( 3  -4   2 ]  et  v = [ 7  -2-1] alors u.v = 3*7 + -4*-2  + 2*-1 = 27 de plus, d(u) = 29 et d(v) = 54

d'où angle (u,v) = acos ( 27 / (29*54) ) =1,55 radians environ

Pour obtenir l'angle en degrés, on utilise :

1 radian  =  180/ PI   degrés   (rappelez-vous, PI = 3.1415926 et des poussières infinies)
Donc angle(u,v) = 89 degrés environ

Si vous trouvez cela compliqué, sachez quand même que nous utiliserons le produit scalaire dans de nombreux cas : éclairage, surfaces cachées, etc. La figure 3 pourra vous aider si vous êtes perdus.


Figure 3 : le produit scalaire pour calculer l'angle entre deux vecteurs.

Le produit vectoriel et les normales

Le produit scalaire n'a pas l'exclusivité en matière de "multiplication" de vecteurs. Le produit vectoriel définit lui un vecteur comme résultat. Cette opération ne peut se réaliser que sur des vecteurs d'au moins 3 dimensions. Dans ce dernier cas, la formule de calcul est la suivante :

u =   [ x   y    z  ]  et  v =  [ x'   y'   z'  ]
u ^ v =     [    x*z'  - z*y'      x*z'   - z*x'     x*y' - y*x' ]

Le pourquoi du comment de cette formule dépasse largement le cadre de cette initiation mais l'essentiel, c'est que cela fonctionne. Le tout est de connaître les propriétés du vecteur résultat. Supposons que les deux vecteurs en trois dimensions u et v ne sont pas de même direction. Avec la donnée supplémentaire d'un point, ils définissent ce que l'on appelle un plan. Le produit vectoriel de u et v, w est un vecteur perpendiculaire au plan ainsi défini. Prenez votre main droite, si u est votre pouce et v votre index, alors l'orientation et la direction de w est donnée par votre majeur (ne faites pas l'expérience dans la rue !). La normale du plan est le produit vectoriel unitaire (de longueur 1). Le produit vectoriel est tout aussi fondamental que le produit scalaire en 3D, encore une section à lire et relire ! La figure 4 est heureusement là pour accompagner ces explications. Ouf ! C'est terminé pour cette fois-ci mais n'oubliez pas que nous aborderons les matrices le mois prochain, un autre sujet intéressant mais relativement théorique, à vos cervelles !


Figure 4 : le produit vectoriel de u et de v , perpendiculaire au plan défini par u et v.

PCTEAM n°30, decembre 97

★ ANNÉE: 1997
★ AUTEUR: FRED PESCH

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 833 millisecondes et consultée 2379 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.