Vous êtes sur la page 1sur 71
Date de publication : Dernière mise à jour : Ce document est, en partie, une traductionhttp:// 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 ! " id="pdf-obj-0-2" src="pdf-obj-0-2.jpg">

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 !

Ont contribué à cette FAQ : Hexapod - <a href=Laurent Gomila - LeGreg - loka - gouessej - Thibaut Cuvelier ( Site web ) ( Blog ) - " id="pdf-obj-1-2" src="pdf-obj-1-2.jpg">

Ont contribué à cette FAQ :

Généralités (2) 1. ........................................................................................................................................................................... 4 2. Matrices (45) ..............................................................................................................................................................................5 2.1. Bases (5) 6 2.2. Arithmétique (8)http://jeux.developpez.com/faq/math/ " id="pdf-obj-2-3" src="pdf-obj-2-3.jpg">

Généralités (2)

  • 1. ...........................................................................................................................................................................

4

  • 2. Matrices (45) ..............................................................................................................................................................................5

2.1.

Bases (5)

6

2.2.

Arithmétique (8)

11

2.3.

Déterminants et inverses (12) .........................................................................................................................................17

2.4.

Transformations (20)

27

Quaternions (15)

  • 3. ......................................................................................................................................................................

41

  • 4. Trigonométrie (20) ...................................................................................................................................................................50

4.1.

Bases (10)

.......................................................................................................................................................................

51

4.2.

Relations trigonométriques (4)

63

4.3.

Triangles rectangles (2) ..................................................................................................................................................

65

4.4.

Triangles quelconques (4)

68

Sommaire > Généralités Comment participer à cette FAQ ? Auteurs : <a href=Laurent Gomila , Si vous avez remarqué une erreur, une simple faute d'orthographe, si vous souhaitez nous faire part d'un manque, ou n'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èbre linéaire de niveau bac +2, mais des explications simples, allant droit au but, permettant aux développeurs 3D d'avoir sous la main une base de connaissance de référence. De plus, les formules données sont le plus souvent possible accompagnées du 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 sont effectuées par des personnes compétentes en mathématiques, et un effort est constamment fait quant à l'exactitude des informations fournies. - 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 œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, 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 vous encourez 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/ " id="pdf-obj-3-3" src="pdf-obj-3-3.jpg">

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, ou n'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èbre linéaire de niveau bac +2, mais des explications simples, allant droit au but, permettant aux développeurs 3D d'avoir sous la main une base de connaissance de référence. De plus, les formules données sont le plus souvent possible accompagnées du 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 sont effectuées par des personnes compétentes en mathématiques, et un effort est constamment fait quant à l'exactitude des informations fournies.

Sommaire > Matrices - 5 - Les sources présentées sur cette page sont libres de droitshttp://jeux.developpez.com/faq/math/ " id="pdf-obj-4-3" src="pdf-obj-4-3.jpg">

Sommaire > Matrices

