Matrice sous matlab

71
Date de publication : Dernière mise à jour : Ce document est, en partie, une traduction de la FAQ des Matrices et Quaternions, sorte de référence en ligne pour les programmeurs en ce qui concerne ces deux outils fondamentaux du développement 3D. Un grand merci donc à son auteur original, Hexapod, ainsi qu'à Mustapha Bismi pour sa traduction française. Il a également été complété par une partie sur la trigonométrie, partie essentielle du développement de jeux. Cette FAQ a été corrigée et est maintenue par des membres compétents de http:// www.developpez.com, toutefois il se peut qu'une erreur se soit glissée dans celle-ci ou qu'une information soit manquante. Dans ce cas n'hésitez pas à nous contacter et à contribuer à l'enrichissement de cette FAQ. Enfin, je tiens à remercier toutes les personnes qui ont contribué à améliorer et corriger cette FAQ : LeGreg, j.p.mignot, Le Furet, Matthieu Brucher et dourouc05 Sur ce, l'équipe vous souhaite une bonne lecture !

Transcript of Matrice sous matlab

Page 1: Matrice sous matlab

Date de publication :

Dernière mise à jour :

Ce document est, en partie, une traduction de la FAQ des Matrices et Quaternions,sorte de référence en ligne pour les programmeurs en ce qui concerne ces deux outilsfondamentaux du développement 3D. Un grand merci donc à son auteur original,Hexapod, ainsi qu'à Mustapha Bismi pour sa traduction française. Il a également étécomplété par une partie sur la trigonométrie, partie essentielle du développement dejeux.

Cette FAQ a été corrigée et est maintenue par des membres compétents de http://www.developpez.com, toutefois il se peut qu'une erreur se soit glissée dans celle-ciou qu'une information soit manquante. Dans ce cas n'hésitez pas à nous contacter et àcontribuer à l'enrichissement de cette FAQ.

Enfin, je tiens à remercier toutes les personnes qui ont contribué à améliorer et corrigercette FAQ : LeGreg, j.p.mignot, Le Furet, Matthieu Brucher et dourouc05

Sur ce, l'équipe vous souhaite une bonne lecture !

Page 3: Matrice sous matlab

- 3 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

1. Généralités (2) ........................................................................................................................................................................... 42. Matrices (45) ..............................................................................................................................................................................5

2.1. Bases (5) ........................................................................................................................................................................... 62.2. Arithmétique (8) ............................................................................................................................................................. 112.3. Déterminants et inverses (12) .........................................................................................................................................172.4. Transformations (20) ...................................................................................................................................................... 27

3. Quaternions (15) ...................................................................................................................................................................... 414. Trigonométrie (20) ...................................................................................................................................................................50

4.1. Bases (10) ....................................................................................................................................................................... 514.2. Relations trigonométriques (4) ....................................................................................................................................... 634.3. Triangles rectangles (2) .................................................................................................................................................. 654.4. Triangles quelconques (4) .............................................................................................................................................. 68

Page 4: Matrice sous matlab

- 4 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Généralités

Comment participer à cette FAQ ?

Auteurs : Laurent Gomila ,

Si vous avez remarqué une erreur, une simple faute d'orthographe, si vous souhaitez nous faire part d'un manque, oun'importe quoi d'autre : vous pouvez contacter le responsable par MP (loka), ou poster à la suite de ce sujet consacréà la FAQ des Matrices et Quaternions.

Merci !

Que contient cette FAQ ?

Auteurs : Laurent Gomila ,

Cette FAQ a été rédigée pour un public de développeurs 3D. Ainsi vous n'y trouverez pas un cours magistral d'algèbrelinéaire de niveau bac +2, mais des explications simples, allant droit au but, permettant aux développeurs 3D d'avoir sousla main une base de connaissance de référence. De plus, les formules données sont le plus souvent possible accompagnéesdu pseudo-code ou du code C correspondant.

Cependant, il ne faut pas penser que parce que simple cette FAQ est inexacte : sa relecture et sa maintenance sonteffectuées par des personnes compétentes en mathématiques, et un effort est constamment fait quant à l'exactitude desinformations fournies.

Page 5: Matrice sous matlab

- 5 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Matrices

Page 6: Matrice sous matlab

- 6 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Matrices > Bases

Qu'est ce qu'une matrice ?

Auteurs : Hexapod , LeGreg ,

Une matrice est un outil mathématique utilisé dans beaucoup de domaines dont la 3D. On peut les représenter commeun tableau en deux dimensions contenant des valeurs scalaires (entières, réelles ou complexes).

On peut réaliser sur les matrices des opérations proches de celles que l'on applique sur les nombres réels commel'addition, la soustraction, la multiplication ou l'inversion. Cependant à cause de leur nature plus complexe certainesde ces opérations peuvent être définies de plusieurs façons différentes. Par exemple la multiplication peut être membreà membre ou utiliser une formule qui multiplie les lignes de l'une contre les colonnes de l'autre.

Une matrice avec M lignes et N colonnes est appelée une matrice MxN.

Les éléments d'une matrice peuvent être référencés à l'aide de deux valeurs d'index. La notation mathématique"classique" les assigne aux variables 'i' (lignes) et 'j' (colonnes).

Par exemple, si l'on considère une matrice de taille 4x4, alors les éléments de la matrice sont indéxés par les coupleslignes|colonnes :

L'élément en haut à droite de la matrice, à i = 0 et j = 3, est identifié comme suit :

Mi,j = M0,3

