Supprimons les quaternions de tous les moteurs 3D

image

Les programmeurs graphiques utilisent des quaternions pour enregistrer des virages en trois dimensions. Cependant, les quaternions sont difficiles à comprendre car ils sont étudiés superficiellement . Nous prenons simplement d'étranges tables de multiplication et d'autres définitions cryptiques sur la foi, et les utilisons comme des «boîtes noires» qui font tourner les vecteurs selon nos besoins. Pourquoi  mathbfi2= mathbfj2= mathbfk2=1 et  mathbfi mathbfj= mathbfk ? Pourquoi prenons-nous un vecteur et le transformons-nous en un vecteur "imaginaire" pour le transformer, par exemple  mathbfq(x mathbfi+y mathbfj+z mathbfk) mathbfq ? Mais peu importe si tout fonctionne, non?

Il existe un moyen de décrire les rotations appelées rotor , qui fait référence au domaine des nombres complexes (en 2D) et des quaternions (en 3D), et se généralise même à n'importe quel nombre de dimensions.

Nous pouvons créer des rotors presque entièrement à partir de zéro , au lieu de définir des quaternions à partir de rien et d'essayer d'expliquer comment ils fonctionnent rétroactivement . Cela prend plus de temps, mais cela me semble utile, car ils sont beaucoup plus faciles à comprendre!

De plus, pour la visualisation et la compréhension des rotors tridimensionnels, il n'est pas nécessaire d'utiliser la quatrième dimension spatiale.

Ce serait formidable s'ils commençaient à supplanter l'utilisation et l'étude des quaternions, en les remplaçant par des rotors. Les remplacer est très simple, mais le code restera presque le même . Tout ce qui peut être fait avec des quaternions, par exemple l'interpolation et la suppression des verrous d'essieu (serrure à cardan), peut être fait avec des rotors. Mais nous commençons à comprendre beaucoup plus.

(Dans l'article d'origine, tous les graphiques sont interactifs et l'article est suivi d'une vidéo. En cliquant sur les boutons de lecture, vous pouvez démarrer la section correspondante de la vidéo. Vous pouvez également cliquer sur le bouton de transition sous la vidéo pour accéder à la section correspondante de l'article. Vous pouvez agrandir la fenêtre pour qu'il y ait plus d'espace pour la vidéo. ou définissez-en une taille constante.)

1. Avions tournants


1.1. Les virages sont effectués sur des plans bidimensionnels.


Dans l'espace tridimensionnel, nous percevons généralement les virages comme se produisant autour des axes, comme une roue tournant sur un axe, mais il serait plutôt plus correct de représenter le plan sur lequel se trouve la roue. Ce plan est perpendiculaire à l'axe.


Cette vieille femme tourne une roue dans l'avion  mathbfxz perpendiculaire à l'axe  mathbfy .

Cela se produit parce que si nous divisons le vecteur en deux parties, dont l'une se trouve sur le plan (  mathbfv parallel ), et l'autre est à l'extérieur (  mathbfv perp ), puis la rotation fait tourner la partie intérieure et l'extérieur reste inchangé.


Rotation dans l'avion yx [ dans l'article original cette animation et la caméra peuvent être déplacées ]

Dans l'espace bidimensionnel, il n'y a qu'un seul plan dans lequel la rotation est possible ( il n'y a pas de partie externe ). Par conséquent, supposer que des rotations se produisent autour du troisième axe (perpendiculaire au plan 2D) est strictement incorrect, car pour terminer les rotations, nous ne devons pas ajouter une autre dimension.