Sommaire > Matrices > Bases Qu'est ce qu'une matrice ? Auteurs : Hexapod , <a href=LeGreg , Une matrice est un outil mathématique utilisé dans beaucoup de domaines dont la 3D. On peut les représenter comme un 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 comme l'addition, la soustraction, la multiplication ou l'inversion. Cependant à cause de leur nature plus complexe certaines de 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 couples lignes|colonnes : L'élément en haut à droite de la matrice, à i = 0 et j = 3, est identifié comme suit : M i,j = M 0,3 Une matrice n'est pas seulement un tableau de valeurs mais elle représente une transformation d'un espace de départ vers un espace d'arrivée. Si par exemple, on a un vecteur colonne à deux dimensions, alors on peut définir le vecteur colonne 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 est appelée linéaire parce qu'elle respecte certaines propriétés comme la conservation des facteurs d'échelle (et a un point fixe qui est l'origine). Les matrices les plus utilisées en informatique graphique sont donc celles qui transforment les vecteurs à deux dimensions ou à trois dimensions. Cela inclut notamment les matrices 2x2 qui représentent les transformations linéaires du plan 2D (rotation, mise à l'échelle autour de l'origine, miroir), et les matrices 3x3 qui représentent les transformations liné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. La raison d'être de ces matrices, c'est qu'elles représentent de manière très pratique certaines opérations non linéaires dans l'espace en 3D (translation, projection conique sur un plan), en ajoutant une quatrième coordonnée (la coordonnée homogè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 pour faire simple, il y a une loi qui permet de passer de l'espace 3D à l'espace homogène et vice versa : - 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 œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, 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 vous encourez 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/ " id="pdf-obj-5-3" src="pdf-obj-5-3.jpg">

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 comme un 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 comme l'addition, la soustraction, la multiplication ou l'inversion. Cependant à cause de leur nature plus complexe certaines de 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 couples lignes|colonnes :

 
Sommaire > Matrices > Bases Qu'est ce qu'une matrice ? Auteurs : Hexapod , <a href=LeGreg , Une matrice est un outil mathématique utilisé dans beaucoup de domaines dont la 3D. On peut les représenter comme un 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 comme l'addition, la soustraction, la multiplication ou l'inversion. Cependant à cause de leur nature plus complexe certaines de 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 couples lignes|colonnes : L'élément en haut à droite de la matrice, à i = 0 et j = 3, est identifié comme suit : M i,j = M 0,3 Une matrice n'est pas seulement un tableau de valeurs mais elle représente une transformation d'un espace de départ vers un espace d'arrivée. Si par exemple, on a un vecteur colonne à deux dimensions, alors on peut définir le vecteur colonne 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 est appelée linéaire parce qu'elle respecte certaines propriétés comme la conservation des facteurs d'échelle (et a un point fixe qui est l'origine). Les matrices les plus utilisées en informatique graphique sont donc celles qui transforment les vecteurs à deux dimensions ou à trois dimensions. Cela inclut notamment les matrices 2x2 qui représentent les transformations linéaires du plan 2D (rotation, mise à l'échelle autour de l'origine, miroir), et les matrices 3x3 qui représentent les transformations liné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. La raison d'être de ces matrices, c'est qu'elles représentent de manière très pratique certaines opérations non linéaires dans l'espace en 3D (translation, projection conique sur un plan), en ajoutant une quatrième coordonnée (la coordonnée homogè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 pour faire simple, il y a une loi qui permet de passer de l'espace 3D à l'espace homogène et vice versa : " id="pdf-obj-5-37" src="pdf-obj-5-37.jpg">

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

M

i,j = M 0,3

Une matrice n'est pas seulement un tableau de valeurs mais elle représente une transformation d'un espace de départ vers un espace d'arrivée. Si par exemple, on a un vecteur colonne à deux dimensions, alors on peut définir le vecteur colonne 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 est appelée linéaire parce qu'elle respecte certaines propriétés comme la conservation des facteurs d'échelle (et a un point fixe qui est l'origine).

Les matrices les plus utilisées en informatique graphique sont donc celles qui transforment les vecteurs à deux dimensions ou à trois dimensions. Cela inclut notamment les matrices 2x2 qui représentent les transformations linéaires du plan 2D (rotation, mise à l'échelle autour de l'origine, miroir), et les matrices 3x3 qui représentent les transformations liné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. La raison d'être de ces matrices, c'est qu'elles représentent de manière très pratique certaines opérations non linéaires dans l'espace en 3D (translation, projection conique sur un plan), en ajoutant une quatrième coordonnée (la coordonnée homogè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 pour faire simple, il y a une loi qui permet de passer de l'espace 3D à l'espace homogène et vice versa :

coordonnées 3D -> coordonnées homogènes : (x, y, z) -> (x, y, z, 1) coordonnées homogènesLeGreg , Les représentations des matrices peuvent être différentes d'un programme à un autre. Il faut notamment faire attention aux 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 ]; - 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 œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, 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 vous encourez 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/ " id="pdf-obj-6-3" src="pdf-obj-6-3.jpg">

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 plus courantes 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 est dites 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 attention aux 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];

C'est là que la convention est importante, parce que l'aurait tout aussi bien pu y accéderboost::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 ralentir l'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ées qui 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 planifier le design d'un système d'animation 3D. Une telle approche permet très simplement d'envisager l'implémentation de l'animation des personnages, des courbes splines, de la cinématique inverse, ... - 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 œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, 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 vous encourez 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/ " id="pdf-obj-7-3" src="pdf-obj-7-3.jpg">
 

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. Ou encore 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 de la meilleure performance de l'un (passer les vecteurs colonnes/lignes directement), ou la plus grande facilité à déboguer de l'autre.

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

Attention aux conventions, si l'API prévoit que les éléments d'un vecteur colonne sont adjacents en mémoire on essaye en 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 des bugs de conversions. Mieux : certaines API comme par exemple Direct3D proposent en standard une classe MATRIX qu'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 :

 

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 ralentir l'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ées qui 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 planifier le design d'un système d'animation 3D. Une telle approche permet très simplement d'envisager l'implémentation de l'animation des personnages, des courbes splines, de la cinématique inverse, ...

Néanmoins, une des objections qui revient fréquemment est qu'il serait plus rapide de juste multiplier chaquehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-8-3" src="pdf-obj-8-3.jpg">

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

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éfini comme suit :

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

Ce qui revient à ceci :

// Translation de chaque vertex

// Rotation de chaque vertex

// Setup - une seule fois

x2 = x1 * cy + z1 * sy y2 = y1 z2 = z1 * cy - x1 * sy

x3 = x2 * cz - y2 * sz y3 = x2 * sz + y2 * cz z3 = z2

y1 = y * cx - z * sx z1 = y * sx + z * cx

xr = x3 + D yr = y3 + E zr = z3 + F

sx = sin(A) cx = cos(A) sy = sin(B) cy = cos(B) sz = sin(C) cz = cos(C)

x1 = x

 

Initialisation

 

Par sommet

6

fonctions trigonometriques

 

6

affectations

12

affectations

 

12

multiplications

 

9

additions

 

Initialisation

Différence

 

Par sommet

Différence

6

fonctions

0

 

0

trigonometriques

 

affectations

18

-12

3

affectations

-9

 

multiplications

12

+12

9

multiplications

-3

6

soustractions

+6

6

additions

-3

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

Voici le taux de calcul pris par cet algorithme :

Pour une matrice 4x4, on a :

En comparant les deux tables, on peut constater que la préparation d'une matrice de rotation coûtehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-9-3" src="pdf-obj-9-3.jpg">

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

Néanmoins, alors que cela peut sembler étrange, l'économie vient du calcul de chaque vertex. En utilisant la multiplication 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 :

 
Comment relier les matrices au système de coordonnées ? Auteurs : Hexapod , La relation entre

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]