Une matrice n'est pas seulement un tableau de valeurs mais elle représente une transformation d'un espace de départvers un espace d'arrivée. Si par exemple, on a un vecteur colonne à deux dimensions, alors on peut définir le vecteurcolonne transformé dans un espace à trois dimensions comme la multiplication d'une matrice 2x3 par ce vecteur colonne(pour la multiplication on peut considérer le vecteur colonne comme une matrice 1x2). Une telle transformation estappelée linéaire parce qu'elle respecte certaines propriétés comme la conservation des facteurs d'échelle (et a un pointfixe qui est l'origine).

Les matrices les plus utilisées en informatique graphique sont donc celles qui transforment les vecteurs à deuxdimensions ou à trois dimensions. Cela inclut notamment les matrices 2x2 qui représentent les transformations linéairesdu plan 2D (rotation, mise à l'échelle autour de l'origine, miroir), et les matrices 3x3 qui représentent les transformationslinéaires de l'espace en 3D (rotation, mise à l'échelle autour de l'origine, miroir).

Les matrices que traitent les cartes graphiques dans la partie "transformation et éclairage" sont des matrices 4x4. Laraison d'être de ces matrices, c'est qu'elles représentent de manière très pratique certaines opérations non linéairesdans l'espace en 3D (translation, projection conique sur un plan), en ajoutant une quatrième coordonnée (la coordonnéehomogène).

Nous n'allons pas détailler ce que sont les coordonnées homogènes et les espaces projectifs qui y sont associés mais pourfaire simple, il y a une loi qui permet de passer de l'espace 3D à l'espace homogène et vice versa :

Page 7: Matrice sous matlab

- 7 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

coordonnées 3D -> coordonnées homogènes :(x, y, z) -> (x, y, z, 1)

coordonnées homogènes -> coordonnées 3D :(x, y, z, w) -> (x/w, y/w, z/w)

Comme dit précédemment, c'est une transformation non linéaire mais qui permet en contrepartie d'extraire la partie"linéaire" d'opérations comme la translation et la projection conique. Ces deux opérations étant parmi les pluscourantes en 3D par ordinateur, il est donc logique que les cartes graphiques les accélèrent.

On peut également rajouter une troisième coordonnée "homogène" à des coordonnées 2D pour les mêmes raisons.

On peut également utiliser des matrices beaucoup plus larges pour des applications comme le traitement d'images(convolutions), le calcul de probabilités (chaines de markhov), l'intelligence artificielle (les réseaux de neurones),l'algorithmique de base (recherche sur les graphes), etc. C'est l'outil de base du scientifique.

Qu'appelle-t-on l'ordre d'une matrice ?

Auteurs : Hexapod ,

L'ordre d'une matrice est l'autre dénomination de la taille d'une matrice. Une matrice à M lignes et N colonnes estdites d'ordre MxN.

Comment représenter une matrice en C ou en C++ ?

Auteurs : Hexapod , LeGreg ,

Les représentations des matrices peuvent être différentes d'un programme à un autre. Il faut notamment faire attentionaux conventions sur les notations qui, si elles sont mélangées, apporteront leur lot de bugs dans vos programmes.

En C et en C++, il y a une manière naturelle de représenter un tableau, via un tableau de flottants à deux dimensions :

float matrice[10][10];

Ce qui permet de se référer à l'élément m(i,j) par un simple

m_ij = matrice[i][j];

Ce n'est évidemment pas la seule manière possible, on peut se référer aux éléments d'une matrice dans une tableau àune seule dimension :

float matrice[100];

Et accéder aux élements avec un calcul un peu plus complexe :

m_ij = matrice[i + j * 10];

Page 8: Matrice sous matlab

- 8 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

C'est là que la convention est importante, parce que l'aurait tout aussi bien pu y accéder par :

m_ij = matrice[i * 10 + j];

Il est également possible de nommer chaque élément séparément et les réunir dans une structure ou une classe. Ouencore les nommer par colonnes ou par lignes en conservant la notation tableau.

struct Matrice1{ float _11, _12, _13; float _21, _22, _23; float _31, _32, _33;};

struct Matrice2{ float ligne1[3]; float ligne2[3]; float ligne3[3];};

Vous rencontrerez probablement toutes ces notations suivant les programmes et parfois mélangées pour tirer partie dela meilleure performance de l'un (passer les vecteurs colonnes/lignes directement), ou la plus grande facilité à déboguerde l'autre.

Enfin, en C++, on essaye généralement d'encapsuler toutes ces considérations dans des classes qui implémentent desméthodes permettant de réaliser les opérations usuelles sans se soucier de la représentation interne (la meilleure solutionde toute évidence).

Attention aux conventions, si l'API prévoit que les éléments d'un vecteur colonne sont adjacents en mémoire on essayeen général de choisir la même convention que celle de l'API que l'on utilise, pour des raisons pratiques et pour éviter desbugs de conversions. Mieux : certaines API comme par exemple Direct3D proposent en standard une classe MATRIXqu'il est sans doute intéressant de réutiliser lorsque l'on démarre un programme à partir de zéro.

Pour les autres, il existe également de nombreuses bibliothèques indépendantes permettant de manipuler les matrices :

• boost::uBLAS (C++)• MTL (C++)

Quels sont les avantages à utiliser des matrices ?

Auteurs : Hexapod ,

L'une des premières questions sur les matrices est : "pourquoi sont-elles tellement utilisées en informatique ?".Intuitivement, il semble que la surcharge dûe aux boucles for et aux multiplications de matrices devrait plus ralentirl'application qu'autre chose.

Cette objection ne tient pas compte de l'utilisation des registres CPU pour gérer les compteurs et des caches de donnéesqui optimisent l'accès mémoire.

De plus, en suivant une approche mathématique pour définir les algorithmes 3D, il est possible de prévoir et de planifierle design d'un système d'animation 3D. Une telle approche permet très simplement d'envisager l'implémentation del'animation des personnages, des courbes splines, de la cinématique inverse, ...

Page 9: Matrice sous matlab

- 9 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Néanmoins, une des objections qui revient fréquemment est qu'il serait plus rapide de juste multiplier chaque paire decoordonnées par les coefficients de rotation pour cette axe, au lieu de réaliser une multiplication vecteur / matrice.

ie. Rotation en X transforme Y et ZRotation en Y transforme X et ZRotation en Z transforme X et Y

Ce qui revient à ceci :

Soient un vertex V = (x, y, z), les angles de rotation (A, B et C) et les translations (D, E, F). L'algorithme est définicomme suit :

sx = sin(A) // Setup - une seule foiscx = cos(A)sy = sin(B)cy = cos(B)sz = sin(C)cz = cos(C)

x1 = x // Rotation de chaque vertexy1 = y * cx - z * sxz1 = y * sx + z * cx

x2 = x1 * cy + z1 * syy2 = y1z2 = z1 * cy - x1 * sy

x3 = x2 * cz - y2 * szy3 = x2 * sz + y2 * czz3 = z2

xr = x3 + D // Translation de chaque vertexyr = y3 + Ezr = z3 + F

Voici le taux de calcul pris par cet algorithme :

Initialisation Par sommet6 fonctions trigonometriques 6 affectations 12 affectations 12 multiplications 9 additions

Admettons qu'il est possible de réaliser la même chose par des multiplication de matrices...

Pour une matrice 4x4, on a :

Initialisation Différence Par sommet Différence6 fonctionstrigonometriques

0 0

18 affectations -12 3 affectations -912 multiplications +12 9 multiplications -36 soustractions +6 6 additions -3

Page 10: Matrice sous matlab

- 10 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

En comparant les deux tables, on peut constater que la préparation d'une matrice de rotation coûte au moins 12multiplications et 12 affectations en plus.

Néanmoins, alors que cela peut sembler étrange, l'économie vient du calcul de chaque vertex. En utilisant lamultiplication de matrice, l'économie faite en calculant juste 4 vertex rattrape la dépense faite plus haut !

Comment relier les matrices au système de coordonnées ?

Auteurs : Hexapod ,

La relation entre les matrices 3x3 ou 4x4 et le système de coordonnées est simple.

Les 3 premières colonnes de la matrice définissent les vecteurs direction respectivement des axes X, Y et Z.

Si une matrice 4x4 est définie en tant que :

Alors, le vecteur direction pour chaque axe est le suivant :

• Axe X = [A E I]• Axe Y = [B F J]• Axe Z = [C G K]

Page 11: Matrice sous matlab

- 11 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Matrices > Arithmétique

Qu'est ce que la matrice identité ?

Auteurs : Hexapod ,

La matrice identité est une matrice qui a autant de colonnes que de lignes, et pour laquelle tous les éléments tels quei = j valent 1 et les autres 0. Par exemple :

Qu'est ce que la diagonale d'une matrice ?

Auteurs : Hexapod ,

La diagonale principale d'une matrice est l'ensemble des éléments pour lesquels le numéro de la ligne est égal à celuide la colonne (Mij où i = j).

Dans le cas de la matrice identité, seul les éléments sur la diagonale sont mis à la valeur 1, tandis que les autres sont à 0.

Qu'est ce que la transposée d'une matrice ?

Auteurs : Hexapod ,

La transposée d'une matrice M, notée MT, est la matrice générée par l'inversion des éléments de la matrice d'originepar rapport à la diagonale :

Mtij = Mji

Cette opération est valable sur toutes les matrices, carrées ou non.

Soit M :

La transposée de M est :

Page 12: Matrice sous matlab

- 12 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Si la matrice est une matrice de rotation, la transposée est la rotation inverse.

Comment ajouter deux matrices ?

Auteurs : Hexapod ,

L'addition peut s'exprimer comme suit :

Rij = Mij + Lij

Néanmoins, les deux matrices doivent être de taille identique.

Par exemple :

Comment soustraire deux matrices ?

Auteurs : Hexapod ,

Cette opération est aussi simple que l'addition :

Rij = Mij - Lij

Néanmoins, les deux matrices doivent être de tailles identiques.

Par exemple :

Page 13: Matrice sous matlab

- 13 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Comment multiplier deux matrices ?

Auteurs : Hexapod ,

Il faut multiplier chaque élément d'une ligne de la première matrice avec chaque élément d'une colonne de la secondeet faire la somme.

On peut l'exprimer comme suit :

Si les deux matrices sont d'ordres :

M = AxB et L = CxD

Alors les deux valeurs B et C doivent être identique.

Dans ce cas, la matrice résultante est d'ordre AxD.

De plus, il est possible de multiplier une matrice 4x4 par une matrice 4xN, mais pas l'inverse.

Par exemple, si M est définie par :

et L par :

Page 14: Matrice sous matlab

- 14 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Alors, la taille de la matrice résultante est 2x4 :

Comment élever une matrice à une puissance quelconque ?

Auteurs : Hexapod ,

Une matrice peut être élevée à n'importe quelle puissance entière. Néanmoins, il y a plusieurs restrictions. Pour chaquepuissance, la matrice doit rester carrée, ie. avoir le même nombre de lignes et de colonnes.

Par exemple,

• M-1 est l'inverse de la matrice.• M0 génère la matrice identité• M1 ne modifie pas la matrice• M2 élève la matrice au carré• M3 élève la matrice au cube

Elever une matrice à une puissance supérieure à 1 revient à la multiplier par elle-même un nombre spécifique de fois.

Par exemple,

• M2 = M x M• M3 = M x M x M

Page 15: Matrice sous matlab

- 15 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Elever la matrice identité à n'importe quelle puissance conserve la matrice identité : In = I.

Comment multiplier un ou plusieurs vecteurs par une matrice ?

Auteurs : Hexapod ,

Le meilleur moyen de réaliser cette tâche est de traiter la liste de vecteurs comme une simple matrice, dont chaquevecteur represente un vecteur colonne.

Si N vecteurs doivent être multipliés par une matrice 4x4, ils peuvent être traités comme une unique matrice 4xN :

Soit la matrice :

Et la liste de vecteurs suivante :

Remarquez qu'une ligne de termes constants est ajoutée à la liste de vecteurs, tous à 1. Cette ligne ne devrait pas exister.C'est simplement pour permettre la correspondance entre les ordres de M et de V.

Exemple de multiplication :

Page 16: Matrice sous matlab

- 16 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Pour chaque vecteur de la liste, il y aura un total de 12 multiplications, 16 additions et 1 division (pour la perspective).

Si la matrice est une matrice de rotation ou de translation, la division peut être annulée.

Page 17: Matrice sous matlab

- 17 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Matrices > Déterminants et inverses

Qu'est ce que le déterminant d'une matrice ?

Auteurs : Hexapod ,

Le déterminant d'une matrice est un réel qui permet entre autre de savoir si la matrice admet ou non un inverse. S'ilest nul, aucun inverse n'existe. Le déterminant n'est calculable que sur les matrices carrées (possédant autant de lignesque de colonnes).

Par exemple, soit la matrice à un seul élément :

Pour une matrice de cette taille, le déterminant est simplement la valeur de l'élément.

Du coup, l'inverse est simplement l'inverse de cet élément :

Si cette valeur est non nulle, l'inverse existe. Dans le cas de la matrice identité, l'inverse est la matrice identité.

Néanmoins, si la valeur de l'élément est nulle, le déterminant est nul également.

Essayer de calculer la réciproque de zéro génère l'infini, ce qui entraine que cette matrice n'a pas d'inverse.

Pour la matrice identité, le déterminant est toujours 1. Toute matrice avec un déterminant égal à 1 est dite isotropique.

Ainsi, toutes les matrices de rotations sont dites isotropiques, puisque leurs déterminant est toujours égal à 1.

Par exemple, soit M une matrice de rotation :

Voici le calcul de son déterminant :

Page 18: Matrice sous matlab

- 18 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Comment calculer le déterminant d'une matrice ?

Auteurs : Hexapod ,

Le déterminant d'une matrice se calcule à l'aide des règles de Kramer, qui permet de le calculer en découpant la matriceen des matrices plus petites.

La formule est la suivante, pour une matrice carrée M de dimension n :

où submati,j(M) définit la matrice composée de toutes les lignes et de toutes les colonnes de M à l'exception de la lignei et de la colonne j.

Pour les petites matrices la formule est immédiate. Par exemple pour les matrices 2x2 :

Et pour les matrices 3x3 :

Qu'est ce qu'une matrice isotrope ou anisotrope ?

Auteurs : Hexapod ,

Une matrice isotrope est une matrice pour laquelle les sommes des carrés des lignes ou colonnes sont égales.

Page 19: Matrice sous matlab

- 19 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Une matrice qui n'est pas dans ce cas est dite anisotrope.

Quand une matrice 3x3 ou 4x4 est utilisée pour tourner ou mettre à l'échelle un objet, il est parfois nécéssaire d'agrandirou de rétrécir un axe plus qu'un autre.

Par exemple, ca peut être utile de vouloir déformer un personnage de type cartoon vers un axe mais pas dans les autres...

Voici une matrice de ce type :

Néanmoins, bien que ce type de matrice s'applique bien pour les vertex, il se peut très bien qu'il y ait des problème avecles normales, en particulier en ombrage de Gouraud.

En effet, les données vertex et les normales sont multipliées par la même matrice, ce qui déforme les normales. N'étantplus normalisées, elles peuvent perturber d'autres calculs comme l'ombrage (shading) ou l'élimination des partiescachées (back-face culling).

Qu'est ce que l'inverse d'une matrice ?

Auteurs : Hexapod ,

Etant donnée une matrice M, l'inverse de cette matrice, noté M-1, est la matrice qui vérifie cette expression :

Où I est la matrice identité.

Ainsi, multiplier une matrice par son inverse génère la matrice identité. Néanmoins, plusieurs conditions doivent êtreréunies pour pouvoir calculer l'inverse d'une matrice.

Celles-ci incluent que la hauteur et la largeur de la matrice soient identiques, et que le déterminant de la matrice soitnon nul.

L'inversion d'une matrice est une tâche souvent réalisée, par exemple pour retrouver l'inverse d'une transformationquelconque.

Comment calculer l'inverse d'une matrice quelconque ?

Auteurs : Hexapod ,

En fonction de la taille de la matrice, le calul de son inverse peut être trivial ou extrêmement compliqué.

Par exemple, l'inverse d'une matrice 1x1 est juste la réciproque de l'élément :

Page 20: Matrice sous matlab

- 20 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

La résolution pour les matrices 2x2 ou plus peut être réalisée à l'aide de Comment calculer l'inverse d'une matrice 2x2 ?ou via un Comment calculer l'inverse d'une matrice à l'aide d'équations linéaires ?.

Néanmoins, dans certains cas comme les matrices Comment calculer l'inverse d'une matrice identité ? ou de Commentcalculer l'inverse d'une matrice de rotation ?, l'inverse est déjà connu ou peut être déterminé à l'aide de la transposéede la matrice.

Comment calculer l'inverse d'une matrice identité ?

Auteurs : Hexapod ,

L'inverse d'une matrice identité est la matrice identité :

La matrice identité a pour déterminant la valeur 1.

Comment calculer l'inverse d'une matrice de rotation ?

Auteurs : Hexapod ,

Voici la forme générale de l'inverse d'une matrice de rotation 3x3 :

A noter que s'il s'agit d'une matrice de rotation autour de X, Y ou Z, inverser la matrice revient à calculer sa Qu'estce que la transposée d'une matrice ?.

Page 21: Matrice sous matlab

- 21 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Il existe également une autre façon de faire, si l'angle et l'axe de rotation sont connus. Il suffit de prendre l'opposé del'angle (-20 pour 20 par exemple) et de calculer une nouvelle matrice de rotation (voir Comment générer une matricede rotation pour un axe et un angle donnés ?).

Comment calculer l'inverse d'une matrice à l'aide de Kramer ?

Auteurs : Hexapod ,

Il faut commencer par calculer le déterminant de la matrice (voir Comment calculer le déterminant d'une matrice ?).

Si le déterminant est non nul, l'inverse de la matrice existe. Dans ce cas, la valeur de chaque élément de l'inverse est :

Cette formule est déduite de la formulation générale de l'inverse en fonction du déterminant :

Avec la commatrice de M définie par :

Le codéterminant (co_det) de l'élement i,j de la matrice M, est le déterminant de la matrice M dont on supprime la ligne

i et la colonne j. Cette série de n2 sous-matrices sont celles nommées submat(M) dans les formules précédentes.

Bien que pratique pour comprendre comment est construit l'inverse d'une matrice, elle est cependant à éviter dans unprogramme car nécessitant des calculs énorméments coûteux au niveau du déterminant.

L'inversion et le calcul de déterminant peuvent donc en général être effectués de manière beaucoup plus efficace, parexemple en utilisant une triangularisation ou une décomposition L.U.

Comment calculer l'inverse d'une matrice 2x2 ?

Auteurs : Hexapod ,

Pour une matrice 2x2, les calculs sont moins complexes. Soit :

Le déterminant est :

Page 22: Matrice sous matlab

- 22 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Et l'inverse se définit par :

Ceci peut être démontré par les règles de Kramer. Soit :

Alors, le déterminant est :

Et l'inverse s'obtient par :

Donc l'inverse de la matrice est :

Page 23: Matrice sous matlab

- 23 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Si le déterminant est non nul.

Comment calculer l'inverse d'une matrice 3x3 ?

Auteurs : Hexapod ,

Pour les matrices 3x3 ou plus, l'inverse peut être calculée soit à l'aide de Kramer, soit par la résolution d'un ensembled'équations linéaires.

Si ont applique les règles de Kramer à la matrice M :

Alors, le déterminant se calcule comme suit :

En supposant que ce déterminant est non nul, alors, l'inverse de la matrice est donnée par :

Ceci peut s'implémenter à l'aide d'une paire de fonctions 'C' :

VFLOAT m3_det(MATRIX3 mat){ VFLOAT det;

det = mat[0] * (mat[4] * mat[8] - mat[7] * mat[5]) - mat[1] * (mat[3] * mat[8] - mat[6] * mat[5]) + mat[2] * (mat[3] * mat[7] - mat[6] * mat[4]);

return det;}

void m3_inverse(MATRIX3 mr, MATRIX3 ma){ VFLOAT det = m3_det(ma);

if (fabs(det) < 0.0005) { m3_identity(ma); return; }

mr[0] = ma[4] * ma[8] - ma[5] * ma[7] / det; mr[1] = -(ma[1] * ma[8] - ma[7] * ma[2]) / det;

Page 24: Matrice sous matlab

- 24 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

mr[2] = ma[1] * ma[5] - ma[4] * ma[2] / det;

mr[3] = -(ma[3] * ma[8] - ma[5] * ma[6]) / det; mr[4] = ma[0] * ma[8] - ma[6] * ma[2] / det; mr[5] = -(ma[0] * ma[5] - ma[3] * ma[2]) / det;

mr[6] = ma[3] * ma[7] - ma[6] * ma[4] / det; mr[7] = -(ma[0] * ma[7] - ma[6] * ma[1]) / det; mr[8] = ma[0] * ma[4] - ma[1] * ma[3] / det;}

Comment calculer l'inverse d'une matrice 4x4 ?

Auteurs : Hexapod ,

Les mêmes méthodes peuvent être appliquées aux matrices 3x3 et aux matrices 4x4.

Un moyen efficace est de réutiliser les fonctions 'C' utilisées pour calculer le déterminant et l'inverse d'une matrice 3x3.

Pour pouvoir utiliser les règles de Kramer, il est nécéssaire de déterminer les sous-matrices :

void m4_submat(MATRIX4 mr, MATRIX3 mb, int i, int j){ int ti, tj, idst, jdst;

/* Parcours des lignes */ for (ti = 0; ti < 4; ti++) { /* Si la ligne courante est inférieure à celle que l'on veut supprimer on garde l'indice tel quel */ if (ti < i) idst = ti; else /* Si la ligne courante est supérieure à celle que l'on veut supprimer on prend l'indice - 1 */ if (ti > i) idst = ti - 1; /* Et bien sûr si on se trouve sur la ligne à supprimer, on ne fait rien */

/* Même traitement avec les colonnes... */ for (tj = 0; tj < 4; tj++) { if (tj < j) jdst = tj; else if ( tj > j ) jdst = tj - 1;

/* Si on ne se trouve pas sur la ligne ou la colonne à supprimer, on recopie l'élément courant dans la sous-matrice, avec le bon indice */ if (ti != i && tj != j) mb[idst * 3 + jdst] = mr[ti * 4 + tj]; } }}

Le déterminant d'une matrice 4x4 peut être calculé comme suit :

VFLOAT m4_det( MATRIX4 mr ){

Page 25: Matrice sous matlab

- 25 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

VFLOAT det, result = 0, i = 1; MATRIX3 msub3; int n;

/* Parcours des colonnes */ for (n = 0; n < 4; n++, i *= -1) { /* Extraction de la sous-matrice obtenue en retirant la colonne n */ m4_submat(mr, msub3, 0, n);

/* Calcul du déterminant de la sous-matrice */ det = m3_det(msub3);

/* Ajout au résultat selon la formule du déterminant */ result += mr[n] * det * i; }

return result;}

Et l'inverse :

int m4_inverse(MATRIX4 mr, MATRIX4 ma){ VFLOAT mdet = m4_det(ma); MATRIX3 mtemp; int i, j, sign;

/* Si le déterminant est nul, on ne peut pas inverser la matrice */ if (fabs(mdet) < 0.0005) return 0;

for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { sign = 1 - ((i + j) % 2 ) * 2;

m4_submat(ma, mtemp, i, j);

mr[i + j * 4] = (m3_det(mtemp) * sign) / mdet; }

return 1;}

Ces fonctions sont d'une utilité incroyable. Elles permettent le calcul de la matrice de base pour les splines, les rotationsinverses et la résolution d'équations matricielles.

Comment calculer l'inverse d'une matrice à l'aide d'équations linéaires ?

Auteurs : Hexapod ,

Soit M :

Page 26: Matrice sous matlab

- 26 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

telle que l'inverse existe :

Alors on a :

Donc, la matrice inverse peut être calculée par la résolution d'un ensemble d'équations linéaires :

Page 27: Matrice sous matlab

- 27 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Matrices > Transformations

Qu'est ce qu'une matrice de rotation ?

Auteurs : Hexapod ,

Une matrice de rotation est utilisée pour tourner un ensemble de points dans un système de coordonnées. Chaque pointa de nouvelles coordonnées, mais leurs distances relatives reste inchangée.

Toutes les rotations sont définies à l'aide des fonctions trigonométriques sinus et cosinus.

Pour un système de coordonnées à deux dimensions, la matrice de rotation est la suivante :

Quand l'angle A est nul, on génère la matrice identité :

Si A vaut +90 degrés, on a la matrice :

Si l'angle vaut -90 degrées :

Prendre l'opposé de l'angle revient à transposer la matrice.

Si la matrice de rotation est multipliée par sa transposée, le résultat est la matrice identité.

Comment générer une matrice de rotation d'axe X ?

Auteurs : Hexapod ,

Utilisez la matrice 4x4 suivante :

Page 28: Matrice sous matlab

- 28 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Comment générer une matrice de rotation d'axe Y ?

Auteurs : Hexapod ,

Utilisez la matrice 4x4 suivante :

Comment générer une matrice de rotation d'axe Z ?

Auteurs : Hexapod ,

Utilisez la matrice 4x4 suivante :

Qu'est ce que les angles d'Euler ?

Auteurs : Hexapod ,

Les angles d'Euler sont le nom donné à un triplet d'angles de rotation (x, y, z) représentant respectivement les rotationsautour des axes X, Y et Z.

Exemples :

(0, 0, 0) génèrera la matrice identité (aucune rotation)(90, 0, 0) est une rotation de 90° autour de X(30, 0, 55) est une rotation de 30° autour de X, suivie d'une rotation de 55° autour de Z

Page 29: Matrice sous matlab

- 29 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

(0, 80, 90) est une rotation de 80° autour de Y, suivie d'une rotation de 90° autour de Z

Qu'est ce que le tanguage (yaw), le roulis (roll) et le piqué (pitch) ?

Auteurs : Hexapod ,

Ces termes sontd'origine aéronautique et correspondent aux rotations à l'aide des Qu'est ce que les angles d'Euler ?(système de coordonnée euclidien), relativement à la base locale d'un avion.

Imaginez vous un avion.

L'axe Z passe par la queue et l'avant de l'appareil.L'axe X part de l'aile gauche à l'aile droite.L'axe Y pointe vers le haut de l'appareil.

Ainsi le piqué devient la rotation autour de l'axe X, le tanguage devient la rotation autour de l'axe Y, et le roulis larotation autour de l'axe Z.

Comment combiner les matrices de rotations ?

Auteurs : Hexapod ,

Les matrices de rotations se combinent en les multipliant entre elles. Attention à l'ordre dans lequel vous les multipliez !Sinon...

Qu'est ce que le gimbal lock ?

Auteurs : Hexapod ,

Le problème de la perte d'un degré de liberté, le gmbal lock, arrive quand on utilise les Qu'est ce que les angles d'Euler ?.Comme la matrice de rotation finale dépend de l'ordre des multiplications, il est possible que parfois, l'une des rotationsautour d'un axe soit confondue avec un autre axe de rotation.

Pire encore, il est devient parfois impossible de tourner l'objet suivant un certain axe. C'est le gimbal lock !

Par exemple, supposons qu'un objet est tourné dans l'ordre Z, Y et X et que la rotation autour de Y soit de 90°.

Dans ce cas, la rotation suivant Z se fait correctement, puisque c'est la première. L'axe Y tourne également correctement.Néanmoins, après cette rotation, l'axe X et l'axe Z sont confondus.

Page 30: Matrice sous matlab

- 30 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Du coup, toutes rotation autour de l'axe X tourne l'objet suivant Z ! Pire encore, il est devenu impossible de tournerl'objet autour de l'axe X.

Comment régler le problème du gimbal lock ?

Auteurs : loka , gouessej ,

La seule solution à ce problème est de transformer les axes de rotations suivants avec les rotations précédentes. Cestransformations requièrent un outil de combinaison de rotations quelconques, ce qui s'avère plus facile avec des Qu'estce que les quaternions ? qu'avec des matrices.

On ne peut pas dire que ce sont les quaternions qui à eux seuls permettent d'éviter le gimbal lock, il est tout à faitpossible de reproduire ce problème avec des quaternions.

Autrement dit, si on note R[0x,a](objet) la rotation autour de l'axe 0x et d'angle a de l'objet, R[Oy,b] la rotation autourde l'axe Oy et d'angle b et R[Oz,c] la rotation autour de l'axe Oz d'angle c, pour combiner les 3 rotations axiales, on fait :

R(objet)=R[R[R[Ox,a](Oy),b]R[Ox,a](Oz),c](R[R[Ox,a](Oy),b](R[Ox,a](objet)))

On conserve ainsi le repère local associé à l'objet qui change après chaque rotation appliqué à celui-ci, on garde ainsitous les degrés de liberté.

Quel est la manière correcte de combiner les matrices de rotations ?

Auteurs : Hexapod ,

En réalité, il n'y a pas de façon correcte de combiner les matrices de rotation. Néanmoins, afin de prédire les résultatsde la combinaison des matrices, un peu d'organisation est nécéssaire.

Le moyen le plus simple de tourner un objet est de multiplier les matrices dans cette ordre :

Où M est la matrice de rotation finale, et X, Y, Z les matrices de rotations individuelles.

Néanmoins, quand la vue de la caméra est évaluée, l'ordre et le signe des rotations est inversé.

Par exemple, si vous êtes debout, et que vous vous tourner vers la droite, tout ce que vous voyez dans votre champs devision semblera tourner vers la gauche.

Par conséquent, le point de vue de la caméra est modélisé à l'aide de l'ordre suivant :

Page 31: Matrice sous matlab

- 31 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Ceci est l'inverse (ou la transposée) de la matrice de rotation de l'objet.

Comment générer une matrice de rotation à partir d'angles d'Euler ?

Auteurs : Hexapod ,

A première vue, la méthode la plus évidente pour générer une matrice de rotation à partir d'un ensemble d'Qu'est ceque les angles d'Euler ? est de générer chaque matrice individuellement et de les multiplier ensembles :

m3_rotx(mat_x, vec -> angle_x);m3_roty(mat_y, vec -> angle_y);m3_rotz(mat_z, vec -> angle_z);m3_mult(mat_tmp, mat_z, mat_y);m3_mult(mat_final, mat_tmp, mat_x);

Cet ensemble d'appels peut être placé dans une routine séparée :

m3_fromeuler(MATRIX *mat_final, VECTOR3 *euler)

Néanmoins, la réalision de cette séquence d'appels est vraiment très inefficace en terme de temps de calculs. Etant donnéque chaque matrice de rotation 4x4 doit avoir 10 éléments avec la valeur 0, 2 autres avec la valeur 1, et 4 autres avec desvaleurs arbitraires, près de 75% de chaque opération matricielle est en fait pure perte ! Ceci n'inclut pas l'initialisationdes matrices...

Un moyen plus efficace doit être trouvé. Heureusement, il existe un autre moyen d'aboutir à la matrice finale.

Si nos trois matrices sont combinées dans un format algébrique, l'expression suivante est définie :

Où :M est la matrice finaleX est la matrice de rotation autour de l'axe XY est la matrice de rotation autour de l'axe YZ est la matrice de rotation autour de l'axe Z

Soit les matrices associées :

Page 32: Matrice sous matlab

- 32 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Où A, B sont le cosinus et le sinus de la rotation autour de l'axe X,C, D sont le cosinus et le sinus de la rotation autour de l'axe Y,E, F sont le cosinus et le sinus de la rotation autour de l'axe Z.

Alors, l'expression :

Peut se partager en 2 multiplications de matrices :

Evaluons M' :

D'où M devient :

Page 33: Matrice sous matlab

- 33 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

C'est la matrice de rotation finale. En tant que matrice 4x4 :

Les valeurs individuelles de A,B,C,D,E et F sont évaluées en premier. Ensuite, on évalue BD et AD puisqu'ils sontfréquent..

Donc, voici l'algorithme final :

A = cos(angle_x);B = sin(angle_x);C = cos(angle_y);D = sin(angle_y);E = cos(angle_z);F = sin(angle_z);

AD = A * D;BD = B * D;

mat[0] = C * E;mat[1] = -C * F;mat[2] = -D;mat[4] = -BD * E + A * F;mat[5] = BD * F + A * E;mat[6] = -B * C;mat[8] = AD * E + B * F;mat[9] = -AD * F + B * E;mat[10] = A * C;

mat[3] = mat[7] = mat[11] = mat[12] = mat[13] = mat[14] = 0;mat[15] = 1;

A l'aide des multiplications de matrices, on aurait dû faire 128 multiplications, 96 additions et 80 affectations.

Avec cet algorithme, on a fait seulement 12 multiplications, 6 soustractions et 18 affectations !

Page 34: Matrice sous matlab

- 34 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Donc, par l'utilisation de l'algorithme optimisé, on réalise un gain de 1000% !

Comment générer des angles d'Euler à partir d'une matrice de rotation ?

Auteurs : Hexapod ,

Cette opération est exactement l'opposé de celle vue plus haut. Soit une matrice de rotation :

Où A, B sont le cosinus et le sinus de la rotation autour de l'axe X,C, D sont le cosinus et le sinus de la rotation autour de l'axe Y,E, F sont le cosinus et le sinus de la rotation autour de l'axe Z.

En utilisant une structure de donnée C pour une matrice 4x4, les valeurs d'index sont les suivants :

En comparant les deux tables, on constate que l'élément [2] a la valeur de -D, soit -sin(Y). Donc, la rotation autour del'axe Y peut être calculée à l'aide d'un sinus inverse. Passer le résultat à la fonction cosinus nous donnera la valeur de C.

Si C est non nul, alors la rotation en X et en Z peut être obtenue des termes respectivement sur la troisième et la premièrecolonne :

/* Axe X */M[6] = -B * C;M[10] = A * C;

/* Axe Z */M[0] = E * C;M[1] = -F * C;

Les angles de rotation peuvent être obtenus en prenant chaque paire de valeurs divisées par C et en passant le résultataux fonctions inverses correspondantes.

Si C est nul, ces calculs sont impossibles. Dans ce cas, l'angle de rotation en Y est de -90 ou de 90°. Donc D vaut 1 ou -1.

Dans ce cas, un gimbal lock s'est produit. Les rotations en X et Z semblent avoir le même axe. Lors du calcul de lamatrice, on a :

Page 35: Matrice sous matlab

- 35 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

D'où :

En arrangeant :

On peut voir la matrice sous cette forme :

Où :V vaut BE - AFW vaut AE + BF

Ces deux valeurs peuvent être vues comme le sinus et le cosinus d'une seule rotation.

L'algorithme final est donc :

angle_y = D = -asin(mat[2]); /* Calcul de l'Angle Y */C = cos(angle_y);angle_y *= RADIANS;

if (fabs(C) > 0.005) /* Gimbal lock ? */{ trx = mat[10] / C; /* Non, donc calcul de l'angle X */ try = -mat[6] / C;

angle_x = atan2(try, trx) * RADIANS;

Page 36: Matrice sous matlab

- 36 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

trx = mat[0] / C; /* Calcul de l'angle Z */ try = -mat[1] / C;

angle_z = atan2(try, trx) * RADIANS;}else /* Gimbal lock */{ angle_x = 0; /* Angle X à 0 */

trx = mat[5]; /* Calcul de l'angle Z */ try = mat[4];

angle_z = atan2(try, trx) * RADIANS;}

angle_x = clamp(angle_x, 0, 360); /* Modulo ;) */angle_y = clamp(angle_y, 0, 360);angle_z = clamp(angle_z, 0, 360);

Comment générer une matrice de rotation pour un axe et un angle donnés ?

Auteurs : Hexapod ,

La seule façon de générer ce type de matrice de rotation est à l'aide des quaternions.

Voir Comment convertir un axe de rotation et un angle en un quaternion ? et Comment convertir un quaternion enmatrice de rotation ?.

Comment générer une matrice de rotation pour rendre deux vecteurs colinéaires ?

Auteurs : Hexapod ,

Quand on développe une application d'animation, un requête commune est de trouver la matrice de rotation qui"mappe" un vecteur direction sur un autre.

Ce problème peut être visualisé en considérant deux vecteurs directions attachés à leurs base. Donc, l'entière totalitéde l'espace de rotation forme une sphère unité.

En théorie, il existe un nombre infini de rotations possibles pour rendre les deux vecteurs colinéaires. Tous ces axes sontdans le plan pour lequel tous les points appartenant au plan sont à égale distance des deux vecteurs.

Néanmoins, une seule solution est intéressante en pratique. C'est le chemin qui couvre la plus petite distance angulaireentre les deux vecteurs.

L'axe de rotation de ce chemin se calcule à l'aide du produit vectoriel entre les deux vecteurs :

L'angle de rotation est calculé à l'aide du produit scalaire entre les deux vecteurs :

Page 37: Matrice sous matlab

- 37 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Attention, si ceux-ci ne sont pas normalisés il faudra tenir compte de leur norme dans le calcul :

Cependant, l'angle obtenu n'est pas forcément correct : en effet un cosinus peut être obtenu avec deux angles différents(cos(x) = cos(-x)). Il faudra donc trouver un moyen de déterminer s'il s'agit de x ou -x.

Comment utiliser les matrices pour convertir entre deux systèmes de coordonnées ?

Auteurs : Hexapod ,

De façon similaire au problème précédent, nous avons besoin de "confondre" deux systèmes de coordonnées.Néanmoins, il s'agit de faire correspondre 3 axes au lieu d'un seul. Les deux systèmes sont représentés par des matrices3x3 ou 4x4.

Le problème est donc de trouver la matrice de rotation qui va réaliser cette tâche. On peut l'exprimermathématiquement comme :

Où :Mfinale est la matrice du système de coordonnées final,Morig est le système de coordonnées original etMrot est la matrice de rotation voulue.

L'objectif est de trouver Mrot. Ceci peut être fait en ré-écrivant l'équation comme suit :

Ainsi, la matrice de rotation peut être calculée via la multiplication de la matrice finale avec l'inverse de la matricede départ.

Une fois calculée, cette matrice de rotation peut être conservée dans un quaternion.

Qu'est ce qu'une matrice de translation ?

Auteurs : Hexapod ,

Une matrice de translation sert à positionner un objet dans l'espace sans le tourner. Les translations en 3D sous formematricielle ne peuvent être réalisées qu'avec des matrices 4x4 (voir Qu'est ce qu'une matrice ?).

Si la translation se définit par un vecteur (X, Y, Z), alors on a la matrice 4x4 suivante :

Page 38: Matrice sous matlab

- 38 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Si le vecteur est (0, 0, 0) alors la matrice correspondante est l'identité, et l'objet n'est pas modifié.

Qu'est ce qu'une matrice de mise à l'échelle ?

Auteurs : Hexapod ,

C'est une matrice qui permet de grossir ou de rapetisser un modèle 3D.

Si le vecteur de mise à l'échelle est (X, Y, Z) alors la matrice qui correspond est la suivante :

Si le vecteur de mise à l'échelle est (1, 1, 1), alors on obtient la matrice identité et l'objet ne change pas.

Qu'est ce que qu'une matrice de déformation ?

Auteurs : Hexapod ,

C'est une matrice qui permet de faire en sorte qu'un modéle 3D apparaisse "penché", comme les caractères italiquespar exemple.

En 3 dimensions, 6 directions de déformation existent :

• Etirer X selon Y• Etirer X selon Z• Etirer Y selon X• Etirer Y selon Z• Etirer Z selon X• Etirer Z selon Y

Ces 6 transformations peuvent se combiner dans une seule matrice :

Page 39: Matrice sous matlab

- 39 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Où Sij représente une déformation de l'axe I selon l'axe J.

Comment réaliser une interpolation linéaire entre deux matrices ?

Auteurs : Hexapod ,

Etant données deux matrices de transformation, le problème est de trouver le moyen de déterminer les positionsintermédiaires par une variable paramétrique t, avec t variant de 0.0 à 1.0.

Ceci peut se faire en convertissant les deux matrices en Qu'est ce que les angles d'Euler ? ou sphérique (quaternions)et un vecteur translation.

Dans les deux cas, chaque matrice est convertie en une paire de vecteurs 3D.

L'interpolation entre chacun de ces deux vecteurs peut être réalisée via l'équation d'interpolation linéaire classique :

Où :Vr est le vecteur résultantVa est le vecteur position de départVb est le vecteur position finale

Cette équation s'applique aussi bien aux vecteurs de la translation qu'à celui de la rotation.

Une fois déterminées, la translation et la rotation résultantes sont converties dans la matrice intermédiaire voulue.

Comment réaliser une interpolation cubique entre quatre matrices ?

Auteurs : Hexapod ,

Etant données quatres matrices, le problème consiste à trouver un moyen pour déterminer les positions intermédiairesspécifiées par la variable paramétrique t.

Ceci peut être réalisé en faisant usage de l'interpolation cubique. Comme pour l'interpolation linéaire, les quatresmatrices sont converties dans leurs vecteurs rotations et translations correspondant (Euler ou sphérique).

Chaque ensemble de 4 vecteurs est alors converti en un unique vecteur géométrique G. A l'aide des mathématiques dessplines, ce vecteur est converti en une matrice d'interpolation M.

Si G est défini comme tel :

Page 40: Matrice sous matlab

- 40 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Alors, la multiplication par la matrice de base :

Va générer une matrice d'interpolation 3x4 Mi :

Ceci peut être implémenté à l'aide d'une multiplication standard matrice-vecteur.

L'interpolation peut être faite par l'usage de la variable paramétrique t :

Le vecteur résultant peut être converti en une matrice de rotation ou de translation.

Il doit être noté que les chemins de rotation générés peuvent sembler quelque peu acrobatiques. C'est normal dans lesens que l'algorithme essaye de trouver le chemin avec le minimum de rotations entre les 4 vecteurs.

Des Qu'est ce que les angles d'Euler ? ou sphériques, ces derniers semblent en général être plus "propres" pour cetteinterpolation.

Page 41: Matrice sous matlab

- 41 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Quaternions

Qu'est ce que les quaternions ?

Auteurs : Hexapod ,

Les quaternions permettent d'étendre la notion de rotation en 3 dimensions à celle en 4 dimensions. Ils permettent ainsid'éviter le Qu'est ce que le gimbal lock ? et l'implémentation de rotation plus continue et plus précise.

Un quaternion est défini via l'usage de 4 valeurs réelles (x, y, z, w).

Elles sont calculées par une combinaison des 3 coordonnées de l'axe de rotation et de l'angle correspondant.

Quel est le rapport entre les quaternions et l'animation 3D ?

Auteurs : Hexapod ,

Comme mentionné plus haut, les Qu'est ce que les angles d'Euler ? ont quelques défauts dûs à l'ordre dans lequel sontréalisées les rotations.

Les quaternions solutionnent ce problème. Au lieu de tourner un objet via une série de rotations successives, lesquaternions permettent au programmeur de tourner un objet autour d'un axe arbitraire et d'un angle quelconque.

La rotation est néanmoins toujours réalisée par des calculs matriciels. Néanmoins, au lieu de multiplier les matricesensembles, les quaternions les représentant sont multipliés. Le résultat final est reconverti en la matrice désirée.

Les quaternions offrent aussi l'avantage de permettre l'interpolation. Ceci permet des rotations plus souples et plusréalistes.

Comment calculer le conjugué d'un quaternion ?

Auteurs : Hexapod ,

Ceci peut être fait en inversant le signe de la partie vectorielle du quaternion :

quaternion_conjugate(QUAT *qr, QUAT *qa){ qr->qw = qa->qw; qr->qx = -qa->qx; qr->qy = -qa->qy; qr->qz = -qa->qz;}

Comment calculer la norme d'un quaternion ?

Auteurs : Hexapod ,

La norme se calcule en multipliant le quaternion par son conjugué.

Page 42: Matrice sous matlab

- 42 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Ce qui peut s'implémenter comme suit :

QFLOAT quaternion_magnitude(QUAT *qa){ return sqrt(qa->qw * qa->qw + qa->qx * qa->qx + qa->qy * qa->qy + qa->qz * qa->qz);}

Comment normaliser un quaternion ?

Auteurs : Hexapod ,

Un quaternion non nul peut se normaliser de la même manière qu'un vecteur non nul : on le divise par Commentcalculer la norme d'un quaternion ?.

Un quaternion dont la norme vaut 1 est appelé quaternion unitaire.

Comment calculer l'inverse d'un quaternion ?

Auteurs : Hexapod ,

Calculer l'inverse d'un quaternion revient à calculer son Comment calculer le conjugué d'un quaternion ?, dans le casoù celui-ci est Comment normaliser un quaternion ?.

S'il n'est pas normalisé, on calcule l'inverse de cette manière :

Comment multiplier deux quaternions ?

Auteurs : Hexapod ,

Soit deux quaternions Q1 et Q2, l'objectif est de calculer la rotation combinée Qr :

Ceci peut se faire via cette expression :

Où :

Page 43: Matrice sous matlab

- 43 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

v1 = (x,y,z) de Q1w1 = (w) de Q1v2 = (x,y,z) de Q2w2 = (w) de Q2

Ceci peut s'implémenter comme suit :

quaternion_multiply(QUAT *qr, QUAT *qa, QUAT *qb){ qr.scalar = v3_dot(&qa->vector, &qb->vector);

v3_cross(&va, &qa->vector, &qb->vector); v3_scalef(&vb, &qa->vector, &qb->scalar); v3_scalef(&vc, &qb->vector, &qa->scalar); v3_add(&va, &va, &vb); v3_add(&qr->vector, &va, &vc);

quaternion_normalise(qr);}

Comment convertir un quaternion en matrice de rotation ?

Auteurs : Hexapod ,

Soit un quaternion Q :

Q = (X, Y, Z, W)

Alors, ce quaternion peut se convertir en une matrice de rotation 3x3 comme suit :

Si une matrice 4x4 est requise, alors la dernière ligne et la dernière colonne peuvent être mises à 0, et M3, 3 à 1.

La matrice peut se générer via ces expression :

xx = X * X;xy = X * Y;xz = X * Z;xw = X * W;

yy = Y * Y;yz = Y * Z;yw = Y * W;

zz = Z * Z;zw = Z * W;

mat[0] = 1 - 2 * ( yy + zz );mat[1] = 2 * ( xy - zw );

Page 44: Matrice sous matlab

- 44 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

mat[2] = 2 * ( xz + yw );

mat[4] = 2 * ( xy + zw );mat[5] = 1 - 2 * ( xx + zz );mat[6] = 2 * ( yz - xw );

mat[8] = 2 * ( xz - yw );mat[9] = 2 * ( yz + xw );mat[10] = 1 - 2 * ( xx + yy );

mat[3] = mat[7] = mat[11] = mat[12] = mat[13] = mat[14] = 0;mat[15] = 1;

Comment convertir une matrice de rotation en un quaternion ?

Auteurs : Hexapod ,

Une matrice de rotation peut se convertir à l'aide de l'algorithme suivant.

On commence par calculer la trace de la matrice, c'est-à-dire la somme de ses éléments diagonaux :

Si la trace est positive, alors le calcul est instantané :

Si par contre la trace de la matrice est inférieure ou égale à 0, alors il faut identifier l'élément le plus grand dans ladiagonale principale de la matrice.

En fonction de la position de cette valeur :

Si c'est M0, 0 :

Page 45: Matrice sous matlab

- 45 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Si c'est M1, 1 :

Si c'est M2, 2 :

Page 46: Matrice sous matlab

- 46 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Le quaternion est finalement défini par Q = (X, Y, Z, W).

Comment convertir un axe de rotation et un angle en un quaternion ?

Auteurs : Hexapod ,

Etant donnés l'axe de rotation et l'angle, cet algorithme peut être utilisé pour générer un quaternion :

sin_a = sin(angle / 2)cos_a = cos(angle / 2)

q->x = axis->x * sin_aq->y = axis->y * sin_aq->z = axis->z * sin_aq->w = cos_a

quaternion_normalise(q);

Il est nécéssaire de Comment normaliser un quaternion ? le quaternion par la suite.

Comment convertir un quaternion en un axe de rotation et un angle ?

Auteurs : Hexapod ,

Un quaternion peut se re-convertir en un angle et un axe de rotation très facilement, sachant que w est le cosinus dudemi-angle, et que (x, y, z) représente l'axe de rotation :

/* Normalisation du quaternion */quaternion_normalise(qr);

/* Récupération de l'angle de rotation */angle = acos(qr->qw) * 2;

/* Récupération des composantes de l'axe de rotation */vx = qr->qx;vy = qr->qy;vz = qr->qz;

/* Normalisation de l'axe de rotation */norm = sqrt(vx * vx + vy * vy + vz * vz);if (norm > 0.0005){ vx /= norm; vy /= norm; vz /= norm;}

Comment convertir des angles de rotations sphériques en un quaternion ?

Auteurs : Hexapod ,

Un axe de rotation peut être défini par des coordonnées sphériques (latitude et longitude) et un angle de rotation.

Dans ce cas, le quaternion peut être calculé comme suit :

Page 47: Matrice sous matlab

- 47 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

sin_a = sin(angle / 2)cos_a = cos(angle / 2)

sin_lat = sin(latitude)cos_lat = cos(latitude)

sin_long = sin(longitude)cos_long = cos(longitude)

qx = sin_a * cos_lat * sin_longqy = sin_a * sin_latqz = sin_a * sin_lat * cos_longqw = cos_a

Comment convertir un quaternion en des angles de rotations sphériques ?

Auteurs : Hexapod ,

Un quaternion peut se convertir en coordonnées sphériques via :

/* Récupération de l'angle de rotation */angle = acos(q->qw) * 2;

/* Récupération des composantes de l'axe de rotation */vx = qr->qx;vy = qr->qy;vz = qr->qz;

/* Normalisation de l'axe de rotation */norm = sqrt(vx * vx + vy * vy + vz * vz);if (norm > 0.0005){ vx /= norm; vy /= norm; vz /= norm;}

/* Calcul de la latitude */latitude = -asin(vy);

/* Calcul de la longitude */if (vx * vx + vz * vz < 0.0005) longitude = 0;else longitude = atan2(vx, vz);

/* Si la longitude est négative, on la ramène du côté positif */if (longitude < 0) longitude += 2 * PI;

Comment convertir des angles d'Euler en un quaternion ?

Auteurs : Hexapod ,

La conversion d'Qu'est ce que les angles d'Euler ? en quaternion peut se faire à l'aide de multiplication de quaternions.Chaque angle de rotation est converti en une paire angle-axe, chaque axe correspondant à un axe Euclidien. Ces pairessont converties en quaternions qui sont multipliés ensemble.

Implémentation :

Page 48: Matrice sous matlab

- 48 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

quaternion_from_euler(QUATERNION *q, VFLOAT ax, VFLOAT ay, VFLOAT az){ VECTOR3 vx = {1, 0, 0}, vy = {0, 1, 0}, vz = {0, 0, 1}; QUATERNION qx, qy, qz, qt;

quaternion_from_axisangle(qx, &vx, ax); quaternion_from_axisangle(qy, &vy, ay); quaternion_from_axisangle(qz, &vz, az);

quaternion_multiply(&qt, &qx, &qy); quaternion_multiply(q, &qt, &qz);}

Comment utiliser des quaternions pour réaliser une interpolation linéaire entre matrices ?

Auteurs : Hexapod ,

Dans beaucoup d'applications, il peut être nécessaire d'interpoler entre 2 positions de rotation d'un objet donné. Cespositions peuvent être spécifiées à l'aide de l'animation par keyframe ou cinématique inverse.

Il est nécéssaire d'avoir au moins deux matrices, la matrice de départ et la matrice finale (MS et MF).

En interpolation linéaire, la matrice de rotation interpolée est générée en utilisant une équation paramétrique où t variede 0.0 à 1.0.

A t = 0, la matrice interpolée est égale à la matrice de départ. A t = 1, la matrice interpolée est égale à la matrice de fin.

Donc, la matrice de rotation interpolée (MI) est spécifiée par :

Où F est une fonction d'interpolation.

La première étape est de calculer la matrice de rotation qui va convertir MS vers MF :

Où :Ms est la matrice de départ,Mf est la matrice finale,et T la matrice intermédiaire.

Ensuite, il convient de convertir cette matrice en un axe et un angle de rotation à l'aide des quaternions.

Afin de générer la matrice de rotation désirée, il suffit de modifier l'angle de rotation en fonction de t et de reconstruirela matrice de rotation voulue.

Exemple :

m4_transpose(mt, ms); /* Inversion */m4_mult(ms, mt, mb); /* Matrice de Rotation */

Page 49: Matrice sous matlab

- 49 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

m4_to_axisangle(ms, axis, angle); /* Rotation axe/angle */

for (t = 0; t < 1.0; t += 0.05){ m4_from_axisangle(mi, axis, angle * t); /* Interpolation Finale */

/* ... ce que vous voulez ... */}

où t est le facteur d'interpolation allant de 0.0 à 1.0.

Page 50: Matrice sous matlab

- 50 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Trigonométrie

Page 51: Matrice sous matlab

- 51 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Trigonométrie > Bases

Qu'est-ce que la trigonométrie ?

Auteurs : Thibaut Cuvelier ,

La trigonométrie est la branche des mathématiques qui étudie les relations entre les longueurs des côtés des triangleset leurs angles, et, par extension, les fonctions trigonométriques (sinus, cosinus et leurs dérivés : tangente, cotangente,sécante, cosécante).

La trigonométrie est très souvent utilisée dans des domaines très variés. Par exemple, elle est très utile dans l'optique(pour les microscopes, par exemple) ou la physique newtonienne (lois des mouvements...), ou pour la triangulation, quipermet de localiser un point en mesurant les angles formés avec d'autres points de référence.

Quelles sont les mesures de l'angle ?

Auteurs : Thibaut Cuvelier ,

Il existe deux mesures principales de l'angle : le degré et le radian. Il existe aussi le quadrant, la mesure d'angle d'un

angle droit. Un cercle décrit un angle de 360°, de 4q et de 2 rad.

° est le symbole du degré, q celui du quadrant, et rad celui du radian.

Un radian est la mesure de l'angle dont la mesure de l'arc interceptant un cercle vaut le rayon de ce cercle.Un quadrant est le quart de l'angle formé par un cercle.

Un degré est le 360e de l'angle formé par un cercle.

Ceci permet d'écrire les égalités suivantes :

Ces égalités permettent de facilement convertir une mesure d'angle des degrés en radians et inversément. Voici de tellesfonctions avec leurs notations mathématiques.

Et voici son implémentation en C99, compatible C++.

Page 52: Matrice sous matlab

- 52 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

#define PI 3.141592653589793

inlinelong double deg2rad (float deg){ return deg / (180 / PI);}

inlinelong double rad2deg (float rad){ return rad * (180 / PI);}

Il existe encore d'autres mesures d'angles, mais elles sont nettement moins utilisées : le grade,le mil, la révolution (ou rotation), le degré binaire, le radian binaire (bradian), l'angle horaire,le gradient...

Qu'est-ce que le cercle trigonométrique ?

Auteurs : Thibaut Cuvelier ,

Le cercle trigonométrique, ou cercle unité

Le cercle trigonométrique est le cercle dont le centre est le centre du repère et de rayon 1. C'est pourquoi il est aussiappelé cercle unité : chacun de ses points se situe à une unité du centre du repère. Ces points ont des abscisses etdes ordonnées un peu particulières : elles correspondent au sinus et au cosinus de l'angle orienté formé par l'axe desabscisses et la droite passant par ce point et le centre du repère.

Voici les équations paramétriques de ce cercle :

Page 53: Matrice sous matlab

- 53 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

On utilise généralement le sens trigonométrique pour parcourir ce cercle : il est opposé ausens horloger. On parle aussi exceptionnellement du sens senestre (par opposition à dextre).

Que sont les angles associés ?

Auteurs : Thibaut Cuvelier ,

Deux angles sont complémentaires si la somme de leurs mesures d'angleéquivaut la mesure d'un angle droit.

Deux angles sont opposés si leurs mesures d'angles sont opposées.

Page 54: Matrice sous matlab

- 54 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Deux angles sont supplémentaires si la somme de leurs mesures d'angleéquivaut la mesure d'un angle plat.

Deux angles sont antisupplémentaires si l'un équivaut l'autre à la mesured'un angle plat près.

En effet, lors d'un travail en radian,

De même,

Page 55: Matrice sous matlab

- 55 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Qu'est-ce qu'un nombre trigonométrique ?

Auteurs : Thibaut Cuvelier ,

Un nombre trigonométrique est le résultat d'une fonction trigonométrique (sinus, cosinus, tangente, cotangente...). Parexemple :

Un nombre trigonométrique peut être calculé assez exactement par une machine, ou bien être approché grâce au cercletrigonométrique.

Dans la figure suivante, on a tracé un angle. Pour en trouver le sinus, il suffit de tracer la parallèle à l'axe des cosinuspassant par le point de contact entre la demi-droite bornant l'angle et le cercle trigonométrique et de mesurer la distanceentre l'axe des cosinus et cette droite.

Approximation d'un nombre trigonométrique

À partir d'un nombre trigonométrique, comment calculer les autres ?

Auteurs : Thibaut Cuvelier ,

Il faut plusieurs relations entre les différents nombres trigonométriques afin de pouvoir les exprimer les uns par rapportaux autres.

La relation fondamentale

Page 56: Matrice sous matlab

- 56 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

La définition de la tangente

La définition de la cotangente

Lien entre tangente et cotangente

Définition de la sécante

Définition de la cosécante

Avec ces quelques relations, vous pouvez sans problème trouver tous les nombres trigonométriques de l'angle dont vousavez un nombre trigonométrique.

La relation fondamentale exprimée en fonction du cosinus pour obtenir facilement le sinus

La relation fondamentale exprimée en fonction du sinus pour obtenir facilement le cosinus

La définition de la tangente en fonction du cosinus

Page 57: Matrice sous matlab

- 57 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

La définition de la cotangente en fonction du sinus

Quels sont les nombres trigonométriques des angles remarquables ?

Auteurs : Thibaut Cuvelier ,

Premièrement, quels sont les angles remarquables ?En degrés : 0°, 30°, 45°, 60°, 90°.

En radians : rad, rad, rad, rad, rad.

Qu'ont-ils de particulier ? Il est possible de démontrer leurs cosinus et sinus, pour obtenir une fraction (ir)rationnelleassez simple.

rad

radradradradSinus

Cosinus

Comment implémenter une fonction trigonométrique à partir des séries entières ?

Auteurs : Thibaut Cuvelier ,

Une des manières les plus simples est d'utiliser les séries entières. Les voici.

Plus on développe la série, plus le résultat devient précis, mais lent à calculer.

Voici une implémentation du calcul du sinus par cette méthode en C99, compatible C++.

Page 58: Matrice sous matlab

- 58 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sinusinline long double sin_part ( long double rad, int pos ){ if ( (pos % 2) == 0 ) { return ( rad ^ (2 * pos + 1) ) / ( 2 * pos + 1); } else { return - ( rad ^ (2 * pos + 1) ) / ( 2 * pos + 1); }}

long double sin ( long double rad, int precision ){ long double return = rad;

while ( precision > 0 ) { return += sin_part ( rad, precision ); --precision; } return return;}

Et voici son pendant pour le cosinus par cette méthode en C99, compatible C++.

Cosinusinline long double cos_part ( long double rad, int pos ){ if ( (pos % 2) == 0 ) { return ( rad ^ (2 * pos) ) / ( 2 * pos); } else { return - ( rad ^ (2 * pos) ) / ( 2 * pos); }}

long double cos ( long double rad, int precision ){ long double return = 1;

while ( precision > 0 ) { return += cos_part ( rad, precision ); --precision; } return return;}

Page 59: Matrice sous matlab

- 59 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Ces implémentations ne sont pas prévues pour être rapides, il s'agit juste de montrer commentfaire. Un certain nombres d'optimisation peuvent être envisagées.

Comment implémenter une fonction trigonométrique en utilisant l'algorithme CORDIC ?

Auteurs : Thibaut Cuvelier ,

Cet algorithme recherche les coordonnées de l'intersection de l'angle avec le cercle trigonométrique. Il procède avec un

vecteur , qu'il fait tourner pour qu'il atteigne l'angle recherché.

À chaque itération, on calcule la multiplication du vecteur avec une matrice de transformation,

En mettant le facteur en évidence, on obtient :

Le facteur peut valoir -1 ou +1 en fonction du sens de rotation. Si on restreint les valeurs de

\gamma

afin que soit égal à , alors la multiplication par le facteur tangente devient une multiplication parune puissance de 2. D'où :

Le facteur peut être ignoré pendant l'itération, et factorisé en un seul coefficientmultiplicatif final. Ici, n représente le nombre d'itérations.

La limite de ce produit lorsque n tend vers l'infini est de 0,607 252 94.

Page 60: Matrice sous matlab

- 60 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Après suffisamment d'itérations, l'angle formé par le vecteur et l'axe des cosinus se rapprochera de l'angle dont onrecherche les sinus et cosinus.

La dernière étape consiste à déterminer à chaque itération le sens de rotation : trigonométrique (anti-horaire) ou

horaire. Ce résultat influence la valeur de .

Tout simplement, on soustrait la mesure de l'angle à la mesure de l'angle désiré. Si le résultat est positif, ontourne dans le sens horloger. S'il est négatif, on tourne dans le sens trigonométrique. Cette étape peut être déclaréedichotomique.

Voici maintenant l'implémentation de cet algorithme en C99, compatible C++.

CORDIC#define ITER 15#define K 0,60725294

double cos = 1;double sin = 0;double xNouveau;int i = 0;

double beta = 0; // angle recherché

while ( i < ITER ){ if(beta < 0) { xNouveau = cos + ( sin * pow(2, -i) ); sin -= cos * pow(2, -i); beta += atan( pow(2, -i) ); } else { xNouveau = cos - (sin * pow(2, -i)); sin += cos * pow(2, -i); beta -= atan( pow(2, -i) ); } cos = xNouveau; i++;}

cos *= K;sin *= K;

Comment fonctionnent les look up tables ?

Auteurs : Thibaut Cuvelier ,

Une look up table (ou LUT) est un tableau statique à chargement dynamique. Dit autrement, il s'agit d'une sorte detableau qui est construit dynamiquement (typiquement au lancement du programme, quand il affiche son splash screen)dont l'accès aux données se fait comme s'il était stocké dans le binaire.

Page 61: Matrice sous matlab

- 61 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Une LUT sert principalement à accélérer le calcul de valeurs de fonctions prennant un certain temps à calculer, surtoutquand on en a besoin très souvent (par exemple, une application devant calculer des milliers de cosinus par secondepourra en profiter, ils seront déjà calculés, il suffira d'aller les lire).

Son fonctionnement est très simple : il s'agit tout d'abord d'un conteneur un peu spécial. Il stocke des valeursd'une fonction pour un paramètre précis, ce paramètre servant d'indice au tableau (pour l'implémentation, onutilise généralement un vecteur). Seulement, ces indices sont forcément entiers alors que les paramètres, surtout entrigonométrie, ne sont que très rarement entiers. Il faut donc un peu tricher à cet endroit pour transformer ces flottantsen entiers (un exemple est disponible ci-dessous).

Une implémentation très basique d'une LUT pour la fonction cosinus#include <vector>#include <cmath> using namespace std; class lut{private: vector<float> m_lut; float m_min; float m_max; float m_precision; public: lut() {} ~lut() {} // L'intervalle dans lequel on devra calculer les valeurs prises par la fonction void setInterval (float min, float max) { this->m_min = min; this->m_max = max; } // Donne la précision, la différence entre les paramètres de deux valeurs stockées void setPrecision (float p) { this->m_precision = p; } // Calcule les valeurs demandées void compute() { for(float x = this->m_min, int i = 0 ; x <= this->m_max ; x += this->m_precision, ++i) { this->m_lut[i] = cos(x); } // Le code est assez clair : pour toutes les valeurs entre this->m_min et this->m_max, // on calcule le cosinus de cette valeur et on l'inscrit dans la LUT. // Seulement, un vecteur n'aime pas trop les float comme indices, il faut donc tricher : // 0 -> this->m_min // 1 -> this->m_mix + this->m_precision // etc. // Problème : il faut retransformer les valeurs demandées en indices du vecteur. // Cependant, cela évite de créer son propre conteneur, ce qui n'est pas le but ici. // Ce code est loin d'être optimal, il ne donne qu'une manière de faire, qui ne veut pas // être la meilleure mais juste suffisamment simple à comprendre. } float get(float x) { // On veut forcément une valeur dans l'intervalle ; sinon, cette implémentation calcule cette valeur précise mais ne la stocke pas. if ( ! (x > this->m_min && x < this->m_max) ) return cos(x);

Page 62: Matrice sous matlab

- 62 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Une implémentation très basique d'une LUT pour la fonction cosinus // La valeur 0 correspond au minimum : si x vaut ce minimum, il doit valoir 0, on ne peut pas le créer autrement. x -= this->m_min; // Toutes les valeurs ne sont pas disponibles : on divise donc par la précision pour avoir une valeur comme ce que nous voulons. x /= this->m_precision; // x est toujours un flottant, on veut un entier : il suffit de perdre les décimales pour obtenir notre indice ! int i = floor(x); // vous auriez pu utiliser ceil ou une autre méthode pour récupérer un entier // Maintenant, on retourne à l'utilisateur le résultat demandé. return this->m_lut[i]; }};