Si nous parlons au «propriétaire de terrain plat» bidimensionnel (qui vit à l'intérieur du plan 2D et n'est jamais sorti de l'espace bidimensionnel) de l'axe de rotation perpendiculaire, alors il demanderait: «Dans quelle direction cet axe pointe-t-il? Je ne peux pas l'imaginer! "

Remarque
Et dans des dimensions supérieures (4D et plus), il est impossible de déterminer un vecteur normal au plan 2D (par exemple, dans 4D, le plan 2D a deux directions de normales, dans 5D il y a trois directions de normales, et dans nD leur n2 )

1.2. La direction exacte des virages


De plus, quand on pense à la rotation autour d'un axe, le sens de rotation n'est pas défini, et donc il doit être déterminé par une règle (dite "règle de droite").

Cependant, si nous supposons que les virages se produisent à l'intérieur des plans, alors la direction devient claire: rotation dans le plan  mathbfxy signifie une rotation qui déplace un vecteur (unité)  mathbfx au vecteur (unité)  mathbfy à l'intérieur de l'avion, ils forment ensemble. Rotation dans l'avion  mathbfyx Est une rotation dans le sens opposé: elle déplace le vecteur  mathbfy au vecteur  mathbfx .

Remarque
Je me souviens que lorsque j'ai découvert pour la première fois trois matrices de rotations 3D le long de plans orthogonaux, j'ai d'abord pensé: qu'est-ce qu'une matrice  mathbfRy a le signe opposé? Cela est dû à la règle de la main droite, selon laquelle nous devons déterminer la rotation autour de l'axe  mathbfy de sorte qu'il va de  mathbfz à  mathbfx pas de  mathbfx à  mathbfz pour maintenir un sens de rotation "droitier" constant. Lorsque nous commençons à parler directement de l'avion lui-même, cette règle devient inutile.

R_X (\ theta) = \ begin {bmatrix} 1 & 0 & 0 \\ 0 & cos (\ theta) & -sin (\ theta) \\ 0 & sin (\ theta) & cos (\ theta) \ end {bmatrix} \: \: \: R_Y (\ theta) = \ begin {bmatrix} cos (\ theta) & 0 & \ bbox [5px, border-bottom: 2px solid red] {\ \} sin (\ theta) \\ 0 & 1 & 0 \\ \ bbox [5px, border-bottom: 2px solid red] {-} sin (\ theta) & 0 & cos (\ theta) \ end {bmatrix} \: \: \: R_Z (\ theta) = \ begin {bmatrix} cos (\ theta) & -sin (\ theta) & 0 \\ sin (\ theta) & cos (\ theta) & 0 \\ 0 & 0 & 1 \ end {bmatrix }


2. Bivecteurs



2.1. Travail externe


Pour calculer l'axe de rotation lors de la rotation d'un vecteur  mathbfa vers un autre vecteur  mathbfb nous prenons le produit vectoriel de deux vecteurs pour obtenir un vecteur perpendiculaire aux deux. Mais pourquoi devons-nous «quitter» l'avion si la rotation est essentiellement une opération bidimensionnelle?

Au lieu de cela, nous prenons ce qu'on appelle un produit externe (également connu sous le nom de produit vectoriel bidimensionnel), deux vecteurs, créant un nouvel élément appelé «bivecteur» (ou 2 vecteurs)  mathbfB représentant le plan que deux vecteurs forment ensemble. Si un produit vectoriel crée un vecteur normal au plan, le produit externe crée le plan lui-même . Le calcul de la normale au plan est sans importance.

 mathbfB= mathbfa wedge mathbfb


 mathbfB peut être représenté comme un parallélogramme construit à partir de vecteurs  mathbfa et  mathbfb dans le plan qu'ils forment ensemble.

Au début, l'idée d'un bivecteur peut sembler étrange, mais bientôt nous verrons qu'ils sont presque aussi fondamentaux que les vecteurs eux-mêmes . Si le vecteur peut être comparé à une ligne droite, alors le bivecteur est similaire à un avion ... Les propriétés d'un produit externe capturent les propriétés importantes des avions.

2.2. La base des bivecteurs



Les bivecteurs, comme les vecteurs, ont des composants. Mais ils sont déterminés sur la base d' avions et non de lignes droites , comme des vecteurs.

Trois plans basaux orthogonaux sont  mathbfx wedge mathbfy ,  mathbfx wedge mathbfz et  mathbfy wedge mathbfz comme nous le voyons sur la figure.

Mais d'abord, regardons un cas bidimensionnel plus simple ...

2.3. Bivecteurs bidimensionnels


En 2D, il n'y a qu'un seul plan, à savoir  mathbfxy . C'est-à-dire qu'un bivecteur bidimensionnel n'a qu'un seul composant. Pour un bivecteur composé de vecteurs  mathbfa et  mathbfb est le nombre Bxy égale à l'aire (avec un signe) du parallélogramme formée par deux vecteurs.

 mathbfB= mathbfa wedge mathbfb=Bxy( mathbfx wedge mathbfy)


Dans l'article original avec un bivecteur 2D, vous pouvez expérimenter sur le graphique interactif en changeant les vecteurs (simples) qui le composent:


Vous pouvez voir que lorsque l'angle entre les vecteurs change, la zone du parallélogramme change (conformément au sinus de l'angle).

Si les vecteurs sont identiques ou parallèles, alors ils ne forment pas un plan régulier et le résultat sera nul. Cette propriété simple définit ce qu'est un bivecteur:

 mathbfa wedge mathbfa=0


En regardant la somme de deux vecteurs, vous pouvez voir que la propriété suit:

\ begin {eqnarray} (\ mathbf {a} + \ mathbf {b}) \ wedge (\ mathbf {a} + \ mathbf {b}) & = & 0 \\ \ mathbf {a} \ wedge \ mathbf { a} + \ mathbf {b} \ wedge \ mathbf {a} + \ mathbf {a} \ wedge \ mathbf {b} + \ mathbf {b} \ wedge \ mathbf {b} & = & 0 \\ \ mathbf { b} \ wedge \ mathbf {a} + \ mathbf {a} \ wedge \ mathbf {b} & = & 0 \ end {eqnarray}


Par conséquent:

 mathbfa wedge mathbfb= mathbfb wedge mathbfa


Tout comme le sens de rotation , l'ordre des arguments dans le travail externe est important. La réorganisation des arguments modifie le signe du résultat (c'est ce qu'on appelle "l'antisymétrie").