Sommaire > Matrices > Arithmétique Qu'est ce que la matrice identité ? Auteurs : Hexapod ,http://jeux.developpez.com/faq/math/ " id="pdf-obj-10-3" src="pdf-obj-10-3.jpg">

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 que i = j valent 1 et les autres 0. Par exemple :

Sommaire > Matrices > Arithmétique Qu'est ce que la matrice identité ? Auteurs : Hexapod ,

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 à celui de la colonne (M ij 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 M T , est la matrice générée par l'inversion des éléments de la matrice d'origine par rapport à la diagonale :

M

t ij = M ji

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

 

Soit M :

Qu'est ce que la transposée d'une matrice ? Auteurs : Hexapod , La transposée d'une matrice

La transposée de M est :

Qu'est ce que la transposée d'une matrice ? Auteurs : Hexapod , La transposée d'une matrice
Si la matrice est une matrice de rotation, la transposée est la rotation inverse. Comment ajouterhttp://jeux.developpez.com/faq/math/ " id="pdf-obj-11-3" src="pdf-obj-11-3.jpg">

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 :

R ij = M ij + L ij

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

Par exemple :

Comment ajouter deux matrices ? Auteurs : Hexapod , L'addition peut s'exprimer comme suit : R

Comment soustraire deux matrices ?

Auteurs : Hexapod ,

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

R ij = M ij - L ij

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

Par exemple :

Comment multiplier deux matrices ? Auteurs : Hexapod , Il faut multiplier chaque élément d'une lignehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-12-3" src="pdf-obj-12-3.jpg">
Comment multiplier deux matrices ? Auteurs : Hexapod , Il faut multiplier chaque élément d'une lignehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-12-6" src="pdf-obj-12-6.jpg">

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 seconde et faire la somme.

On peut l'exprimer comme suit :

Comment multiplier deux matrices ? Auteurs : Hexapod , Il faut multiplier chaque élément d'une ligne

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 :

Comment multiplier deux matrices ? Auteurs : Hexapod , Il faut multiplier chaque élément d'une ligne

et L par :

Alors, la taille de la matrice résultante est 2x4 : Comment élever une matrice à unehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-13-3" src="pdf-obj-13-3.jpg">
Alors, la taille de la matrice résultante est 2x4 :
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 chaque puissance, 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.

M 0 génère la matrice identité

M 1 ne modifie pas la matrice

M 2 élève la matrice au carré M 3 é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,

M 2 = M x M

M 3 = M x M x M

Elever la matrice identité à n'importe quelle puissance conserve la matrice identité : I = I.http://jeux.developpez.com/faq/math/ " id="pdf-obj-14-3" src="pdf-obj-14-3.jpg">

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

Comment multiplier un ou plusieurs vecteurs par une matrice ? Auteurs : Hexapod , Le meilleur
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 chaque
vecteur 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 :
Pour chaque vecteur de la liste, il y aura un total de 12 multiplications, 16 additionshttp://jeux.developpez.com/faq/math/ " id="pdf-obj-15-3" src="pdf-obj-15-3.jpg">

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.

Sommaire > Matrices > Déterminants et inverses Qu'est ce que le déterminant d'une matrice ? Auteurshttp://jeux.developpez.com/faq/math/ " id="pdf-obj-16-3" src="pdf-obj-16-3.jpg">

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'il est nul, aucun inverse n'existe. Le déterminant n'est calculable que sur les matrices carrées (possédant autant de lignes que de colonnes).

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

Sommaire > Matrices > Déterminants et inverses Qu'est ce que le déterminant d'une matrice ? Auteurs

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 :

Sommaire > Matrices > Déterminants et inverses Qu'est ce que le déterminant d'une matrice ? Auteurs

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 :

Sommaire > Matrices > Déterminants et inverses Qu'est ce que le déterminant d'une matrice ? Auteurs

Voici le calcul de son déterminant :

Comment calculer le déterminant d'une matrice ? Auteurs : Hexapod , Le déterminant d'une matrice sehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-17-3" src="pdf-obj-17-3.jpg">
Comment calculer le déterminant d'une matrice ? Auteurs : Hexapod , Le déterminant d'une matrice sehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-17-6" src="pdf-obj-17-6.jpg">

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 matrice en des matrices plus petites.

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

Comment calculer le déterminant d'une matrice ? Auteurs : Hexapod , Le déterminant d'une matrice se

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

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

Comment calculer le déterminant d'une matrice ? Auteurs : Hexapod , Le déterminant d'une matrice se

Et pour les matrices 3x3 :

Comment calculer le déterminant d'une matrice ? Auteurs : Hexapod , Le déterminant d'une matrice se

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.

Une matrice qui n'est pas dans ce cas est dite anisotrope. Quand une matrice 3x3 ouhttp://jeux.developpez.com/faq/math/ " id="pdf-obj-18-3" src="pdf-obj-18-3.jpg">

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'agrandir ou 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 :

Une matrice qui n'est pas dans ce cas est dite anisotrope. Quand une matrice 3x3 ou

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 avec les 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'étant plus normalisées, elles peuvent perturber d'autres calculs comme l'ombrage (shading) ou l'élimination des parties caché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 :

Qu'est ce que l'inverse d'une matrice ? Auteurs : Hexapod , Etant donnée une matrice M,

Où I est la matrice identité.

Ainsi, multiplier une matrice par son inverse génère la matrice identité. Néanmoins, plusieurs conditions doivent être ré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 soit non nul.

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

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 :

La résolution pour les matrices 2x2 ou plus peut être réalisée à l'aide de Comment calculerhttp://jeux.developpez.com/faq/math/ " id="pdf-obj-19-3" src="pdf-obj-19-3.jpg">
La résolution pour les matrices 2x2 ou plus peut être réalisée à l'aide de Comment calculer

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 Comment calculer l'inverse d'une matrice de rotation ?, l'inverse est déjà connu ou peut être déterminé à l'aide de la transposée de la matrice.

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

Auteurs : Hexapod ,

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

Comment calculer l'inverse d'une matrice identité ? Auteurs : Hexapod , L'inverse d'une matrice identité est

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
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'est
ce que la transposée d'une matrice ?.
Il existe également une autre façon de faire, si l'angle et l'axe de rotation sont connus.http://jeux.developpez.com/faq/math/ " id="pdf-obj-20-3" src="pdf-obj-20-3.jpg">

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é de l'angle (-20 pour 20 par exemple) et de calculer une nouvelle matrice de rotation (voir Comment générer une matrice de 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 :

Comment calculer l'inverse d'une matrice à l'aide de Kramer ? Auteurs : Hexapod , Il faut

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

Comment calculer l'inverse d'une matrice à l'aide de Kramer ? Auteurs : Hexapod , Il faut

Avec la commatrice de M définie par :

Comment calculer l'inverse d'une matrice à l'aide de Kramer ? Auteurs : Hexapod , Il faut

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 n 2 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 un programme 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, par exemple 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 :

Comment calculer l'inverse d'une matrice 2x2 ? Auteurs : Hexapod , Pour une matrice 2x2, les

Le déterminant est :

Et l'inverse se définit par : Ceci peut être démontré par les règles de Kramer. Soithttp://jeux.developpez.com/faq/math/ " id="pdf-obj-21-3" src="pdf-obj-21-3.jpg">
Et l'inverse se définit par : Ceci peut être démontré par les règles de Kramer. Soithttp://jeux.developpez.com/faq/math/ " id="pdf-obj-21-6" src="pdf-obj-21-6.jpg">

Et l'inverse se définit par :

Et l'inverse se définit par : Ceci peut être démontré par les règles de Kramer. Soithttp://jeux.developpez.com/faq/math/ " id="pdf-obj-21-10" src="pdf-obj-21-10.jpg">

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

Et l'inverse se définit par : Ceci peut être démontré par les règles de Kramer. Soithttp://jeux.developpez.com/faq/math/ " id="pdf-obj-21-14" src="pdf-obj-21-14.jpg">

Alors, le déterminant est :

Et l'inverse se définit par : Ceci peut être démontré par les règles de Kramer. Soithttp://jeux.developpez.com/faq/math/ " id="pdf-obj-21-18" src="pdf-obj-21-18.jpg">

Et l'inverse s'obtient par :

Et l'inverse se définit par : Ceci peut être démontré par les règles de Kramer. Soithttp://jeux.developpez.com/faq/math/ " id="pdf-obj-21-22" src="pdf-obj-21-22.jpg">

Donc l'inverse de la matrice est :

Et l'inverse se définit par : Ceci peut être démontré par les règles de Kramer. Soithttp://jeux.developpez.com/faq/math/ " id="pdf-obj-21-26" src="pdf-obj-21-26.jpg">
Si le déterminant est non nul. Comment calculer l'inverse d'une matrice 3x3 ? Auteurs : Hexapodhttp://jeux.developpez.com/faq/math/ " id="pdf-obj-22-3" src="pdf-obj-22-3.jpg">

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 ensemble d'équations linéaires.

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

 
 
Comment calculer l'inverse d'une matrice 3x3 ? Auteurs : Hexapod , Pour les matrices 3x3 ou

Alors, le déterminant se calcule comme suit :

 
Comment calculer l'inverse d'une matrice 3x3 ? Auteurs : Hexapod , Pour les matrices 3x3 ou

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

 
Comment calculer l'inverse d'une matrice 3x3 ? Auteurs : Hexapod , Pour les matrices 3x3 ou

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;

mr[ 2 ] = ma[ 1 ] * ma[ 5 ] - ma[ 4 ] *http://jeux.developpez.com/faq/math/ " id="pdf-obj-23-3" src="pdf-obj-23-3.jpg">
   

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
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 )
{
VFLOAT det, result = 0 , i = 1 ; MATRIX3 msub3; int n; /* Parcourshttp://jeux.developpez.com/faq/math/ " id="pdf-obj-24-3" src="pdf-obj-24-3.jpg">
   

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 rotations inverses et la résolution d'équations matricielles.

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

Auteurs : Hexapod ,

Soit M :

Comment calculer l'inverse d'une matrice à l'aide d'équations linéaires ? Auteurs : Hexapod , Soit M
telle que l'inverse existe : Alors on a : Donc, la matrice inverse peut être calculéehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-25-3" src="pdf-obj-25-3.jpg">

telle que l'inverse existe :

telle que l'inverse existe : Alors on a : Donc, la matrice inverse peut être calculée

Alors on a :

telle que l'inverse existe : Alors on a : Donc, la matrice inverse peut être calculée

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

telle que l'inverse existe : Alors on a : Donc, la matrice inverse peut être calculée
Sommaire > Matrices > Transformations Qu'est ce qu'une matrice de rotation ? Auteurs : Hexapod ,http://jeux.developpez.com/faq/math/ " id="pdf-obj-26-3" src="pdf-obj-26-3.jpg">

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 point a 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 :

Sommaire > Matrices > Transformations Qu'est ce qu'une matrice de rotation ? Auteurs : Hexapod ,

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

Sommaire > Matrices > Transformations Qu'est ce qu'une matrice de rotation ? Auteurs : Hexapod ,

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

Sommaire > Matrices > Transformations Qu'est ce qu'une matrice de rotation ? Auteurs : Hexapod ,

Si l'angle vaut -90 degrées :

Sommaire > Matrices > Transformations Qu'est ce qu'une matrice de rotation ? Auteurs : Hexapod ,

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 :

Comment générer une matrice de rotation d'axe Y ? Auteurs : Hexapod , Utilisez la matricehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-27-3" src="pdf-obj-27-3.jpg">
Comment générer une matrice de rotation d'axe Y ? Auteurs : Hexapod , Utilisez la matricehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-27-6" src="pdf-obj-27-6.jpg">

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 Y ? Auteurs : Hexapod , Utilisez la matrice

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

Auteurs : Hexapod ,

Utilisez la matrice 4x4 suivante :

Comment générer une matrice de rotation d'axe Z ? Auteurs : Hexapod , Utilisez la matrice
 

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 rotations autour 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

(0, 80, 90) est une rotation de 80° autour de Y, suivie d'une rotation de 90°http://jeux.developpez.com/faq/math/ " id="pdf-obj-28-3" src="pdf-obj-28-3.jpg">
 

(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 la rotation 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 rotations autour 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.

Du coup, toutes rotation autour de l'axe X tourne l'objet suivant Z ! Pire encore, illoka , gouessej , La seule solution à ce problème est de transformer les axes de rotations suivants avec les rotations précédentes. Ces transformations requièrent un outil de combinaison de rotations quelconques, ce qui s'avère plus facile avec des Qu'est ce 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 à fait possible 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 autour de 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 ainsi tous 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ésultats de 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 de vision 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 : - 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 œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2005-2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, 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 vous encourez 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/ " id="pdf-obj-29-3" src="pdf-obj-29-3.jpg">

Du coup, toutes rotation autour de l'axe X tourne l'objet suivant Z ! Pire encore, il est devenu impossible de tourner l'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. Ces transformations requièrent un outil de combinaison de rotations quelconques, ce qui s'avère plus facile avec des Qu'est ce 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 à fait possible 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 autour de 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 ainsi tous 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ésultats de 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 :

Quel est la manière correcte de combiner les matrices de rotations ? Auteurs : Hexapod ,

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 de vision 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 :

Quel est la manière correcte de combiner les matrices de rotations ? Auteurs : Hexapod ,
Ceci est l'inverse (ou la transposée) de la matrice de rotation de l'objet. Comment générer unehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-30-3" src="pdf-obj-30-3.jpg">

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 ce que 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 des valeurs arbitraires, près de 75% de chaque opération matricielle est en fait pure perte ! Ceci n'inclut pas l'initialisation des 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 :

Comment générer une matrice de rotation à partir d'angles d'Euler ? Auteurs : Hexapod , A

Où :

M est la matrice finale X est la matrice de rotation autour de l'axe X Y est la matrice de rotation autour de l'axe Y Z est la matrice de rotation autour de l'axe Z

 

Soit les matrices associées :

Où A, B sont le cosinus et le sinus de la rotation autour de l'axe X,http://jeux.developpez.com/faq/math/ " id="pdf-obj-31-3" src="pdf-obj-31-3.jpg">
Où A, B sont le cosinus et le sinus de la rotation autour de l'axe X,http://jeux.developpez.com/faq/math/ " id="pdf-obj-31-6" src="pdf-obj-31-6.jpg">

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 :

Où A, B sont le cosinus et le sinus de la rotation autour de l'axe X,http://jeux.developpez.com/faq/math/ " id="pdf-obj-31-12" src="pdf-obj-31-12.jpg">

Peut se partager en 2 multiplications de matrices :

Où A, B sont le cosinus et le sinus de la rotation autour de l'axe X,http://jeux.developpez.com/faq/math/ " id="pdf-obj-31-16" src="pdf-obj-31-16.jpg">

Evaluons M' :

Où A, B sont le cosinus et le sinus de la rotation autour de l'axe X,http://jeux.developpez.com/faq/math/ " id="pdf-obj-31-20" src="pdf-obj-31-20.jpg">

D'où M devient :

C'est la matrice de rotation finale. En tant que matrice 4x4 : Les valeurs individuelles dehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-32-3" src="pdf-obj-32-3.jpg">
C'est la matrice de rotation finale. En tant que matrice 4x4 : Les valeurs individuelles de

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

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

Les valeurs individuelles de A,B,C,D,E et F sont évaluées en premier. Ensuite, on évalue BD et AD puisqu'ils sont fré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]

mat[5]

= -BD * E + A * F; =

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 !

Donc, par l'utilisation de l'algorithme optimisé, on réalise un gain de 1000% ! Comment générer deshttp://jeux.developpez.com/faq/math/ " id="pdf-obj-33-3" src="pdf-obj-33-3.jpg">

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 :

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

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 :

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

En comparant les deux tables, on constate que l'élément [2] a la valeur de -D, soit -sin(Y). Donc, la rotation autour de l'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ère colonne :

 

/* 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ésultat aux 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 la matrice, on a :

D'où : En arrangeant : On peut voir la matrice sous cette forme : Où :http://jeux.developpez.com/faq/math/ " id="pdf-obj-34-3" src="pdf-obj-34-3.jpg">
D'où : En arrangeant : On peut voir la matrice sous cette forme : Où :

D'où :

D'où : En arrangeant : On peut voir la matrice sous cette forme : Où :

En arrangeant :

 
D'où : En arrangeant : On peut voir la matrice sous cette forme : Où :

On peut voir la matrice sous cette forme :

 
D'où : En arrangeant : On peut voir la matrice sous cette forme : Où :

Où :

V vaut BE - AF W 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;

 
trx = mat[ 0 ] / C; /* Calcul de l'angle Z */ try = -http://jeux.developpez.com/faq/math/ " id="pdf-obj-35-3" src="pdf-obj-35-3.jpg">
   

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); angle_y = clamp(angle_y, 0, 360); angle_z = clamp(angle_z, 0, 360);