Cette implémentation d'une LUT n'est pas forcément la meilleure possible ! Il ne s'agit qued'un exemple pour vous aider à comprendre leur principe ; en réalité, vous devriez plutôtprévoir une LUT plus réutilisable (notamment pas autant liée à une fonction, ne pas mettreen dur la fonction dont vous calculez les images), plus optimisée en fonction de vos besoins(vos indices seront peut-être exclusivement entiers, un pan entier de cette implémentationpeut ainsi être évité).

L'utilisation de cette LUTlut m_lut; m_lut->setInterval(0, 1.57); // de 0 à PI/2m_lut->setPrecision(0.157); // soit PI/20m_lut->compute();cout << m_lut->get(0.157); // récupérée de la lut, valeur déjà calculéecout << m_lut->get(0.158); // valeur en dehors de la lut, calculée à ce moment-là

Cet exemple de LUT peut être fortement amélioré : on pourrait, par exemple, instaurer un système d'interpolation pourles valeurs pour lesquelles rien n'est calculé. Il serait possible de coder son propre conteneur à cet effet et d'autoriseralors l'utilisation d'indices flottants, comme par exemple ce qui est disponible avec les tableaux CUDA normalisés (ilsn'autorisent que des indices entre 0 et 1).

Utiliser une LUT n'a de sens que si vous devez obtenir très souvent le résultat d'une fonction !S'il s'agit simplement de calculer trois cosinus sur toute la durée de vie de l'application, elleperdra beaucoup de temps à créer cette LUT et prendra beaucoup de mémoire pour la stockerpour rien. Il n'est pas non plus intéressant d'utiliser une LUT pour des opérations très simples,l'accès à un élément ayant un coût non négligeable pour ce genre d'opérations.