Sur le graphique, le signe est indiqué par une couleur qui passe du bleu au vert. Le signe change lorsque le tour de  mathbfa dans  mathbfb se déplace du sens horaire au sens antihoraire (c'est-à-dire s'il correspond à la direction  mathbfx à  mathbfy ) ou direction (de  mathbfy à  mathbfx )).

Vous pouvez voir que les propriétés du produit externe sont disposées de manière à transmettre les propriétés des plans et des virages.

2.4. Bivecteurs bidimensionnels de vecteurs non unitaires


De toute évidence, les vecteurs n'ont pas à être de longueur unitaire, et cette restriction a été supprimée sur ce graphique:


L'aire du parallélogramme avec un signe est proportionnelle aux longueurs des deux vecteurs: Bxy=sin( alpha) |a | |b | alpha L'angle entre  mathbfa et  mathbfb . C'est, par exemple, lorsque vous doublez la longueur d'un vecteur, la zone double.

Nous pouvons obtenir la vraie valeur en substituant les vecteurs comme composants:

\ begin {eqnarray} \ mathbf {a} \ wedge \ mathbf {b} & = & (a_x \ mathbf {x} + a_y \ mathbf {y}) \ wedge (b_x \ mathbf {x} + b_y \ mathbf { y}) \\ & = & a_x b_x (\ mathbf {x} \ wedge \ mathbf {x}) + a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) + a_y b_x (\ mathbf {y} \ wedge \ mathbf {x}) + a_y b_y (\ mathbf {y} \ wedge \ mathbf {y}) \\ & = & a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) + a_y b_x ( \ mathbf {y} \ wedge \ mathbf {x}) \\ & = & a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) - a_y b_x (\ mathbf {x} \ wedge \ mathbf {y} ) \\ & = & (a_x b_y - a_y b_x) (\ mathbf {x} \ wedge \ mathbf {y}) \ end {eqnarray}


Bxy=axbybxay


2.5. Bivecteurs 3D



Identique aux coordonnées vectorielles  mathbfv peuvent être considérées comme des projections du vecteur sur trois axes de base orthogonaux (  mathbfx ,  mathbfy ,  mathbfz ), les coordonnées du bivecteur  mathbfB peut être considérée comme des projections plus petites qu'un plan sur trois plans basaux orthogonaux.

Les projections du vecteur sont les longueurs de ce vecteur le long de chaque vecteur de base, et les projections du bivecteur sont les zones du plan sur chaque plan de base.

Pour le vecteur:

 mathbfv= bbox[5px,bordureinférieure:2pxrougecontinu]vx mathbfx+ bbox[5px,bordureinférieure:2pxvertuni]vy mathbfy+ bbox[5pixels,bordinférieur:2pixelsbleufixe]vz mathbfz


Pour bivecteur:

 mathbfB= bbox[5px,borderbottom:2pxcorailsolide]Bxy( mathbfx wedge mathbfy)+ bbox[5px,borderbottom:2pxormassif]Bxz( mathbfx wedge mathbfz)+ bbox[5px,bordureinférieure:2pxsolidDarkViolet]Byz( mathbfy wedge mathbfz)


O Where Bxy , Bxz , Byz Sont juste des nombres comme vx , vy , vz (ils sont soulignés par les couleurs correspondant aux couleurs du graphique).

Les composants d'un bivecteur 3D ne sont que trois projections 2D d'un bivecteur sur un plan 2D de base.

En utilisant la même méthode que précédemment, nous constatons que les vraies valeurs des composants ressemblent beaucoup au composant XY du cas bidimensionnel, mais appliquées aux trois plans:

Bxy=axbybxay


Bxz=axbzbxaz


Byz=aybzbyaz


Vous pouvez expérimenter avec un bivecteur 3D sur un graphique interactif dans l'article d'origine:


Remarque
Norme de bivecteur  | mathbfB |= | mathbfa wedge mathbfb | est déterminée de manière similaire à la norme du vecteur (la racine carrée de la somme des carrés des composants). Ceci est égal à l'aire du parallélogramme formé  mathbfa et  mathbfb , c'est-à-dire  | mathbfa wedge mathbfb |= midsin( alpha) mid | mathbfa | | mathbfb | alpha - angle entre  mathbfa et  mathbfb .

Si nous divisons le bivecteur par sa norme, alors nous réduisons les deux longueurs des vecteurs et la valeur (absolue) du sinus de l'angle, c'est-à-dire que nous aurons le bivecteur  hat mathbfB , qui sera construit comme si les deux vecteurs étaient initialement perpendiculaires et avaient une longueur unitaire. Il s'agit d'une représentation très nette d'un plan contenant les deux vecteurs. Donc:

 mathbfB=| mathbfa | ||mathbfb | midsin( alpha) mid hat mathbfB


Est-ce que quelque chose vous rappelle un travail extérieur? En 3D, la définition d'une œuvre externe est très similaire à la définition d'une œuvre vectorielle. En fait, un vecteur en 3D obtenu à partir d'un produit vectoriel (par exemple, un vecteur normal) aura trois composantes égales aux composantes du bivecteur (les nombres seront les mêmes, mais la base est différente).