/* Modulo ;) */

 

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 en matrice 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 sont dans 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 angulaire entre les deux vecteurs.

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

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

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

Comment générer une matrice de rotation pour rendre deux vecteurs colinéaires ? Auteurs : Hexapod ,
Attention, si ceux-ci ne sont pas normalisés il faudra tenir compte de leur norme dans lehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-36-3" src="pdf-obj-36-3.jpg">

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

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

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 matrices 3x3 ou 4x4.

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

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

Où :

Mfinale est la matrice du système de coordonnées final, Morig est le système de coordonnées original et Mrot est la matrice de rotation voulue.

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

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

Ainsi, la matrice de rotation peut être calculée via la multiplication de la matrice finale avec l'inverse de la matrice de 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 forme matricielle 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 :

Si le vecteur est (0, 0, 0) alors la matrice correspondante est l'identité, et l'objet n'esthttp://jeux.developpez.com/faq/math/ " id="pdf-obj-37-3" src="pdf-obj-37-3.jpg">
Si le vecteur est (0, 0, 0) alors la matrice correspondante est l'identité, et l'objet n'est

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 :

Qu'est ce qu'une matrice de mise à l'échelle ? Auteurs : Hexapod , C'est une matrice

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 italiques par 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 :

Où S représente une déformation de l'axe I selon l'axe J. Comment réaliser une interpolation linéairehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-38-3" src="pdf-obj-38-3.jpg">
Où S représente une déformation de l'axe I selon l'axe J.