Page 63: Matrice sous matlab

- 63 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Trigonométrie > Relations trigonométriques

Comment calculer le sinus ou le cosinus d'une somme ou d'une différence ?

Auteurs : Thibaut Cuvelier ,

Il existe six formules d'addition et de soustraction de base en trigonométrie ; les voici dans une version condensée.

Comment factoriser ou distribuer une expression trigonométrique ?

Auteurs : Thibaut Cuvelier ,

On utilise généralement en ce but les formules de Simpson, qui peuvent être lues dans un sens ou dans l'autre afind'obtenir les deux sens : distribution ou factorisation.

Au contraire des autres identités trigonométriques, les variables utilisées sont p et q.

Page 64: Matrice sous matlab

- 64 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Comment calculer les nombres trigonométriques d'un double d'angle ?

Auteurs : Thibaut Cuvelier ,

Ces formules sont des cas particuliers des formules d'addition et de soustraction d'angles. En effet : x + x = 2x.

Comment exprimer les nombres trigonométriques en fonction de la tangente de la moitié d'un angle ?

Auteurs : Thibaut Cuvelier ,

Il suffit de transformer les identités précédentes afin de faire ressortir des tangentes.

Page 65: Matrice sous matlab

- 65 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Trigonométrie > Triangles rectangles