$$ afficher $$ \ begin {eqnarray} \ mathbf {a} \ wedge \ mathbf {b} & = & & (a_x b_y - b_x a_y) (\ mathbf {x} \ wedge \ mathbf {y}) \\ & & + & (a_x b_z - b_x a_z) (\ mathbf {x} \ wedge \ mathbf {z}) \\ & & + & (a_y b_z - b_y a_z) (\ mathbf {y} \ wedge \ mathbf {z} ) \\ \\ \ mathbf {a} \ times \ mathbf {b} & = & & (a_x b_y - b_x a_y) \ \ mathbf {z} \\ & & - & (a_x b_z - b_x a_z) \ \ mathbf {y} \\ & & + & (a_y b_z - b_y a_z) \ \ mathbf {x} \ end {eqnarray} $$ display $$


La définition d'un bivecteur a une signification géométrique et n'apparaît pas de nulle part. Je me souviens que lorsque j'étudiais les produits vectoriels, je me disais: «Mais qu'est-ce que ça renvoie un vecteur dont la longueur est égale à l'aire du parallélogramme formé par ces deux vecteurs? Cela semble tellement aléatoire. Et pourquoi pouvons-nous transformer la zone du parallélogramme en longueur du vecteur? »

2.6. Sémantique des vecteurs et bivecteurs


En 3D, le bivecteur a trois coordonnées, une par plan: (  mathbfxy ,  mathbfxz et  mathbfyz ) Les vecteurs ont également trois coordonnées, une par axe (  mathbfx ,  mathbfy et  mathbfz ) Chaque plan est perpendiculaire à un axe. Cette coïncidence n'apparaît qu'en trois dimensions (*) et c'est pourquoi nous confondons constamment bivecteurs et vecteurs .

(*)
En 2D, il n'y a qu'un seul bivecteur de base (  mathbfxy ), et en 3D, il existe 3 bivecteurs de base (  mathbfxy ,  mathbfxz ,  mathbfyz ), dans 4D il y a 6 bivecteurs de base (  mathbfxy ,  mathbfxz ,  mathbfxw ,  mathbfyz ,  mathbfyw ,  mathbfzw ) et ainsi de suite ...

En programmation, ils ont tous deux la même disposition de mémoire, mais des opérations différentes. L'utilisation d'un vecteur 3D au lieu d'un bivecteur 3D est similaire à une «conversion de type» d'un bivecteur.

Voici un exemple: vous pouvez voir que les vecteurs normaux sont transformés différemment des vecteurs ordinaires en utilisant la matrice de «transfert inverse» ( mathbfMT)1 , au lieu de la matrice elle-même. En effet, ce ne sont en fait pas des vecteurs, mais des bivecteurs, qui sont transformés en vecteurs par "conversion de type". En physique, il existe un hack appelé «vecteur axial», qui a été introduit afin de distinguer les vecteurs obtenus par le produit vectoriel des vecteurs ordinaires. Un bivecteur est un véritable «type» d'objet et doit être perçu et traité en conséquence.

Trivectors

Nous pouvons continuer à prendre un produit externe pour obtenir non seulement des zones 2D orientées, mais aussi des volumes 3D orientés. Trivector T peut être obtenu en faisant le produit externe deux fois:

 mathbfT= mathbfa wedge mathbfb wedge mathbfc


Dans l'espace tridimensionnel, tout s'arrête là. Comme en 2D, où il n'y a qu'un seul plan remplissant tout l'espace 2D, en 3D, il n'y a qu'un seul volume remplissant tout l'espace 3D.

[Mais dans nD, nous pouvons continuer à créer des vecteurs de produits externes encore plus grands jusqu'à atteindre la nième dimension. Par exemple, dans 4D, nous avons quatre trivcteurs de base (3 vecteurs) (  mathbfxyz ,  mathbfxyw ,  mathbfxwz ,  mathbfyzw ) et un quadruple vecteur de base  mathbfxyzw ]

En 3D, le trivector n'a qu'un seul composant de base ( Txyz ) égal au volume du parallélépipède formé par trois vecteurs. Le triple produit externe est une version améliorée du triple produit scalaire ( ( mathbfa times mathbfb) cdot mathbfc ), car il n'implique qu'un seul type d'opération, il renvoie le type correct (volume au lieu d'un scalaire) et fonctionne dans n'importe quel nombre de dimensions.

 mathbfT=Txyz mathbfx wedge mathbfy wedge mathbfz


3. Le produit géométrique


3.1. Multiplication des vecteurs les uns sur les autres


Produit géométrique  mathbfab (notée sans symbole) est une autre opération qui peut être effectuée avec des vecteurs. Le produit géométrique est défini de sorte que les vecteurs soient des quantités inverses (par ex.  mathbfa mathbfa1=1 , où 1 est juste le nombre 1!) et ont des propriétés pratiques, par exemple, l'associativité (  mathbfa( mathbfb mathbfc)=( mathbfa mathbfb) mathbfc ) Le but de ceci est de pouvoir multiplier les vecteurs pour que (comme c'est le cas avec les matrices) la multiplication corresponde aux opérations géométriques.