Où S ij 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 positions intermé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 :

Comment réaliser une interpolation linéaire entre deux matrices ? Auteurs : Hexapod , Etant données deux

Où :

  • V r est le vecteur résultant

  • V a est le vecteur position de départ

  • V b 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édiaires spé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 quatres matrices 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 des splines, ce vecteur est converti en une matrice d'interpolation M.

Si G est défini comme tel :

Alors, la multiplication par la matrice de base : Va générer une matrice d'interpolation 3x4 Mhttp://jeux.developpez.com/faq/math/ " id="pdf-obj-39-3" src="pdf-obj-39-3.jpg">
Alors, la multiplication par la matrice de base : Va générer une matrice d'interpolation 3x4 M

Alors, la multiplication par la matrice de base :

Alors, la multiplication par la matrice de base : Va générer une matrice d'interpolation 3x4 M

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

Alors, la multiplication par la matrice de base : Va générer une matrice d'interpolation 3x4 M

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 :

Alors, la multiplication par la matrice de base : Va générer une matrice d'interpolation 3x4 M

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 le sens 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 cette interpolation.

Sommaire > Quaternions Qu'est ce que les quaternions ? Auteurs : Hexapod , Les quaternions permettenthttp://jeux.developpez.com/faq/math/ " id="pdf-obj-40-3" src="pdf-obj-40-3.jpg">

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 ainsi d'é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 sont réalisées les rotations.