Quelles sont les relations entre les longueurs et les angles d'un triangle rectangle ?

Auteurs : Thibaut Cuvelier ,

Pour référence, prenons ce triangle rectangle.

Dans un triangle rectangle, la mesure d'un côté de l'angle droit est égaleau produit de la mesure de l'hypoténuse par le cosinus de l'angle compris.

Dans un triangle rectangle, la mesure d'un côté de l'angle droit est égaleau produit de la mesure de l'hypoténuse par le sinus de l'angle opposé.

La mesure d'un côté de l'angle droit est égale au produit de la mesure del'autre côté de l'angle droit par la tangente de l'angle opposé à ce côté.

Ces formules sont aussi parfois exprimées en fonction du nombre trigonométrique.

Page 66: Matrice sous matlab

- 66 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Il ne faut pas oublier que, la somme des amplitudes des angles d'un triangle valant , la somme des amplitudes des

angles aigus d'un triangle vaut .

De même, voici pour rappel le théorème de Pythagore.

Comment résoudre un cas classique de triangle rectangle ?

Auteurs : Thibaut Cuvelier ,

Résoudre un triangle, c'est calculer ses éléments inconnus en fonction d'éléments connus.

On peut remarquer qu'il s'agit souvent de résoudre le même genre de triangles : c'est ce que l'on appelle des casclassiques. Les éléments donnés sont des angles du triangle et/ou des côtés du triangle.