Remarque
Avoir des valeurs inverses est utile car quel que soit l'objet  mathbfa mathbfa1 , cela n'affectera pas les vecteurs, c'est-à-dire qu'il se comportera de la même manière que lors de la multiplication du nombre par 1.

Pour définir un produit, on note d'abord qu'il est possible de diviser un produit (ou n'importe quelle fonction qui prend deux arguments) en la somme de la partie qui ne change pas si on échange les arguments et la partie qui change comme suit:

\ begin {eqnarray} \ mathbf {a} \ mathbf {b} & = & \ frac {1} {2} (\ mathbf {a} \ mathbf {b} + \ mathbf {a} \ mathbf {b} + \ mathbf {b} \ mathbf {a} - \ mathbf {b} \ mathbf {a}) \\ & = & \ frac {1} {2} (\ mathbf {a} \ mathbf {b} + \ mathbf { b} \ mathbf {a}) + \ frac {1} {2} (\ mathbf {a} \ mathbf {b} - \ mathbf {b} \ mathbf {a}) \ end {eqnarray}


Le premier terme ne dépend plus de l'ordre des arguments  mathbfa et  mathbfb (on l'appelle la partie "symétrique"), et le second terme change de signe lors du changement de place des arguments (on l'appelle la partie "antisymétrique").

Le produit scalaire de deux vecteurs (également appelé produit interne) est symétrique et est une mesure de distance (  mathbfa cdot mathbfa= | mathbfa |2 ), donc, d'un point de vue géométrique, il semble utile de le rendre égal à la partie symétrique:

 frac12( mathbfa mathbfb+ mathbfb mathbfa)= mathbfa cdot mathbfb


De même, le produit extérieur de deux vecteurs est antisymétrique, il serait donc utile de l'assimiler à la partie antisymétrique:

 frac12( mathbfa mathbfb mathbfb mathbfa)= mathbfa wedge mathbfb


De plus, le produit scalaire contient le cosinus de l' angle entre deux vecteurs (  mathbfa cdot mathbfb= | mathbfa | | mathbfb |cos( alpha) ), tandis que le produit externe contient le sinus de l' angle. Ensemble, ils décrivent pleinement l'angle entre les vecteurs, ainsi que le plan qu'ils forment.

Remarque
C'est l'intégralité de la description qui rend le travail réversible, car on peut passer d'un vecteur à l'autre à l'aide des informations contenues dans leur travail. Si je te donne  mathbfa et  mathbfa mathbfb alors vous pouvez obtenir  mathbfb . C'est impossible à faire, ne connaissant que le cosinus ou seulement le sinus / plan.

Autrement dit, le produit géométrique est égal à:

 mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa wedge mathbfb


C'est étrange car multiplier deux vecteurs donne la somme de deux choses différentes: un scalaire et un bivecteur. Cependant, cela est similaire à la façon dont un nombre complexe est la somme d'un nombre scalaire et d'un nombre "imaginaire", vous pouvez donc déjà vous y habituer. Ici, la partie bivector correspond à la partie "imaginaire" du nombre complexe. Seulement ce n'est pas une valeur "imaginaire", c'est juste un bivecteur que l'on peut vraiment montrer graphiquement!

En fait, en multipliant deux vecteurs, nous calculons leurs propriétés utiles («la longueur de leurs projections l'une sur l'autre» / «cosinus de l'angle» (  mathbfa cdot mathbfb ) et «le plan qu'ils forment ensemble» / «le sinus de l'angle» (  mathbfa wedge mathbfb )), que nous connectons ensemble avec un signe plus. Un produit géométrique donne également des opérations de «groupes de propriétés» qui peuvent leur être appliquées, et ces opérations ont des interprétations géométriques (par exemple: rotation et réflexion de vecteurs). Nous le verrons bientôt.

Vous pouvez exprimer le produit géométrique en termes de sinus et cosinus:  mathbfa mathbfb= | mathbfa | | mathbfb |(cos( alpha)+sin( alpha) mathbfB) mathbfB Est un bivecteur des deux vecteurs sur le plan, composé de deux vecteurs perpendiculaires unitaires.

3.2. Table de multiplication


Le tableau de multiplication nous permet de rendre le produit plus spécifique: voyons ce qui se passe si on obtient les produits des vecteurs de base (  mathbfx ,  mathbfy ,  mathbfz )

Pour tout vecteur de base, par exemple un axe  mathbfx , le résultat sera égal 1 :

 mathbfx mathbfx= mathbfx cdot mathbfx+ mathbfx wedge mathbfx=1


Pour toute paire de vecteurs de base, par exemple, les axes  mathbfx et  mathbfy , le résultat sera un bivecteur qui, ensemble, ils forment:

 mathbfx mathbfy= mathbfx cdot mathbfy+ mathbfx wedge mathbfy= mathbfx wedge mathbfy


(c'est-à-dire que nous pouvons nommer  mathbfx wedge mathbfy juste  mathbfx mathbfy , car c'est la même chose!)

Cela nous donne le tableau suivant:
 mathbfa mathbfb mathbfb
 mathbfx mathbfy mathbfz
 mathbfa mathbfx1 mathbfx mathbfy mathbfx mathbfz
 mathbfy mathbfx mathbfy1 mathbfy mathbfz
 mathbfz mathbfx mathbfz mathbfy mathbfz1

En fait, ce tableau est trivial, comparé, par exemple, au tableau des quaternions.

Remarque
Par exemple, voici la multiplication de deux vecteurs (5,3,0) et (2,0,1) :

\ begin {eqnarray} (5 \ mathbf {x} + 3 \ mathbf {y}) (2 \ mathbf {x} + 1 \ mathbf {z}) & = & 5 \ 2 \ \ mathbf {x} \ mathbf {x} + 5 \ 1 \ \ mathbf {x} \ mathbf {z} + 3 \ 2 \ \ mathbf {y} \ mathbf {x} + 3 \ 1 \ \ mathbf {y} \ mathbf {z} \\ & = & 10 + 5 \ \ mathbf {x} \ mathbf {z} - 6 \ \ mathbf {x} \ mathbf {y} + 3 \ \ mathbf {y} \ mathbf {z} \ end {eqnarray}


3.3. Formule de réflexion (aspect traditionnel)



Réflexion sur un vecteur [dans l'article d'origine, chaque vecteur peut être déplacé]

Si nous avons un vecteur unitaire  mathbfa et vecteur  mathbfv nous pouvons réfléchir  mathbfv à travers un plan perpendiculaire  mathbfa .

Cela se fait de la manière habituelle: nous partageons  mathbfv sur la partie perpendiculaire au plan:  mathbfv perp=( mathbfv cdot mathbfa) mathbfa , et la partie parallèle au plan:  mathbfv parallel= mathbfv mathbfv perp= mathbfv( mathbfv cdot mathbfa) mathbfa .

Ensuite, afin de refléter le vecteur, nous inversons la partie perpendiculaire et laissons la partie parallèle inchangée:

\ begin {eqnarray} R _ {\ mathbf {a}} (\ mathbf {v}) & = & \ mathbf {v} _ \ parallel - \ mathbf {v} _ \ perp \\ & = & (\ mathbf { v} - (\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a}) - ((\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a}) \\ & = & \ mathbf {v} - 2 (\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a} \ end {eqnarray}


3.4. Formule de réflexion (vue pour produit géométrique)


A ce stade, nous pouvons remplacer le produit scalaire  mathbfv cdot mathbfa sur sa version sous forme de produit géométrique  frac12( mathbfv mathbfa+ mathbfa mathbfv) et obtenez les éléments suivants:

\ begin {eqnarray} R _ {\ mathbf {a}} (\ mathbf {v}) & = & \ mathbf {v} - 2 (\ frac {1} {2} (\ mathbf {v} \ mathbf {a } + \ mathbf {a} \ mathbf {v})) \ mathbf {a} \\ & = & \ mathbf {v} - \ mathbf {v} \ mathbf {a} ^ 2 - \ mathbf {a} \ mathbf {v} \ mathbf {a} \\ & = & - \ mathbf {a} \ mathbf {v} \ mathbf {a} \ end {eqnarray}


(  mathbfa2= mathbfa cdot mathbfa=1 depuis  mathbfa est un vecteur unitaire)

Cela nous donne exactement la même chose, mais dans une entrée différente. Utiliser un enregistrement sous la forme d'un produit simple au lieu d'une formule pour encoder une opération aussi fondamentale que la réflexion sera très utile!

Comment fonctionnent plusieurs produits géométriques?
Si vous ne comprenez pas comment fonctionne la prise multiple d'un produit géométrique, regardez simplement les vecteurs de base. Il n'y a que trois cas possibles:

\ begin {eqnarray} \ mathbf {x} (\ mathbf {x} \ mathbf {x}) & = & \ mathbf {x} 1 = \ mathbf {x} \\ \ mathbf {x} (\ mathbf {x} } \ mathbf {y}) & = & \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y} + \ mathbf {x} \ wedge \ mathbf {y}) = \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y}) + \ mathbf {x} \ mathbf {x} \ mathbf {y} = \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y}) + \ mathbf {y} \\ \ mathbf {x} (\ mathbf {y} \ mathbf {z}) & = & \ mathbf {x} (\ mathbf {y} \ cdot \ mathbf {z}) + \ mathbf {x} } \ mathbf {y} \ mathbf {z} \ end {eqnarray}