Les quaternions solutionnent ce problème. Au lieu de tourner un objet via une série de rotations successives, les quaternions 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 matrices ensembles, 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 plus réalistes.

 

Comment calculer le conjugué d'un quaternion ?

 

Auteurs : Hexapod ,

 

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

Comment calculer le conjugué d'un quaternion ? Auteurs : Hexapod , Ceci peut être fait en

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

Ce qui peut s'implémenter comme suit : QFLOAT quaternion_magnitude(QUAT * qa) { return sqrt(qa -> qwhttp://jeux.developpez.com/faq/math/ " id="pdf-obj-41-3" src="pdf-obj-41-3.jpg">
 
Ce qui peut s'implémenter comme suit : QFLOAT quaternion_magnitude(QUAT * qa) { return sqrt(qa -> qw

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 Comment calculer 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 cas où celui-ci est Comment normaliser un quaternion ?.

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

Comment calculer l'inverse d'un quaternion ? Auteurs : Hexapod , Calculer l'inverse d'un quaternion revient à

Comment multiplier deux quaternions ?

Auteurs : Hexapod ,

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

Comment multiplier deux quaternions ? Auteurs : Hexapod , Soit deux quaternions Q1 et Q2, l'objectif

Ceci peut se faire via cette expression :

Comment multiplier deux quaternions ? Auteurs : Hexapod , Soit deux quaternions Q1 et Q2, l'objectif