Dans cette réponse, on considèrera :

•comme l'hypoténuse ;

comme un côté de l'angle droit ;•

comme l'autre côté de l'angle droit ;•

comme l'angle droit ;•

comme un angle aigu ;•

comme l'autre angle aigu.

Premier cas : on donne l'hypoténuse et un angle aigu .

Page 67: Matrice sous matlab

- 67 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Deuxième cas : on donne un côté de l'angle droit et un angle aigu .

Troisième cas : on donne l'hypoténuse et un côté de l'angle droit .

Quatrième cas : on donne les deux côtés de l'angle droit, et .

Page 68: Matrice sous matlab

- 68 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Sommaire > Trigonométrie > Triangles quelconques

Qu'est-ce que la règle des sinus ?

Auteurs : Thibaut Cuvelier ,

Les côtés d'un triangle sont proportionnels aux sinus des angles opposés. Le facteur de proportionnalité est le diamètredu cercle circonscrit à ce triangle.

Qu'est-ce que la règle des cosinus (théorème de Pythagore généralisé, théorème d'Al-Kashi) ?

Auteurs : Thibaut Cuvelier ,

Le carré d'un côté d'un triangle est égal à la somme des carrés des deux autres côtés diminuée du double produit deces côtés et du cosinus de l'angle qu'ils délimitent.