Les résultats seront: vector, vector, vector + trivector. Cependant, ce dernier cas ne peut se produire que lorsque les trois vecteurs sont indépendants, ce qui n'est jamais vrai pour  mathbfava

Détails
Les personnes curieuses peuvent voir ce qui se passe à chaque étape.  mathbfa mathbfv mathbfa en termes de produit géométrique.

  1. Première étape:

     mathbfv mathbfa= mathbfv cdot mathbfa+ mathbfv wedge mathbfa


    Si, comme avant, nous divisons  mathbfv à la partie perpendiculaire au plan (  mathbfv perp ), et la partie qui lui est parallèle (  mathbfv parallel ), on obtient alors:

    \ begin {eqnarray} (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ parallel) \ mathbf {a} & = & (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ parallèle) \ cdot \ mathbf {a} + (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ parallel) \ wedge \ mathbf {a} \\ & = & \ mathbf {v} _ \ perp \ cdot \ mathbf {a} + \ mathbf {v} _ \ parallel \ cdot \ mathbf {a} + \ mathbf {v} _ \ perp \ wedge \ mathbf {a} + \ mathbf {v} _ \ parallel \ wedge \ mathbf {a} \ end {eqnarray}


     mathbfv parallel cdot mathbfa=0 , car ces vecteurs sont perpendiculaires, et  mathbfv perp wedge mathbfa=0 parce que ces vecteurs sont parallèles.

     mathbfv mathbfa= mathbfv perp cdot mathbfa+ mathbfv parallel wedge mathbfa


    Le premier terme est juste la longueur de la projection  mathbfv sur  mathbfa , c'est-à-dire le premier terme est juste la longueur  mathbfv perp .

    Appelons  hat mathbfv parallel version normalisée  mathbfv parallel c'est  mathbfv parallel= hat mathbfv parallel | mathbfv parallel | . Ensuite, le deuxième terme est juste un bivector  mathbfB= hat mathbfv parallel wedge mathbfa fois la longueur  mathbfv parallel .

    Ce bivecteur  mathbfB composé de deux vecteurs unitaires perpendiculaires, c'est-à-dire qu'il s'agit d'une représentation très nette du plan des vecteurs  mathbfa et  mathbfv . Il ne contient pas d'informations sur leur angle relatif ou leurs longueurs, uniquement sur l'orientation du plan.

    Autrement dit, les deux termes ne sont que des décompositions  mathbfv sur deux projections orthogonales (  mathbfv parallel et  mathbfv perp ), ainsi que le plan qu'ils forment (  mathbfB ):

     | mathbfv perp |+ | mathbfv parallel | mathbfB


    Avant de passer à l'étape suivante, nous pouvons remplacer le produit externe par un produit géométrique, car  mathbfa et  mathbfv parallel sont perpendiculaires, et donc leur produit externe et géométrique seront équivalents (puisque la partie avec le produit scalaire de leur produit géométrique est égale à zéro).

     mathbfv perp cdot mathbfa+ mathbfv parallel wedge mathbfa= mathbfv perp cdot mathbfa+ mathbfv parallel mathbfa

  2. La deuxième étape sera la suivante:

     mathbfa mathbfv mathbfa= mathbfa( mathbfv perp cdot mathbfa)+ mathbfa mathbfv parallel mathbfa


    Le premier membre n'est qu'un composant  mathbfv le long  mathbfa , c'est-à-dire composant  mathbfv perpendiculaire au plan. En d'autres termes, le premier terme est juste  mathbfv perp .

     mathbfa mathbfv mathbfa= mathbfv perp+ mathbfa mathbfv parallel mathbfa


    Depuis  mathbfa et  mathbfv parallel (encore) perpendiculaire, leur produit géométrique est simplement leur produit externe, c'est-à-dire que vous pouvez les échanger et changer le signe.

    \ begin {eqnarray} \ mathbf {a} \ mathbf {v} \ mathbf {a} & = & \ mathbf {v} _ \ perp - \ mathbf {v} _ \ parallel \ mathbf {a} \ mathbf {a } \\ & = & \ mathbf {v} _ \ perp - \ mathbf {v} _ \ parallel \ end {eqnarray}

  3. Et enfin, la dernière étape retourne le signe:

     mathbfa mathbfv mathbfa= mathbfv perp+ mathbfv parallel


    Autrement dit, nous voyons que le composant  mathbfv perpendiculaire à l'avion, renversé, mais la partie parallèle reste la même!