Où :

v1 = (x,y,z) de Q1 w1 = (w) de Q1 v2 = (x,y,z) de Q2 w2http://jeux.developpez.com/faq/math/ " id="pdf-obj-42-3" src="pdf-obj-42-3.jpg">
   

v1 = (x,y,z) de Q1

w1 = (w)

de Q1

v2 = (x,y,z) de Q2

w2 = (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 :

 
Comment convertir un quaternion en matrice de rotation ? Auteurs : Hexapod , Soit un quaternion

Si une matrice 4x4 est requise, alors la dernière ligne et la dernière colonne peuvent être mises à 0, et M 3, 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 );

mat[ 2 ] = 2 * ( xz + yw ); mat[ 4 ] = 2http://jeux.developpez.com/faq/math/ " id="pdf-obj-43-3" src="pdf-obj-43-3.jpg">
 

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 :

Comment convertir une matrice de rotation en un quaternion ? Auteurs : Hexapod , Une matrice

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

Comment convertir une matrice de rotation en un quaternion ? Auteurs : Hexapod , Une matrice

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 la diagonale principale de la matrice.

En fonction de la position de cette valeur :

Si c'est M 0, 0 :

Si c'est M : Si c'est M : - 45 - Les sources présentées sur cettehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-44-3" src="pdf-obj-44-3.jpg">
Si c'est M : Si c'est M : - 45 - Les sources présentées sur cettehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-44-6" src="pdf-obj-44-6.jpg">

Si c'est M 1, 1 :

Si c'est M : Si c'est M : - 45 - Les sources présentées sur cettehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-44-12" src="pdf-obj-44-12.jpg">

Si c'est M 2, 2 :

Si c'est M : Si c'est M : - 45 - Les sources présentées sur cettehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-44-18" src="pdf-obj-44-18.jpg">
Le quaternion est finalement défini par Q = (X, Y, Z, W). Comment convertir un axehttp://jeux.developpez.com/faq/math/ " id="pdf-obj-45-3" src="pdf-obj-45-3.jpg">

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_a q->y = axis->y * sin_a q->z = axis->z * sin_a q->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 du demi-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 :

sin_a = sin(angle / 2 ) cos_a = cos(angle / 2 ) sin_lat = sin(latitude) cos_lathttp://jeux.developpez.com/faq/math/ " id="pdf-obj-46-3" src="pdf-obj-46-3.jpg">
 

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_long