{"id":187,"date":"2018-05-31T19:00:52","date_gmt":"2018-05-31T17:00:52","guid":{"rendered":"http:\/\/mouca.fr\/wordpress\/?p=187"},"modified":"2018-11-29T21:42:52","modified_gmt":"2018-11-29T20:42:52","slug":"matrice-quaternion-et-graphe-de-scene-partie-2","status":"publish","type":"post","link":"http:\/\/mouca.fr\/wordpress\/2018\/05\/31\/matrice-quaternion-et-graphe-de-scene-partie-2\/","title":{"rendered":"Matrice, Quaternion et graphe de sc\u00e8ne &#8211; Partie 2"},"content":{"rendered":"<p>Nous allons parler dans cette article de quaternion et des op\u00e9rations qu&#8217;on peut faire avec mais surtout de comment remplacer nos matrices de transformation par une structure utilisant les quaternions.<\/p>\n<p><!--more--><br \/>\nCet article s&#8217;inscrit dans une suite :<\/p>\n<ul>\n<li><a href=\"http:\/\/mouca.fr\/wordpress\/2018\/03\/22\/matrice-quaternion-et-graphe-de-scene\/\">Matrice, Quaternion et graphe de sc\u00e8ne &#8211; Partie 1<\/a><\/li>\n<li><a href=\"http:\/\/mouca.fr\/wordpress\/2018\/05\/31\/matrice-quaternion-et-graphe-de-scene-partie-2\/\">Matrice, Quaternion et graphe de sc\u00e8ne &#8211; Partie 2<\/a><\/li>\n<li><a href=\"http:\/\/mouca.fr\/wordpress\/2018\/11\/27\/matrice-quaternion-et-graphe-de-scene-partie-3\/\">Matrice, Quaternion et graphe de sc\u00e8ne &#8211; Partie 3<\/a><\/li>\n<\/ul>\n<div class=\"alert alert-error\">Je vous conseille de lire au moins le d\u00e9but de la Partie 1 pour comprendre les conventions d&#8217;\u00e9criture au niveau du code et des math\u00e9matiques.<\/div>\n<p>Tous les exemples sont sur mon GitHub <a href=\"https:\/\/github.com\/Rominitch\/myBlogSource\/\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/Rominitch\/myBlogSource\/<\/a> dans Matrix_Quaternion.<\/p>\n<h1>Les quaternions<\/h1>\n<h2>Pr\u00e9-ambule<\/h2>\n<p>Avant de commencer, je vais poser quelques nouvelles notations pour clarifier les futures formules math\u00e9matiques.<\/p>\n<ul>\n<li><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-08a831538e71c1847adcefcc841d1014_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"9\" width=\"10\" style=\"vertical-align: 0px;\"\/> est la multiplication d&#8217;un quaternion avec un point\/vecteur.<\/li>\n<li><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-e4a9530446bf2f4d0aba2e97adb70374_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"9\" width=\"10\" style=\"vertical-align: 0px;\"\/> est la multiplication d&#8217;un point\/vecteur par un ou des scalaires (composante par composante).<\/li>\n<\/ul>\n<h2>D\u00e9finition<\/h2>\n<p>Les quaternions permettent d&#8217;exprimer une rotation 3D en utilisant uniquement quatre composantes (en passant par un espace 4D).<br \/>\nLa repr\u00e9sentation la plus facile \u00e0 comprendre est la suivante:<\/p>\n<div class=\"well well-small\"><div class='content-column one_half'>Soit <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-24f48c93d57770c0d456d8efb5b0f92a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#92;&#116;&#104;&#101;&#116;&#97;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"9\" style=\"vertical-align: 0px;\"\/> l&#8217;angle de rotation et un vecteur normalis\u00e9 <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-448ab8f8573fd8214621fafb48eca35b_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#92;&#118;&#101;&#99;&#123;&#117;&#125;&#32;&#61;&#32;&#40;&#97;&#44;&#98;&#44;&#99;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"87\" style=\"vertical-align: -4px;\"\/> repr\u00e9sentant l&#8217;axe de rotation alors on d\u00e9finit le quaternion q tel que:<\/p>\n<p class=\"ql-center-displayed-equation\" style=\"line-height: 51px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-ec578755c9ecb5c23e191c0d43be3407_l3.png\" height=\"51\" width=\"305\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\" &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#113;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#120;&#44;&#121;&#44;&#122;&#44;&#119;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#40;&#97;&#44;&#32;&#98;&#44;&#32;&#99;&#41;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#115;&#105;&#110;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#92;&#116;&#104;&#101;&#116;&#97;&#125;&#123;&#50;&#125;&#41;&#44;&#32;&#99;&#111;&#115;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#92;&#116;&#104;&#101;&#116;&#97;&#125;&#123;&#50;&#125;&#41;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#92;&#118;&#101;&#99;&#123;&#117;&#125;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#115;&#105;&#110;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#92;&#116;&#104;&#101;&#116;&#97;&#125;&#123;&#50;&#125;&#41;&#44;&#32;&#99;&#111;&#115;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#92;&#116;&#104;&#101;&#116;&#97;&#125;&#123;&#50;&#125;&#41;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/div><br \/>\n<div class='content-column one_half last_column'><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-238\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/04\/mouca_quaternion1.png\" alt=\"\" width=\"413\" height=\"396\" \/><br \/><\/div><div class='clear_column'><\/div><\/div>\n<div class=\"alert alert-warning\"><i class=\"icon-warning-sign\"><\/i> Le vecteur <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-02912bed267e2b04848c5f6410a9254a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#118;&#101;&#99;&#123;&#117;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"13\" width=\"12\" style=\"vertical-align: 0px;\"\/> est facile \u00e0 retrouver \u00e0 partir d&#8217;un quaternion mais n&#8217;oubliez pas que ce n&#8217;est pas directement x,y,z.<\/div>\n<p>Voici une d\u00e9mo en ligne pour comprendre rapidement comment s\u2019op\u00e8re la rotation: <a href=\"http:\/\/quaternions.online\">Quaternions Online<\/a><\/p>\n<p>Les op\u00e9rations les plus importantes pour nous sont:<\/p>\n<ul>\n<li>la multiplication (avec des quaternions et des vecteurs)<\/li>\n<li>l&#8217;inversion<\/li>\n<li>l&#8217;interpolation slerp (dans un deuxi\u00e8me temps)<\/li>\n<\/ul>\n<p>Comme pr\u00e9c\u00e9demment, je consid\u00e8re que vous savez les faire (sinon glm le fera pour vous).<\/p>\n<p>A ce stade, les quaternions sont juste un autre moyen d&#8217;exprimer une rotation (comme les angles d&#8217;Euler et les matrices 3&#215;3).<\/p>\n<p>Une premi\u00e8re question nous vient: Pourquoi donc les utiliser ?<\/p>\n<p>La r\u00e9ponse est la suivante:<\/p>\n<ul>\n<li>Peu de composantes et op\u00e9ration simple donc tr\u00e8s rapide \u00e0 calculer sur nos ordinateurs.<\/li>\n<li>Interpolation facile (tr\u00e8s utile pour les animations).<\/li>\n<\/ul>\n<h2>Matrice et Quaternion<\/h2>\n<p>De notre point de vue, les quaternions permettent de remplacer la matrice de rotation uniquement.<\/p>\n<p>Donc l\u00e0 o\u00f9 une matrice homog\u00e8ne contenait toutes les infos, il faudra inventer un outils permettant de combiner notre quaternion, le facteur d&#8217;agrandissement et la position de notre rep\u00e8re en plus : la structure Transformation.<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"code_quaternion\">struct Transformation\r\n{\r\n    glm::vec3 _homothetie;\r\n    glm::quat _rotation;\r\n    glm::vec3 _position;\r\n}<\/pre>\n<p>Dans la litt\u00e9rature am\u00e9ricaine (et les codes sources), on parle de classe\/structure &#8220;Transform&#8221;.<\/p>\n<h3>Op\u00e9rations sur notre structure<\/h3>\n<p>La premi\u00e8re chose est de calculer la multiplication de notre structure avec un point afin d&#8217;appliquer toutes les transformations.<\/p>\n<p>On va partir de cet exemple: <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-1c9cc5ba98ed7c809de3d2c966c6ffe3_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#65;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#41;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"22\" width=\"72\" style=\"vertical-align: -6px;\"\/> un point de l&#8217;objet, on souhaite appliquer une rotation de <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-b40d4729101107a208fc1dfcffeb5002_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#50;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"9\" style=\"vertical-align: -6px;\"\/>, une homoth\u00e9tie de <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-a05fa7831437fdccdd59493a05ba3e34_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"22\" width=\"7\" style=\"vertical-align: -6px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-e7ab573799d989cb3423a58d6ca78e12_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#77;&#125;&#92;&#118;&#101;&#99;&#123;&#79;&#77;&#125;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#49;&#125;&#123;&#54;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#32;&#48;&#41;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"23\" width=\"99\" style=\"vertical-align: -6px;\"\/> exprim\u00e9 dans O.<br \/>\nCe qui va nous donner le point <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-ac692ec73620c9e5f62a6f71bb43a4c2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#79;&#125;&#67;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#54;&#125;&#44;&#32;&#48;&#41;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"22\" width=\"73\" style=\"vertical-align: -6px;\"\/><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-96\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/03\/composition_simple.png\" alt=\"\" width=\"416\" height=\"269\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/03\/composition_simple.png 416w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/03\/composition_simple-300x194.png 300w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/p>\n<h4>Multiplication<\/h4>\n<div class=\"alert alert-warning\"><i class=\"icon-warning-sign\"><\/i> Il existe des moyens de conversion entre Quaternion et Matrice (dans les deux sens).<br \/>\nOn trouve sur les forums des gens qui convertissent leur structure en matrice homog\u00e8ne qui composent les matrices et recr\u00e9er leur structure.<br \/>\nIci, ils n&#8217;utilisent pas les op\u00e9rateurs des quaternions ! Ne tomber pas dans le pi\u00e8ge.<\/div>\n<p>Notre premier but est de cr\u00e9er un op\u00e9rateur de multiplication qui comme pour les matrices va nous transformer les coordonn\u00e9es de notre point du rep\u00e8re local vers le rep\u00e8re monde.<br \/>\nComme pour les compositions des matrices, on va multiplier notre point dans l&#8217;ordre: <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-3784789ec84fb9c4ace4e07d1a8d1cce_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;&#111;&#105;&#110;&#116;&#77;&#111;&#110;&#100;&#101;&#32;&#61;&#32;&#80;&#111;&#115;&#105;&#116;&#105;&#111;&#110;&#32;&#43;&#32;&#81;&#117;&#97;&#116;&#101;&#114;&#110;&#105;&#111;&#110;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#40;&#80;&#111;&#105;&#110;&#116;&#76;&#111;&#99;&#97;&#108;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#72;&#111;&#109;&#111;&#116;&#104;&#101;&#115;&#105;&#101;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"533\" style=\"vertical-align: -4px;\"\/><\/p>\n<div class=\"well well-small\"><div class='content-column one_half'><p class=\"ql-center-displayed-equation\" style=\"line-height: 142px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-da29241d5b167560961ccb0dca26a7b8_l3.png\" height=\"142\" width=\"222\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#79;&#125;&#67;&#125;&#32;&#38;&#32;&#61;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#77;&#125;&#92;&#118;&#101;&#99;&#123;&#79;&#77;&#125;&#125;&#32;&#43;&#32;&#113;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#40;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#65;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#41;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#77;&#125;&#92;&#118;&#101;&#99;&#123;&#79;&#77;&#125;&#125;&#32;&#43;&#32;&#113;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#54;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#77;&#125;&#92;&#118;&#101;&#99;&#123;&#79;&#77;&#125;&#125;&#32;&#43;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#54;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#49;&#125;&#123;&#54;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#43;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#54;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#54;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; \" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/div><br \/>\n<div class='content-column one_half last_column'><pre class=\"lang:c++ decode:true\" title=\"code_quaternion_mul\">glm::vec3 Transformation::multiplierVersMonde(const glm::vec3&amp; point) const\r\n{\r\n   return _position + _rotation * (point * _homothetie);\r\n}\r\n\r\nglm::vec3 Transformation::operator * (const glm::vec3&amp; localPoint) const\r\n{\r\n   return multiplierVersMonde(localPoint);\r\n}\r\n\r\nglm::vec4 a( 4.0f\/6.0f, 2.0f\/6.0f, 0.0f, 1.0f );\r\nglm::vec4 c( 10.0f\/6.0f, 5.0f\/6.0f, 0.0f, 1.0f );\r\n\r\nTransformation qc;\r\nqc._homothetie  = glm::vec3( 0.5f, 0.5f, 0.5f );\r\nqc._rotation    = glm::angleAxis( PI * 0.5f, glm::vec3( 0.0f, 0.0f, 1.0f ) );\r\nqc._position    = glm::vec3(11.0f\/6.0f, 0.5f, 0.0f );\r\n\r\nglm::vec3 cal_c = qc * a;\r\nEXPECT_VEC3_NEAR( c, cal_c, precision );\r\n<\/pre><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<div class=\"alert alert-warning\"><i class=\"icon-warning-sign\"><\/i> Petite pr\u00e9cision avec glm:<br \/>\nComme pour les matrices, la multiplication n&#8217;est pas commutative.<br \/>\nglm a d\u00e9fini pour nous les deux sens de la multiplication: ne nous trompons pas de sens !<br \/>\nVoici un petit exemple:<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"code_quaternion_mul_order\">const float angle = PI * 0.5f;\r\nglm::quat q = glm::angleAxis( angle, glm::vec3( 0.0f, 0.0f, 1.0f ) );\r\n\r\nglm::vec4 a(  1.0f, 1.0f, 0.0f, 1.0f );\r\nglm::vec4 c( -1.0f, 1.0f, 0.0f, 1.0f );\r\n\r\nglm::vec3 cal_c = q * a;\r\nEXPECT_VEC3_NEAR( c, cal_c, precision );\r\n\r\nglm::vec3 cal_a = c * q;\r\nEXPECT_VEC3_NEAR( a, cal_a, precision );\r\n<\/pre>\n<\/div>\n<h4>L&#8217;inversion<\/h4>\n<p>L&#8217;inversion de notre structure est possible car chaque \u00e9l\u00e9ment la constituant est inversible.<br \/>\nLa seule difficult\u00e9 ici est de trouver la nouvelle translation (qui n&#8217;est pas juste le vecteur oppos\u00e9). On prend notre vecteur <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-38790518d1bb6d0ccd5a43a6f3690cd8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"17\" width=\"33\" style=\"vertical-align: 0px;\"\/> qu&#8217;on doit lire dans le rep\u00e8re M: on va \u00e9crire \u00e7a <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-4b62ff1010930aa1cdabf0a981638d7e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#95;&#123;&#77;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"48\" style=\"vertical-align: -3px;\"\/>.<br \/>\nDonc on lui applique l&#8217;inverse de l\u2019homoth\u00e9tie et l&#8217;inverse de la rotation (dans cet ordre).<br \/>\nDans le cas particulier o\u00f9 l&#8217;on n&#8217;a ni rotation, ni homoth\u00e9tie, on a bien comme solution <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-083ba2ae2d8bcb09b98c24f68d6d38d6_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#95;&#123;&#77;&#125;&#32;&#61;&#32;&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#95;&#123;&#79;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"116\" style=\"vertical-align: -3px;\"\/>.<\/p>\n<p>On va avoir l&#8217;op\u00e9rateur suivant:<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"code_quaternion_inverse\">void Transformation::inverse()\r\n{\r\n    _homothetie = 1.0f \/ _homothetie;\r\n    _rotation   = glm::inverse( _rotation );\r\n    _position   = -(_rotation * (_homothetie * _position));\r\n}\r\n<\/pre>\n<p>On va donc calculer et tester l&#8217;inversion de notre structure en partant de C vers A.<\/p>\n<div class=\"well well-small\"><div class='content-column one_half'><p class=\"ql-center-displayed-equation\" style=\"line-height: 260px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-df85f1dc67e2639a7eb9added324fbae_l3.png\" height=\"260\" width=\"246\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#95;&#123;&#77;&#125;&#32;&#38;&#32;&#61;&#32;&#113;&#94;&#123;&#45;&#49;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#40;&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#95;&#123;&#79;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#50;&#44;&#32;&#50;&#44;&#32;&#50;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#41;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#113;&#94;&#123;&#45;&#49;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#49;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#45;&#49;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#65;&#125;&#32;&#38;&#32;&#61;&#32;&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#32;&#43;&#32;&#113;&#94;&#123;&#45;&#49;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#40;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#79;&#125;&#67;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#50;&#44;&#32;&#50;&#44;&#32;&#50;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#41;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#95;&#123;&#77;&#125;&#32;&#43;&#32;&#113;&#94;&#123;&#45;&#49;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#48;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#118;&#101;&#99;&#123;&#77;&#79;&#125;&#95;&#123;&#77;&#125;&#32;&#43;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#51;&#125;&#44;&#32;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#48;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#45;&#49;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#43;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#51;&#125;&#44;&#32;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#48;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;&#32;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/div><br \/>\n<div class='content-column one_half last_column'><pre class=\"lang:c++ decode:true\" title=\"quaternion_inverse\">const float angle = PI * 0.5f;\r\nglm::vec3 om( 11.0f\/6.0f, 0.5f, 0.0f );\r\nglm::vec3 homothetie( 0.5f, 0.5f, 0.5f );\r\n\r\nglm::vec4 a( 4.0f\/6.0f, 2.0f\/6.0f, 0.0f, 1.0f );\r\nglm::vec4 c( 10.0f\/6.0f, 5.0f\/6.0f, 0.0f, 1.0f );\r\n\r\nTransformation qc;\r\nqc._homothetie = homothetie;\r\nqc._rotation   = glm::angleAxis( angle, glm::vec3( 0.0f, 0.0f, 1.0f ) );\r\nqc._position   = om;\r\n\r\nTransformation qa(qc);\r\nqa.inverse();\r\n\r\nglm::vec3 cal_c = qc * a;\r\nEXPECT_VEC3_NEAR( c, cal_c, precision );\r\n\r\nglm::vec3 cal_a = qa * c;\r\nEXPECT_VEC3_NEAR( a, cal_a, precision );\r\n<\/pre><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<h4>Composition de notre structure<\/h4>\n<p>Maintenant nous allons compos\u00e9 notre structure. Pour commencer, on va prendre un cas simple : comme avec les matrices, on va composer une structure d&#8217;homoth\u00e9tie, une autre de rotation et finalement la derni\u00e8re de translation. Dans ce cas, on va g\u00e9n\u00e9rer des \u00e9l\u00e9ments neutres (soit en addition ou multiplication).<\/p>\n<p>Voici la solution finale<\/p>\n<div class=\"well well-small\"><div class='content-column one_half'><pre class=\"lang:c++ decode:true\" title=\"quaternion_composition\">\/\/ World = This * Local\r\nTransformation operator * ( const Transformation&amp; localSpace ) const\r\n{\r\n    Transformation worldSpace;\r\n    worldSpace._homothetie = _homothetie * localSpace._homothetie;\r\n    worldSpace._rotation   = _rotation * localSpace._rotation;\r\n    worldSpace._position   = _position + _rotation \r\n                           * (localSpace._position * _homothetie);\r\n    return worldSpace;\r\n}\r\n<\/pre><\/div><div class='content-column one_half last_column'><pre class=\"lang:c++ decode:true\" title=\"quaternion_composition_demo\">glm::vec3 homothetie( 0.5f, 0.5f, 0.5f );\r\nfloat angle = PI \/ 2.0f;\r\nglm::vec3 axis( 0.0f, 0.0f, 1.0f );\r\n\r\nglm::vec3 pos( 11.0f\/6.0f, 0.5f, 0.0f );\r\n    \r\nglm::vec4 a( 2.0f\/3.0f, 1.0f\/3.0f, 0.0f, 1.0f );\r\nglm::vec4 c( 5.0f\/3.0f, 5.0f\/6.0f, 0.0f, 1.0f );\r\n    \r\nTransformation s;\r\ns._homothetie = homothetie;\r\nTransformation r;\r\nr._rotation = glm::angleAxis( angle, axis );\r\nTransformation t;\r\nt._position = pos;\r\n\r\nTransformation qc = t * (r * s);\r\n\r\n\/\/ Near except\r\nglm::vec3 cal_c = qc * a;\r\nEXPECT_VEC3_NEAR( c, cal_c, precision );\r\n<\/pre><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<div class=\"alert alert-warning\"><i class=\"icon-warning-sign\"><\/i> On remarquera la pr\u00e9sence des parenth\u00e8ses dans <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-e814e8c1ad18aa629bddc93038907ffe_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#113;&#99;&#32;&#61;&#32;&#116;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#40;&#114;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#115;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"119\" style=\"vertical-align: -4px;\"\/>.<\/div>\n<p>Donc il ne nous reste plus qu&#8217;\u00e0 tester tout \u00e7a sur un exemple complexe.<br \/>\nSoit le sch\u00e9ma suivant avec le rep\u00e8re O, M et R qui sont hi\u00e9rarchis\u00e9s de la mani\u00e8re suivante O \u2192 M \u2192 R. On pose <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-249e717a9e60a915663454b8fcf32fff_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#65;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"13\" style=\"vertical-align: 0px;\"\/> comme le point <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-043259703e0d251026a8b98af2125cfd_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#79;&#125;&#67;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> d\u00e9fini dans R avec les coordonn\u00e9es <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-325e515fbecc6d91f2ee4a58c79e9a30_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#65;&#40;&#49;&#44;&#32;&#48;&#44;&#32;&#48;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"69\" style=\"vertical-align: -4px;\"\/> et on cherche les coordonn\u00e9es de C d\u00e9fini dans le rep\u00e8re O soit <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-f647925d8acc934766c3b5557ac4d5b8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#79;&#125;&#67;&#40;&#49;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#56;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"22\" width=\"71\" style=\"vertical-align: -6px;\"\/>.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-293\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/quaternion_composition.png\" alt=\"\" width=\"306\" height=\"546\" \/><br \/>\nOn va d\u00e9finir la structure de M <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-cf1e075897c5ca895a25bce42c9e3cfd_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#104;&#111;&#109;&#111;&#116;&#104;&#101;&#116;&#105;&#101;&#32;&#38;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#32;&#38;&#49;&#44;&#38;&#48;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#114;&#111;&#116;&#97;&#116;&#105;&#111;&#110;&#32;&#38;&#40;&#48;&#44;&#38;&#48;&#44;&#38;&#115;&#105;&#110;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#52;&#125;&#41;&#44;&#32;&#38;&#32;&#99;&#111;&#115;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#52;&#125;&#41;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#112;&#111;&#115;&#105;&#116;&#105;&#111;&#110;&#32;&#38;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#38;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#38;&#48;&#32;&#41; &#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"66\" width=\"327\" style=\"vertical-align: -28px;\"\/> et R <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-0a882d9cd6aa6626f71d4f472d826f0a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#104;&#111;&#109;&#111;&#116;&#104;&#101;&#116;&#105;&#101;&#32;&#38;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#38;&#92;&#102;&#114;&#97;&#99;&#123;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#38;&#48;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#114;&#111;&#116;&#97;&#116;&#105;&#111;&#110;&#32;&#38;&#40;&#48;&#44;&#38;&#48;&#44;&#38;&#115;&#105;&#110;&#40;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#56;&#125;&#41;&#44;&#32;&#38;&#32;&#99;&#111;&#115;&#40;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#56;&#125;&#41;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#112;&#111;&#115;&#105;&#116;&#105;&#111;&#110;&#32;&#38;&#40;&#51;&#44;&#38;&#48;&#44;&#38;&#48;&#32;&#41; &#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"67\" width=\"384\" style=\"vertical-align: -28px;\"\/>.<\/p>\n<div class=\"well well-small\"><div class='content-column one_half'><p class=\"ql-center-displayed-equation\" style=\"line-height: 218px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-26544ef133b019067eaa21fdda3c3199_l3.png\" height=\"218\" width=\"387\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#67;&#111;&#109;&#112;&#111;&#115;&#101;&#101;&#32;&#38;&#32;&#61; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#32;&#38;&#49;&#44;&#38;&#49;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#48;&#44;&#38;&#48;&#44;&#38;&#115;&#105;&#110;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#52;&#125;&#41;&#44;&#32;&#38;&#32;&#99;&#111;&#115;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#52;&#125;&#41;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#38;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#50;&#125;&#44;&#38;&#48;&#32;&#41; &#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#38;&#92;&#102;&#114;&#97;&#99;&#123;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#38;&#49;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#48;&#44;&#38;&#48;&#44;&#38;&#115;&#105;&#110;&#40;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#56;&#125;&#41;&#44;&#32;&#38;&#32;&#99;&#111;&#115;&#40;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#56;&#125;&#41;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#51;&#44;&#38;&#48;&#44;&#38;&#48;&#32;&#41; &#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#32;&#38;&#92;&#102;&#114;&#97;&#99;&#123;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#38;&#49;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#48;&#44;&#38;&#48;&#44;&#38;&#115;&#105;&#110;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#56;&#125;&#41;&#44;&#32;&#38;&#32;&#99;&#111;&#115;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#92;&#112;&#105;&#125;&#123;&#56;&#125;&#41;&#32;&#41;&#32;&#92;&#92; &#92;&#104;&#102;&#105;&#108;&#108;&#32;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#38;&#50;&#44;&#38;&#48;&#32;&#41; &#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<p class=\"ql-center-displayed-equation\" style=\"line-height: 128px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-6c69177749cce839d3fc857df2f180ea_l3.png\" height=\"128\" width=\"275\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#79;&#125;&#67;&#125;&#32;&#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#50;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#43;&#32;&#113;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#40;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#66;&#125;&#65;&#125;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#71;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#32;&#49;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#41;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#50;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#43;&#32;&#113;&#32;&#123;&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#82;&#125;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#125;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#32;&#92;&#115;&#113;&#114;&#116;&#123;&#50;&#125;&#32;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#50;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#43;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#92; &#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#49;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#56;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/div><div class='content-column one_half last_column'><pre class=\"lang:c++ decode:true\" title=\"quaternion_final_composition\">float angleM =  PI \/ 2.0f;\r\nfloat angleR = -PI \/ 4.0f;\r\nconst glm::vec3 axis( 0.0f, 0.0f, 1.0f );\r\n\r\nconst glm::vec4 a( 1.0f, 0.0f, 0.0f, 1.0f );\r\nconst glm::vec4 c( 1.0f, 7.0f\/3.0f, 0.0f, 1.0f );\r\n\r\nTransformation qm;\r\nqm._homothetie = glm::vec3( 0.5f, 1.0f, 1.0f );\r\nqm._rotation   = glm::angleAxis( angleM, axis );\r\nqm._position   = glm::vec3(2.0f\/3.0f, 1.0f\/2.0f, 0.0f);\r\n\r\nTransformation qr;\r\nqr._homothetie = glm::vec3( sqrt_2 * 2.0f\/3.0f, sqrt_2 \/ 3.0f, 1.0f );\r\nqr._rotation   = glm::angleAxis( angleR, axis );\r\nqr._position   = glm::vec3(3.0f, 0.0f, 0.0f);\r\n\r\nEXPECT_VEC3_NEAR( glm::vec3(2.0f\/3.0f, 2.0f, 0.0f),\r\n                  qm * qr._position, precision );\r\n\r\n\/\/ Composition\r\nTransformation qc = qm * qr;\r\n\r\n\/\/ Near except\r\nglm::vec3 cal_c = qc * a;\r\nEXPECT_VEC3_NEAR( c, cal_c, precision );\r\n<\/pre><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<p>Enfin !!! A ce stade, nos matrices homog\u00e8nes et notre structure avec quaternion font exactement la m\u00eame chose.<br \/>\nAvant de passer \u00e0 la derni\u00e8re partie, je souhaiterai vous monter un avantage suppl\u00e9mentaire avec l&#8217;interpolation.<\/p>\n<h4>Interpolation<\/h4>\n<p>Dans ce dernier chapitre, nous allons donc interpoler notre structure. Il existe deux types d&#8217;interpolation des quaternions soit lin\u00e9aire (lerp) ou sph\u00e9rique (slerp)<br \/>\nOn va cr\u00e9er donc deux fonctions ou seul l&#8217;interpolation du quaternion change (l&#8217;homoth\u00e9tie et la position seront interpol\u00e9es lin\u00e9airement).<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"quaternion_interpolation\">static Transformation lerp(const Transformation&amp; a, const Transformation&amp; b, const float factor)\r\n{\r\n    Transformation interpole;\r\n    interpole._homothetie = a._homothetie + (b._homothetie - a._homothetie) * factor;\r\n    interpole._rotation   = glm::lerp( a._rotation, b._rotation, factor );\r\n    interpole._position   = a._position + (b._position - a._position) * factor;\r\n    return interpole;\r\n}\r\n\r\nstatic Transformation slerp( const Transformation&amp; a, const Transformation&amp; b, const float factor )\r\n{\r\n    Transformation interpole;\r\n    interpole._homothetie = a._homothetie + (b._homothetie - a._homothetie) * factor;\r\n    interpole._rotation   = glm::slerp( a._rotation, b._rotation, factor );\r\n    interpole._position   = a._position + (b._position - a._position) * factor;\r\n    return interpole;\r\n}\r\n<\/pre>\n<p>Nous allons prendre un petit exemple : on va prendre un point <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-e1ea8205482ab79c1f605f5f48a6ffae_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#65;&#40;&#49;&#44;&#32;&#49;&#44;&#32;&#48;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"69\" style=\"vertical-align: -4px;\"\/> et on va le multiplier par notre structure interpol\u00e9 \u00e0 diff\u00e9rent moment de l&#8217;interpolation.<br \/>\nOn va partir du rep\u00e8re classique (pas de rotation, position O et pas d&#8217;homoth\u00e9tie). Et on va aller vers une rotation de 180 degr\u00e9s (ou PI).<br \/>\nVoici le programme et sa courbe pour les deux modes d&#8217;interpolation.<\/p>\n<div class=\"well well-small\"><div class='content-column one_half'><pre class=\"lang:c++ decode:true\" title=\"quaternion_demo_lerp\">float angle = PI;\r\nconst glm::vec3 axis( 0.0f, 0.0f, 1.0f );\r\n\r\nconst glm::vec4 a( 1.0f, 1.0f, 0.0f, 1.0f );\r\n\r\n\/\/ World\r\nTransformation qo;\r\n\/\/ Rotation de 180 degr\u00e9s\r\nTransformation qm;\r\nqm._rotation   = glm::angleAxis( angle, axis );\r\n\r\nconst int animation = 30;\r\nfor( int i=0; i &lt; animation; ++i)\r\n{\r\n    float f = float( i ) \/ float( animation - 1 );\r\n    Transformation qc = Transformation::lerp( qo, qm, f );\r\n\r\n    \/\/ Near except\r\n    glm::vec3 cal_c = qc * a;\r\n\r\n    std::cout &lt;&lt; cal_c.x &lt;&lt; \" \" &lt;&lt; cal_c.y &lt;&lt; std::endl;\r\n}\r\n<\/pre><\/div><br \/>\n<div class='content-column one_half last_column'><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-316\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/lerp.png\" alt=\"\" width=\"543\" height=\"438\" \/><\/div><div class='clear_column'><\/div><br \/>\n<div class='content-column one_half'><pre class=\"lang:c++ decode:true\" title=\"quaternion_demo_slerp\">float angle = PI;\r\nconst glm::vec3 axis( 0.0f, 0.0f, 1.0f );\r\n\r\nconst glm::vec4 a( 1.0f, 1.0f, 0.0f, 1.0f );\r\n\r\n\/\/ World\r\nTransformation qo;\r\n\/\/ Rotation de 180 degr\u00e9s\r\nTransformation qm;\r\nqm._rotation   = glm::angleAxis( angle, axis );\r\n\r\nconst int animation = 30;\r\nfor( int i=0; i &lt; animation; ++i)\r\n{\r\n    float f = float( i ) \/ float( animation - 1 );\r\n    Transformation qc = Transformation::slerp( qo, qm, f );\r\n\r\n    \/\/ Near except\r\n    glm::vec3 cal_c = qc * a;\r\n\r\n    std::cout &lt;&lt; cal_c.x &lt;&lt; \" \" &lt;&lt; cal_c.y &lt;&lt; std::endl;\r\n}\r\n<\/pre><\/div><br \/>\n<div class='content-column one_half last_column'><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-317\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/slerp.png\" alt=\"\" width=\"541\" height=\"542\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/slerp.png 541w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/slerp-150x150.png 150w\" sizes=\"auto, (max-width: 541px) 100vw, 541px\" \/><br \/><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<p>Et voici finalement un cas complet d&#8217;interpolation entre deux structures.<\/p>\n<div class=\"well well-small\"><div class='content-column one_half'><pre class=\"lang:c++ decode:true\" title=\"quaternion_demo_slerp\">float angle = PI;\r\nconst glm::vec3 axis( 0.0f, 0.0f, 1.0f );\r\n\r\nconst glm::vec4 a( 1.0f, 1.0f, 0.0f, 1.0f );\r\n\r\nTransformation qo;\r\n\r\nTransformation qm;\r\nqm._homothetie = glm::vec3( 2.0f, 2.0f, 2.0f );\r\nqm._rotation   = glm::angleAxis( angle, axis );\r\nqm._position   = glm::vec3(4.0f, 4.0f, 0.0f);\r\n\r\nconst int animation = 30;\r\nfor( int i=0; i &lt; animation; ++i)\r\n{\r\n    float f = float( i ) \/ float( animation - 1 );\r\n    Transformation qc = Transformation::slerp( qo, qm, f );\r\n\r\n    \/\/ Near except\r\n    glm::vec3 cal_c = qc * a;\r\n\r\n    std::cout &lt;&lt; cal_c.x &lt;&lt; \",\" &lt;&lt; cal_c.y &lt;&lt; std::endl;\r\n}\r\n<\/pre><\/div><br \/>\n<div class='content-column one_half last_column'><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-319\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/full_slerp.png\" alt=\"\" width=\"692\" height=\"435\" \/><br \/><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<h2>Conclusion<\/h2>\n<p>Comme nous l&#8217;avons vu, les quaternions ne sont que la repr\u00e9sentation d&#8217;une rotation dans l&#8217;espace. Les matrices homog\u00e8nes poss\u00e8dent deux informations suppl\u00e9mentaires : l&#8217;homoth\u00e9tie et la translation. On a donc cr\u00e9\u00e9 une structure permettant de compl\u00e9ter ce manque et rajouter les op\u00e9rateurs pour avoir un \u00e9quivalent aux matrices homog\u00e8nes.<\/p>\n<p>Il ne nous reste plus qu&#8217;\u00e0 utiliser nos nouveaux jouets dans un cas concret : le graphe de sc\u00e8ne.<br \/>\n<a href=\"http:\/\/mouca.fr\/wordpress\/2018\/11\/27\/matrice-quaternion-et-graphe-de-scene-partie-3\/\">Matrice, Quaternion et graphe de sc\u00e8ne &#8211; Partie 3<\/a><\/p>\n<p>&nbsp;<\/p>\n<h1>Sources<\/h1>\n<p><a href=\"http:\/\/culturemath.ens.fr\/maths\/pdf\/logique\/quaternions.pdf\">ENS &#8211; Cours : Quaternions<\/a><br \/>\n<a href=\"https:\/\/www.irit.fr\/~Veronique.Gaildrat\/Ressources\/EnsSupportsCours\/CoursQuaternions.pdf\">IRIT &#8211; COURS : Quaternions<\/a><br \/>\n<a href=\"http:\/\/www.geeks3d.com\/20141201\/how-to-rotate-a-vertex-by-a-quaternion-in-glsl\/\">Geeks3D &#8211; How to rotate a vertex by a quaternion in glsl ?<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous allons parler dans cette article de quaternion et des op\u00e9rations qu&#8217;on peut faire avec mais surtout de comment remplacer nos matrices de transformation par une structure utilisant les quaternions.<\/p>\n","protected":false},"author":2,"featured_media":95,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[46,3,13,50,52,12],"class_list":["post-187","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-maths","tag-c-fr","tag-glm-fr","tag-homothetie-fr","tag-matrice-fr","tag-quaternion-fr","tag-rotation-fr"],"_links":{"self":[{"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/posts\/187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/comments?post=187"}],"version-history":[{"count":55,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/posts\/187\/revisions"}],"predecessor-version":[{"id":588,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/posts\/187\/revisions\/588"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/media\/95"}],"wp:attachment":[{"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/media?parent=187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/categories?post=187"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/tags?post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}