Pour référence, prenons ce triangle.

Page 69: Matrice sous matlab

- 69 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

Comment calculer l'aire d'un triangle quelconque ?

Auteurs : Thibaut Cuvelier ,

L'aire d'un triangle vaut le demi-produit de deux côtés et de l'angle formé par ces deux côtés.Ou, le double de l'aire d'un triangle est le produit de deux côtés et de l'angle formé par ces deux côtés.

Pour référence, prenons ce triangle.

Comment résoudre un cas classique de triangle ?

Auteurs : Thibaut Cuvelier ,

Résoudre un triangle, c'est calculer ses éléments inconnus en fonction d'éléments connus.

On peut remarquer qu'il s'agit souvent de résoudre le même genre de triangles : c'est ce que l'on appelle des casclassiques. Les éléments donnés sont des angles du triangle et/ou des côtés du triangle.

Dans cette réponse, on considèrera :

•,

et

comme les trois côtés d'un triangle ;•

,

Page 70: Matrice sous matlab

- 70 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

et

comme les trois angles du triangle.

Premier cas : on donne les trois côtés, , et .Trois jeux de formules existent pour résoudre ce cas.Afin de faciliter les calculs, posons :

Page 71: Matrice sous matlab

- 71 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvreintellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vousencourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée à la SACD.