Remarque
La longueur  mathbfa pas très important, donc ci-dessous, nous l'ignorons, mais si  mathbfa n'est pas un vecteur unitaire, alors nous devons diviser par sa longueur et la formule se transforme en  mathbfa mathbfv mathbfa1 , qui ressemble plus à un "produit en couches", auquel vous auriez dû vous habituer.

3.5. Deux réflexions se tournent: la situation en 2D


Il s'avère que si nous appliquons à  mathbfv deux réflexions consécutives (d'abord avec un vecteur  mathbfa puis avec le vecteur  mathbfb ), on obtient alors une rotation à deux fois l'angle entre les vecteurs  mathbfa et  mathbfb .

Nous pouvons montrer chaque étape ultérieure de réflexion dans le graphique ci-dessous:


Vous pouvez également modifier les vecteurs dans l'article d'origine.  mathbfa ,  mathbfb et  mathbfv , mais la configuration initiale des vecteurs sur le graphique (cliquez sur le bouton «Réinitialiser les positions des vecteurs») montre particulièrement clairement pourquoi la rotation en conséquence se produit sous un double angle. Une autre bonne configuration est de définir  mathbfa et  mathbfb axes  mathbfx et  mathbfy .

3.6. Deux réflexions c'est un tour: la situation en 3D