http://jeux.developpez.com/faq/math/

On peut aussi résumer ce cas classique d'une autre manière. On utilise uniquement le théorème d'Al-Kashi sur chacundes côtés afin de trouver les angles. Si l'on utilisait la règle des sinus par après, plusieurs solutions seraient possiblespour chaque angle, il faudrait faire une disjonction de cas.

Il faut aussi vérifier que le triangle soit possible ! Pour cela, une simple propriété : dans untriangle, la longueur de tout côté doit être inférieure à la somme des longueurs deux autres.

Deuxième cas : on donne deux côtés ainsi que l'angle compris entre ces deux côtés.Grâce au théorème d'Al-Kashi, on peut facilement trouver la longueur du troisième côté. Le même théorème peut êtreemployé pour les deux derniers angles.

Troisième cas : on donne un côté et les deux angles adjacents à ce côté.Comme la somme des amplitudes des angles d'un triangle est constante, on peut facilement calculer le dernier angle.Les deux derniers côtés s'obtiennent par la règle des cosinus ou par la règle des sinus.

Quatrième cas : on donne deux côtés, et et l'angle opposé à l'un d'eux, .

. Deux valeurs de sont possibles : et .

Le dernier angle accepte donc aussi deux valeurs : et

.

Nous pouvons donc calculer le dernier côté : .Plusieurs cas sont possibles avec ces données : deux triangles peuvent correspondre, tout aussi bien que un seul, oubien zéro !