Dans le cas du vecteur 3D  mathbfv peut être divisé en deux parties, dont l'une se trouve dans le plan donné  mathbfa et  mathbfb , et l'autre se situe en dehors du plan (perpendiculaire à celui-ci). Comme le montre le graphique ci-dessous, lorsque le vecteur est réfléchi par chacun des plans, sa partie extérieure reste la même. Quant à l'intérieur, on est de retour en 2D, et ça tourne juste deux fois l'angle!


3.7. Rotors


Du point de vue du produit géométrique, deux réflexions correspondent simplement à ce qui suit:

R mathbfb(R mathbfa( mathbfv))= mathbfb( mathbfa mathbfv mathbfa) mathbfb= mathbfb mathbfa mathbfv mathbfa mathbfb


Nous appelons  mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa wedge mathbfb rotor parce que la multiplication par  mathbfa mathbfb des deux côtés du vecteur, nous effectuons une rotation (  mathbfb mathbfa Est le même que  mathbfa mathbfb , uniquement dans le bivecteur partiel inversé).

Application du rotor  mathbfa mathbfb des deux côtés du vecteur tourne ce vecteur dans le plan des vecteurs  mathbfa et  mathbfb deux fois l'angle entre  mathbfa et  mathbfb .

Et c'est tout!

Comparaison des rotors et quaternions 3D


Vous pouvez voir que les rotors 3D ressemblent beaucoup à des quaternions:

a+Bxy  mathbfx wedge mathbfy+Bxz  mathbfx wedge mathbfz+Byz  mathbfy coin mathbfz


a+b  mathbfi+c  mathbfj+d  mathbfk


En fait, le code / math est à peu près le même! La principale différence est que  mathbfi ,  mathbfj et  mathbfk remplacé par  mathbfy wedge mathbfz ,  mathbfx wedge mathbfz et  mathbfx wedge mathbfy mais ils fonctionnent essentiellement de la même manière. La comparaison de code peut être trouvée ici . Je n'ai pas tout implémenté, par exemple log / exp pour l'interpolation, mais ils sont assez simples à créer.


Cependant, comme nous l'avons vu, les rotors 3D sont un concept en trois dimensions qui ne nécessite pas l'utilisation de «doubles tours en quatre dimensions» ou de «projection stéréographique» pour la visualisation. Essayer de visualiser des quaternions fonctionnant en 4D pour expliquer les rotations 3D, c'est un peu comme essayer de comprendre le mouvement planétaire d'un point de vue géocentrique. C'est-à-dire cette approche est trop compliquée parce que nous la considérons du mauvais point de vue.

Comme nous l'avons vu, la modélisation des rotations comme se produisant à l'intérieur des plans, plutôt qu'autour des vecteurs, nous aide beaucoup. Par exemple, les carrés des bivecteurs de base donnent 1 , tout comme les quaternions de base (  mathbfi2= mathbfj2= mathbfk2=1 ):

( mathbfx mathbfy)2=( mathbfx mathbfy)( mathbfx mathbfy)=( mathbfy mathbfx)( mathbfx mathbfy)= mathbfy( mathbfx mathbfx) mathbfy= mathbfy mathbfy=1


La multiplication de deux bivecteurs l'un par l'autre donne un troisième bivecteur, mais en fait c'est trivial, et nous n'avons pas besoin de nous rappeler que  mathbfi mathbfj= mathbfk :

( mathbfx mathbfy)( mathbfy mathbfz)= mathbfx( mathbfy mathbfy) mathbfz= mathbfx mathbfz



(Notez que nous avons utilisé  mathbfx wedge mathbfy= mathbfx mathbfy )

Ces propriétés sont le résultat d'un produit géométrique et ne naissent pas de nulle part!

Lecture complémentaire


(Au fait, en algèbre géométrique, il n'y a pas seulement des rotors, mais aussi d'autres choses sympas!)

  • Algèbre linéaire et géométrique par Macdonald [ lien vers Amazon ]

    Une excellente source, très claire et compréhensible, car il était sous-entendu qu'elle remplacerait le manuel d'algèbre linéaire pour les étudiants.
  • Algèbre géométrique pour l'informatique par Dorst et al. [ lien vers Amazon ]

    Une excellente source, car la programmation permet parfois de mieux comprendre le sujet.
    Remarque: dans ce livre, les auteurs indiquent clairement que l'algèbre géométrique est plus lente que les quaternions (et similaires ...). En fait, il devrait avoir approximativement le même code (c'est-à-dire que vous ne devriez pas écrire de code pour l'algèbre géométrique, créant une structure généralisée qui peut contenir tous les types possibles de k-vecteurs, écrivez simplement, si nécessaire, une structure pour chaque type de k-vecteurs Autrement dit, pour remplacer les quaternions, vous pouvez écrire une structure Bivector et une structure Rotor, qui est Scalar + Bivector).

Source: https://habr.com/ru/post/fr429640/


All Articles