{"id":200,"date":"2018-11-27T08:44:44","date_gmt":"2018-11-27T07:44:44","guid":{"rendered":"http:\/\/mouca.fr\/wordpress\/?p=200"},"modified":"2018-11-29T21:43:51","modified_gmt":"2018-11-29T20:43:51","slug":"matrice-quaternion-et-graphe-de-scene-partie-3","status":"publish","type":"post","link":"http:\/\/mouca.fr\/wordpress\/2018\/11\/27\/matrice-quaternion-et-graphe-de-scene-partie-3\/","title":{"rendered":"Matrice, Quaternion et graphe de sc\u00e8ne &#8211; Partie 3"},"content":{"rendered":"<p>Nous allons terminer notre compr\u00e9hension des matrices et quaternions avec un exemple concret : l&#8217;utilisation de ces outils dans un graphe de sc\u00e8ne.<br \/>\nOn va apprendre \u00e0 manipuler la hi\u00e9rarchie des objets et calculer la mod\u00e8le-vue (ou ModelView en anglais).<br \/>\n<!--more--><\/p>\n<p>Cette 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<p>On a vu pr\u00e9c\u00e9demment plusieurs mani\u00e8res de manipuler le positionnement de nos objets gr\u00e2ce aux matrices, aux structures de transformation (bas\u00e9 sur les quaternions).<br \/>\nNotre objectif est maintenant d&#8217;utiliser la composition de nos outils afin de donner des instruction \u00e0 notre ordinateur pour dessiner des objets.<\/p>\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.<\/div>\n<h2>Vocabulaire<\/h2>\n<p>Beaucoup de termes qui vont suivre sont des traductions de termes anglais.<br \/>\nJe vais essayer d&#8217;en donner des traductions fran\u00e7aises, les plus proches \u00e0 mon sens, du sens premier du mot anglais.<\/p>\n<p>Je vais aussi introduire des termes personnels qui selon moi d\u00e9crivent mieux les notions\/outils.<br \/>\nOn va commencer par la <a class=\"btn disabled\" href=\"#\">Transformation<\/a> qui est la repr\u00e9sentation des trois transformations (rotation, translation et homoth\u00e9tie) en une seule structure. \u00c7a peut \u00eatre une matrice 4&#215;4 ou la structure du m\u00eame nom vue dans la partie 2.<\/p>\n<h2>Graphe de sc\u00e8ne<\/h2>\n<p>Le graphe de sc\u00e8ne est une forme de repr\u00e9sentation d&#8217;une sc\u00e8ne 3D sous forme de graphe. Chaque \u00e9l\u00e9ment de la sc\u00e8ne est repr\u00e9sent\u00e9 dans un n\u0153ud et les liaisons permettent de mettre en relation les n\u0153uds et ainsi de d\u00e9finir une hi\u00e9rarchie.<br \/>\nLe but est de cr\u00e9er un graphe le plus simple possible avec les meilleures relations.<\/p>\n<p>On appelle g\u00e9n\u00e9ralement &#8220;root&#8221; ou &#8220;world&#8221; le n\u0153ud le plus haut qui a pour but de contenir toute la sc\u00e8ne.<br \/>\nEnsuite, on y trouve des n\u0153uds finaux ou interm\u00e9diaires :<\/p>\n<ul>\n<li>Dans les n\u0153uds finaux, on trouve les sources de lumi\u00e8re, les objets \u00e0 afficher, &#8230;<\/li>\n<li>Dans les n\u0153uds interm\u00e9diaires, on trouve la &#8220;transformation&#8221;, des propri\u00e9t\u00e9s graphiques, &#8230;<\/li>\n<\/ul>\n<p>Bien sur, les types de n\u0153uds, leurs statuts finaux ou non d\u00e9pendent fortement de celui qui con\u00e7oit le graphe. Il n&#8217;y a pas r\u00e9ellement de &#8220;standard&#8221; mais juste des bonnes pratiques.<br \/>\nVoici \u00e0 quoi \u00e7a peut ressembler :<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-364\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/scenegraph.png\" alt=\"\" width=\"744\" height=\"484\" \/><\/p>\n<p>On va parler d&#8217;un graphe de sc\u00e8ne purement dans le placement des objets de notre sc\u00e8ne. On va se focaliser sur trois types de n\u0153uds:<\/p>\n<ul>\n<li>La transformation: ce dont on parle depuis le d\u00e9but.<\/li>\n<li>La camera: dans sa forme la plus simple, c&#8217;est \u00e0 dire la matrice de projection.<\/li>\n<li>Le maillage(mesh): notre soupe de points.<\/li>\n<\/ul>\n<h2>Le graphe de sc\u00e8ne : construction<\/h2>\n<p>On va illustrer tout ce qu&#8217;on a vu avec un exemple. Afin de rester simple, on va se focaliser sur les homoth\u00e9ties et les translation.<br \/>\nVoici la sc\u00e8ne suivante:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-408\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/scene.png\" alt=\"\" width=\"499\" height=\"340\" \/><br \/>\nUne vall\u00e9e avec un chemin de fer. Sur les rails, j&#8217;ai un train et sur mon train, j&#8217;ai un personnage qui marche. La camera filme mon personnage et se d\u00e9place derri\u00e8re lui.<\/p>\n<p>On va dans un premier temps mod\u00e9liser notre graphe.<br \/>\n<img decoding=\"async\" class=\"aligncenter size-full wp-image-388\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/graph.png\" alt=\"\" width=\"600\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/graph.png 1293w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/graph-768x995.png 768w\" sizes=\"(max-width: 1293px) 100vw, 1293px\" \/><br \/>\nJ&#8217;ai volontairement mis pleins de n\u0153uds transformations, on se posera la question de leur utilit\u00e9 plus tard.<\/p>\n<p>Maintenant, nous allons pr\u00e9parer nos maillages. Nous allons charger les donn\u00e9es suivantes :<\/p>\n<div class=\"well well-small\" style=\"text-align: center;\">\n<div class='content-column one_third'><h4>La vall\u00e9e<\/h4><\/div>\n<div class='content-column one_third'><h4>Le train<\/h4><\/div>\n<div class='content-column one_third last_column'><h4>Le personnage<\/h4><\/div><div class='clear_column'><\/div>\n<div class='content-column one_third'><img decoding=\"async\" class=\"aligncenter size-full wp-image-389\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/paysage.png\" alt=\"\" width=\"400\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/paysage.png 945w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/paysage-768x536.png 768w\" sizes=\"(max-width: 945px) 100vw, 945px\" \/><br \/><\/div>\n<div class='content-column one_third'><img decoding=\"async\" class=\"aligncenter size-full wp-image-392\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/train.png\" alt=\"\" width=\"250\" \/><br \/><\/div>\n<div class='content-column one_third last_column'><img decoding=\"async\" class=\"aligncenter size-full wp-image-396\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/personnage.png\" alt=\"\" width=\"250\" \/><br \/><\/div><div class='clear_column'><\/div>\n<\/div>\n<p>Comme on peut le voir, les donn\u00e9es ne sont pas dans les m\u00eames unit\u00e9s et leurs positions\/homoth\u00e9ties doivent \u00eatre chang\u00e9es.<\/p>\n<p>Si j&#8217;importe tout dans mon programme, en respectant la hi\u00e9rarchie \u00e9tablie et, en utilisant des &#8220;transformations identit\u00e9s&#8221;, j&#8217;obtiens le r\u00e9sultat suivant :<br \/>\n<img decoding=\"async\" class=\"aligncenter size-full wp-image-394\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/all_scene_origin.png\" alt=\"\" width=\"600\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/all_scene_origin.png 1048w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/05\/all_scene_origin-768x492.png 768w\" sizes=\"(max-width: 1048px) 100vw, 1048px\" \/><\/p>\n<p>Ce n&#8217;est pas vraiment le r\u00e9sultat attendu.<br \/>\nOn va calculer les transformations de chacun de nos mod\u00e8les. L&#8217;id\u00e9e est de changer la position du mod\u00e8le et son homoth\u00e9tie afin de mieux la manipuler plus tard :<\/p>\n<ol>\n<li>On va d\u00e9finir le nouveau centre de nos objets &#8220;train&#8221; et &#8220;personnage&#8221; comme \u00e9tant le point centr\u00e9e en bas de l&#8217;objet.<\/li>\n<li>Pour l&#8217;homoth\u00e9tie, on va \u00e9quilibrer chaque maillage par rapport \u00e0 la vall\u00e9e<\/li>\n<\/ol>\n<p>On se retrouve avec les transformations suivantes :<br \/>\n<div class='content-column one_half'><div class=\"well well-small\" style=\"text-align: center;\">\n<h4>Le train<\/h4>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-420\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeT1-1.png\" alt=\"\" height=\"350\" \/><\/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-79e7dbb20b820bbf6a8c809f268afc44_l3.png\" height=\"51\" width=\"220\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#80;&#111;&#115;&#105;&#116;&#105;&#111;&#110;&#32;&#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#53;&#125;&#123;&#51;&#125;&#44;&#32;&#45;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#46;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#72;&#111;&#109;&#111;&#116;&#104;&#92;&#39;&#101;&#116;&#105;&#101;&#32;&#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#50;&#46;&#48;&#44;&#32;&#50;&#46;&#48;&#44;&#32;&#50;&#46;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;&#32;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<\/div><\/div><\/p>\n<div class='content-column one_half last_column'><div class=\"well well-small\" style=\"text-align: center;\">\n<h4>Le personnage<\/h4>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-419\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeP1-1.png\" alt=\"\" height=\"350\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeP1-1.png 821w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeP1-1-768x723.png 768w\" sizes=\"(max-width: 821px) 100vw, 821px\" \/><\/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-86f31f3fea6308bf0b937bb9bba73a7e_l3.png\" height=\"51\" width=\"204\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#80;&#111;&#115;&#105;&#116;&#105;&#111;&#110;&#32;&#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#48;&#46;&#48;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#57;&#125;&#44;&#32;&#48;&#46;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#72;&#111;&#109;&#111;&#116;&#104;&#92;&#39;&#101;&#116;&#105;&#101;&#32;&#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;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#50;&#125;&#123;&#51;&#125;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;&#32;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<\/div><\/div><div class='clear_column'><\/div>\n<p>A ce stade, on a:<br \/>\n<img decoding=\"async\" class=\"alignnone size-full wp-image-417\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graph_1.png\" alt=\"\" width=\"900\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graph_1.png 1741w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graph_1-768x721.png 768w\" sizes=\"(max-width: 1741px) 100vw, 1741px\" \/><\/p>\n<p>Il nous reste \u00e0 calculer <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-0c9f72963f35eceecd52bf93f68cebb8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"17\" style=\"vertical-align: -4px;\"\/>, <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-c0e186d4e9cfb50e2892db3b46e757f5_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/>, on laissera l&#8217;identit\u00e9 \u00e0 <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-a9c58729d7e6e6bc9806660e416c9e44_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/>.<br \/>\n<div class='content-column one_half'><div class=\"well well-small\" style=\"text-align: center;\">\n<h4><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-0c9f72963f35eceecd52bf93f68cebb8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"17\" style=\"vertical-align: -4px;\"\/> dans <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-c0e186d4e9cfb50e2892db3b46e757f5_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/><\/h4>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-405\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeP1.png\" alt=\"\" height=\"252\" \/><\/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-d6114973a1e7c89a6498dd43e99fbce6_l3.png\" height=\"51\" width=\"216\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#80;&#111;&#115;&#105;&#116;&#105;&#111;&#110;&#32;&#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;&#50;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#52;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#46;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#72;&#111;&#109;&#111;&#116;&#104;&#92;&#39;&#101;&#116;&#105;&#101;&#32;&#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#49;&#46;&#48;&#44;&#32;&#49;&#46;&#48;&#44;&#32;&#49;&#46;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;&#32;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<\/div><\/div><\/p>\n<div class='content-column one_half last_column'><div class=\"well well-small\" style=\"text-align: center;\">\n<h4><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-c0e186d4e9cfb50e2892db3b46e757f5_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/> dans <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-a9c58729d7e6e6bc9806660e416c9e44_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/><\/h4>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-406\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeT1.png\" alt=\"\" height=\"252\" \/><\/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-5b33f966fbdbecd356ff58036a9a6025_l3.png\" height=\"51\" width=\"216\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125; &#80;&#111;&#115;&#105;&#116;&#105;&#111;&#110;&#32;&#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;&#48;&#125;&#123;&#51;&#125;&#44;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#51;&#125;&#44;&#32;&#48;&#46;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#72;&#111;&#109;&#111;&#116;&#104;&#92;&#39;&#101;&#116;&#105;&#101;&#32;&#38;&#32;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#49;&#46;&#48;&#44;&#32;&#49;&#46;&#48;&#44;&#32;&#49;&#46;&#48;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#92; &#92;&#101;&#110;&#100;&#123;&#97;&#108;&#105;&#103;&#110;&#42;&#125;&#32;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<\/div><\/div><div class='clear_column'><\/div>\n<p>Finalement, on a notre sc\u00e8ne finale.<br \/>\n<img decoding=\"async\" class=\"alignnone size-full wp-image-418\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graph_2.png\" alt=\"\" width=\"900\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graph_2.png 1790w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graph_2-768x721.png 768w\" sizes=\"(max-width: 1790px) 100vw, 1790px\" \/><\/p>\n<div class=\"alert alert-success\">\n<p>Bien \u00e9videmment, les infos positions\/ homoth\u00e9ties sont calcul\u00e9es pour le sens &#8220;local vers monde&#8221;.<br \/>\nVoici leur \u00e9criture en c++\/glm ainsi que la structure vue au chapitre pr\u00e9c\u00e9dent:<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"ecriture_orientation\">Transformation P0(glm::vec3(0.0f, 2.0f\/9.0f, 0.0f), glm::vec3(2.0f\/3.0f));\r\nglm::mat4      P0(glm::scale(glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 2.0f\/9.0f, 0.0f)), glm::vec3(2.0f\/3.0f) ));\r\n<\/pre>\n<\/div>\n<p>Au niveau code, on va d\u00e9finir deux classes sc\u00e8nes : une avec les matrices 4&#215;4 et l&#8217;autre notre structure Transformation.<\/p>\n<div class=\"well well-small\" style=\"text-align: center;\">\n<pre class=\"lang:c++ decode:true\" title=\"SceneGraphTransformation\">class SceneGraphTransformation\r\n{\r\npublic:\r\n    SceneGraphTransformation() :\r\n        P0( glm::vec3( 0.0f, 2.0f\/9.0f, 0.0f ), glm::vec3( 2.0f\/3.0f ) ),\r\n        P1( glm::vec3( 2.0f\/3.0f, 4.0f\/3.0f, 0.0f ) ),\r\n        T0( glm::vec3( -5.0f\/3.0f, -2.0f\/3.0f, 0.0f ), glm::vec3( 2.0f ) ),\r\n        T1( glm::vec3( 10.0f\/3.0f, 1.0f\/3.0f, 0.0f ) ),\r\n        V1(),\r\n        C0( glm::vec3( -1.0f, 1.0f\/3.0f, 0.0f ) )\r\n    {}\r\n\r\n    Transformation P0, P1, T0, T1, V1, C0;\r\n};\r\n<\/pre>\n<pre class=\"lang:c++ decode:true\" title=\"SceneGraphMatrix\">class SceneGraphMatrix\r\n{\r\npublic:\r\n    SceneGraphMatrix() :\r\n        P0( glm::scale( glm::translate( glm::mat4( 1.0f ), glm::vec3( 0.0f, 2.0f\/9.0f, 0.0f ) ), glm::vec3( 2.0f\/3.0f ) ) ),\r\n        P1( glm::translate( glm::mat4( 1.0f ), glm::vec3( 2.0f\/3.0f, 4.0f\/3.0f, 0.0f ) ) ),\r\n        T0( glm::scale( glm::translate( glm::mat4( 1.0f ), glm::vec3( -5.0f\/3.0f, -2.0f\/3.0f, 0.0f ) ), glm::vec3( 2.0f ) ) ),\r\n        T1( glm::translate( glm::mat4( 1.0f ), glm::vec3( 10.0f\/3.0f, 1.0f\/3.0f, 0.0f ) ) ),\r\n        V1( glm::mat4( 1.0f ) ),\r\n        C0( glm::translate( glm::mat4( 1.0f ), glm::vec3( -1.0f, 1.0f\/3.0f, 0.0f ) ) )\r\n    {}\r\n\r\n    glm::mat4 P0, P1, T0, T1, V1, C0;\r\n};\r\n<\/pre>\n<\/div>\n<h2>Calculons<\/h2>\n<p>Nous allons commencer \u00e0 faire quelques calculs simples sur notre graphe afin de v\u00e9rifier que tout marche bien.<\/p>\n<h3>O\u00f9 est mon point ?<\/h3>\n<p>Soit C un point du casque de notre personnage d\u00e9fini par <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-4ccc11c6a0224c52b8451ec2226043ae_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#99;&#111;&#108;&#111;&#114;&#123;&#109;&#121;&#79;&#125;&#67;&#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;&#48;&#46;&#48;&#44;&#32;&#48;&#46;&#48;&#32;&#92;&#101;&#110;&#100;&#123;&#112;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"23\" width=\"103\" style=\"vertical-align: -7px;\"\/> dans le rep\u00e8re P.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-411\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/defineC.png\" alt=\"\" width=\"261\" height=\"233\" \/><\/p>\n<p>On va chercher \u00e0 calculer o\u00f9 se trouve C dans V1.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-410\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeC.png\" alt=\"\" width=\"771\" height=\"545\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeC.png 771w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeC-768x543.png 768w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/computeC-211x150.png 211w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><br \/>\nL&#8217;objectif ici est simple: composer toutes les transformations dans le bon ordre et multiplier C par celle-ci; soit le travail suivant:<\/p>\n<div class=\"well well-small\" style=\"text-align: center;\"><div class='content-column two_fifth'><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-412\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/modelMatrice.png\" alt=\"\" width=\"516\" height=\"731\" \/><br \/><\/div><br \/>\n<div class='content-column three_fifth last_column'><pre class=\"lang:c++ decode:true\" title=\"model_composition\">const float precision = 1e-5f;\r\nconst SceneGraphTransformation scene;\r\n\r\n\/\/ Compute composed transformation and apply to C.\r\nconst glm::vec3 C(0.0f, 1.0f\/3.0f, 0.0f);\r\nconst Transformation model = scene.V1 * (scene.T1 * (scene.P1 * scene.P0));\r\nconst glm::vec3 CinW = model * C;\r\nEXPECT_VEC3_NEAR(glm::vec3(4.0f, 19.0f\/9.0f, 0.0f), CinW, precision);\r\n<\/pre>\n<pre class=\"lang:c++ decode:true\" title=\"model_composition_matrix\">const float precision = 1e-5f;\r\nconst SceneGraphMatrix scene;\r\n\r\n\/\/ Compute composed matrix and apply to C.\r\nconst glm::vec4 C(0.0f, 1.0f\/3.0f, 0.0f, 1.0f);\r\nconst glm::mat4 model = scene.V1 * (scene.T1 * (scene.P1 * scene.P0));\r\nconst glm::vec4 CinW = model * C;\r\nEXPECT_VEC4_NEAR(glm::vec4(4.0f, 19.0f\/9.0f, 0.0f, 1.0f), CinW, precision);\r\n<\/pre><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<div class=\"alert alert-info\">\n<h4>Conclusion<\/h4>\n<ul>\n<li>On a bien notre r\u00e9sultat attendu.<\/li>\n<li>Ici les transformations calcul\u00e9es pr\u00e9c\u00e9demment sont dans le bon sens donc il n&#8217;y a rien de plus \u00e0 faire que les \u00e9crire en C++.<\/li>\n<li>On se m\u00e9fiera des parenth\u00e8ses lors du calcul de la compos\u00e9e !<\/li>\n<\/ul>\n<\/div>\n<p>Au niveau litt\u00e9rature, <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-c0e186d4e9cfb50e2892db3b46e757f5_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/> ou <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-849922048b28f9c55ecd44f08e16ad55_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#48;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"17\" style=\"vertical-align: -3px;\"\/> ou <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-0c9f72963f35eceecd52bf93f68cebb8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"17\" style=\"vertical-align: -4px;\"\/>, &#8230; se nomme une <a class=\"btn disabled\" href=\"#\">matrice mod\u00e8le<\/a> (ou <a class=\"btn disabled\" href=\"#\">Model Matrix<\/a> en anglais).<br \/>\nCe terme ne me plait pas \u00e0 cause du mot &#8220;Matrix&#8221;. Avec la structure Transformation, on calcule la m\u00eame chose et ce n&#8217;est pas une matrice &#8230; Je pense que c&#8217;est historique car OpenGL ne manipule que des matrices depuis sa cr\u00e9ation.<\/p>\n<p>Je pr\u00e9f\u00e8re qu&#8217;on parle <a class=\"btn disabled\" href=\"#\">transformation mod\u00e8le<\/a> et <a class=\"btn disabled\" href=\"#\">transformation mod\u00e8le-monde<\/a>, la compos\u00e9e qui part d&#8217;un objet (affichable) et qui remonte jusqu&#8217;au n\u0153ud monde.<br \/>\nCes termes sont discutables.<\/p>\n<h3>Utilit\u00e9 des n\u0153uds Transformations<\/h3>\n<p>Pour le moment, on n&#8217;a jamais vraiment remis en question le graphe de sc\u00e8ne originel que je vous ai donn\u00e9 en d\u00e9but d&#8217;article.<br \/>\nEn effet, on pourrait supprimer tous les n\u0153uds transformations : les identit\u00e9s (n\u0153ud en vert) ne servent pas et le positionnement de nos objets pourrait directement \u00eatre fait en modifiant la valeur de nos points. On aurait donc le m\u00eame r\u00e9sultat visuel sans calcul.<\/p>\n<p>Alors la question est pourquoi les garde-t-on ?<br \/>\nLes deux utilit\u00e9s principales sont :<\/p>\n<ul>\n<li>Le partage d&#8217;un m\u00eame maillage \u00e0 divers endroit de la sc\u00e8ne. On va donc utiliser un seul maillage (\u00e9conomie de m\u00e9moire, si notre objet fait 3 Mo de donn\u00e9es maillage dupliqu\u00e9 1024 fois on va vite remplir la carte graphique)<\/li>\n<li>La transformation collective des maillages.<\/li>\n<\/ul>\n<p>On va donc \u00e9tudier le deuxi\u00e8me point:<br \/>\nOn va reprendre notre sc\u00e8ne mais en bougeant la transformation <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-c0e186d4e9cfb50e2892db3b46e757f5_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/>. On va juste changer sa valeur de position comme suit:<br \/>\n<img decoding=\"async\" class=\"aligncenter size-full wp-image-424\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graphMove.png\" alt=\"\" width=\"900\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graphMove.png 981w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/graphMove-768x692.png 768w\" sizes=\"(max-width: 981px) 100vw, 981px\" \/><\/p>\n<p>Maintenant, on va calculer comme pr\u00e9c\u00e9demment la compos\u00e9e de notre personnage et l&#8217;appliqu\u00e9 \u00e0 C. Et voici le r\u00e9sultat:<\/p>\n<div class=\"well well-small\" style=\"text-align: center;\"><div class='content-column two_fifth'>C a chang\u00e9 de place dans le monde mais pas dans l&#8217;espace <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-c0e186d4e9cfb50e2892db3b46e757f5_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#49;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"16\" style=\"vertical-align: -4px;\"\/>.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-425\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/moveTrain.png\" alt=\"\" width=\"590\" height=\"449\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/moveTrain.png 590w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/moveTrain-290x220.png 290w\" sizes=\"auto, (max-width: 590px) 100vw, 590px\" \/><br \/><\/div><br \/>\n<div class='content-column three_fifth last_column'><pre class=\"lang:c++ decode:true\" title=\"model_composition_move\">const float precision = 1e-5f;\r\nSceneGraphTransformation scene;\r\n\r\n\/\/ Move T1 to example position\r\nscene.T1 = Transformation( glm::vec3( 7.0f\/3.0f, 1.0f\/3.0f, 0.0f ) );\r\n\r\nconst glm::vec3 C( 0.0f, 1.0f\/3.0f, 0.0f );\r\n\/\/ Compose model\r\nconst Transformation model = scene.V1 * (scene.T1 * (scene.P1 * scene.P0));\r\n\/\/ Apply Model-view on C\r\nconst glm::vec3 CinW = model * C;\r\nEXPECT_VEC3_NEAR( glm::vec3( 3.0f, 19.0f\/9.0f, 0.0f ), CinW, precision );\r\n<\/pre><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<h3>Mod\u00e8le-vue-projection<\/h3>\n<p>La <a class=\"btn disabled\" href=\"#\">mod\u00e8le-vue-projection<\/a> (ou modelview projection en anglais) est la matrice calcul\u00e9e et envoy\u00e9e \u00e0 nos syst\u00e8mes de rendu (shader).<br \/>\nElle se d\u00e9compose en deux parties:<br \/>\n&#8211; Mod\u00e8le-Vue : qui se lit <a class=\"btn disabled\" href=\"#\">mod\u00e8le \u2192 vue<\/a>.<br \/>\n&#8211; Projection : La matrice de projection 3D vers 2D (perspective ou orthogonale), on n&#8217;en parlera pas ici.<\/p>\n<p>Le calcul de la <a class=\"btn disabled\" href=\"#\">mod\u00e8le-vue<\/a> se fait par la m\u00e9thode suivante:<\/p>\n<p>Composition des transformations:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ol>On part du mod\u00e8le et on remonte jusqu&#8217;au monde<\/ol>\n<ol>On part du monde et on descend jusqu&#8217;\u00e0 la camera de rendu: on appelle la<\/ol>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a class=\"btn disabled\" href=\"#\">matrice Vue<\/a><\/p>\n<p>Pour la <a class=\"btn disabled\" href=\"#\">vue<\/a>, on va calculer le chemin ci-dessous. Vu qu&#8217;on change de sens, il faudra inverser nos transformations.<br \/>\n<img decoding=\"async\" class=\"aligncenter size-full wp-image-439\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/vue.png\" alt=\"\" width=\"500\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/vue.png 777w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/vue-768x881.png 768w\" sizes=\"(max-width: 777px) 100vw, 777px\" \/><\/p>\n<p>En composant, <a class=\"btn disabled\" href=\"#\">Mod\u00e8le<\/a> et <a class=\"btn disabled\" href=\"#\">Vue<\/a>, on obtient le chemin complet qui permet d&#8217;exprimer les points d&#8217;un maillage dans le rep\u00e8re camera : la <a class=\"btn disabled\" href=\"#\">transformation mod\u00e8le-vue<\/a> (ou modelview en anglais).<\/p>\n<div class=\"alert alert-info\">Alors pour le cas de notre personnage, le chemin le plus court ne nous fait pas passer par le monde. Mais traditionnellement, on calcule la &#8220;Vue&#8221; une fois pour toute \u00e0 partir du &#8220;monde&#8221;.<\/div>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-427\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/modelview.png\" alt=\"\" width=\"500\" \/><\/p>\n<p>On va calculer C avec cette nouvelle transformation:<\/p>\n<div class=\"well well-small\" style=\"text-align: center;\"><div class='content-column two_fifth'><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-426\" src=\"https:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/sceneCamera.png\" alt=\"\" width=\"506\" height=\"383\" srcset=\"http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/sceneCamera.png 506w, http:\/\/mouca.fr\/wordpress\/wp-content\/uploads\/2018\/11\/sceneCamera-290x220.png 290w\" sizes=\"auto, (max-width: 506px) 100vw, 506px\" \/><br \/><\/div><br \/>\n<div class='content-column three_fifth last_column'><pre class=\"lang:c++ decode:true\" title=\"modelvue\">const float precision = 1e-5f;\r\nSceneGraphTransformation scene;\r\n    \r\n\/\/ Move T1 to example position\r\nscene.T1 = Transformation( glm::vec3( 8.0f\/3.0f, 1.0f\/3.0f, 0.0f ) );\r\n\r\nconst glm::vec3 C( 0.0f, 1.0f\/3.0f, 0.0f );\r\n\/\/ Compose model\r\nconst Transformation model = scene.V1 * (scene.T1 * (scene.P1 * scene.P0));\r\n\/\/ Compose view\r\nconst Transformation view  = \r\n       (Transformation::inverse(scene.C0) * (Transformation::inverse(scene.P1) * \r\n       (Transformation::inverse(scene.T1) * Transformation::inverse(scene.V1))));\r\n\/\/ Apply Model-view on C\r\nconst glm::vec3 CinCamera = view * (model * C);\r\n\/\/ Test it !\r\nEXPECT_VEC3_NEAR( glm::vec3( 1.0f, 1.0f\/9.0f, 0.0f ), CinCamera, precision );\r\n\r\n\/\/ Another way is to compute \"model orientation\" of camera and inverse at the end !\r\nconst Transformation viewAlternative = \r\n    Transformation::inverse( scene.V1 * (scene.T1 * (scene.P1 * scene.C0)) );\r\nEXPECT_VEC3_NEAR( viewAlternative._position,   view._position,   precision );\r\nEXPECT_VEC3_NEAR( viewAlternative._homothetie, view._homothetie, precision );\r\n<\/pre><\/div><div class='clear_column'><\/div><\/p>\n<\/div>\n<p>Au final, notre sc\u00e8ne est op\u00e9rationnelle, il nous restera donc \u00e0 calculer chacune des <a class=\"btn disabled\" href=\"#\">mod\u00e8le-vue<\/a> et de les transmettre \u00e0 notre syst\u00e8me de rendu (shaders, matrice OpenGL, &#8230;).<\/p>\n<h3>Utilisation dans un shader<\/h3>\n<p>Voici un exemple de shader extrait de l&#8217;excellent GitHub pour apprendre Vulkan: <a href=\"https:\/\/github.com\/SaschaWillems\/Vulkan\/blob\/master\/data\/shaders\/deferred\/mrt.vert\">GitHub SaschaWillems <\/a><br \/>\nIci on retrouve dans la structure <a class=\"btn disabled\" href=\"#\">uniform UBO<\/a> les donn\u00e9es pr\u00e9c\u00e9demment vues ainsi que l&#8217;utilisation (conversion du point maillage) <a class=\"btn disabled\" href=\"#\">gl_Position = ubo.projection * ubo.view * ubo.model * tmpPos;<\/a>.<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"SaschaWillems mrt.vert\">#version 450\r\n\r\nlayout (location = 0) in vec4 inPos;\r\nlayout (location = 1) in vec2 inUV;\r\nlayout (location = 2) in vec3 inColor;\r\nlayout (location = 3) in vec3 inNormal;\r\nlayout (location = 4) in vec3 inTangent;\r\n\r\nlayout (binding = 0) uniform UBO \r\n{\r\n\tmat4 projection;\r\n\tmat4 model;\r\n\tmat4 view;\r\n\tvec4 instancePos[3];\r\n} ubo;\r\n\r\nlayout (location = 0) out vec3 outNormal;\r\nlayout (location = 1) out vec2 outUV;\r\nlayout (location = 2) out vec3 outColor;\r\nlayout (location = 3) out vec3 outWorldPos;\r\nlayout (location = 4) out vec3 outTangent;\r\n\r\nout gl_PerVertex\r\n{\r\n\tvec4 gl_Position;\r\n};\r\n\r\nvoid main() \r\n{\r\n\tvec4 tmpPos = inPos + ubo.instancePos[gl_InstanceIndex];\r\n\r\n\tgl_Position = ubo.projection * ubo.view * ubo.model * tmpPos;\r\n\t\r\n\toutUV = inUV;\r\n\toutUV.t = 1.0 - outUV.t;\r\n\r\n\t\/\/ Vertex position in world space\r\n\toutWorldPos = vec3(ubo.model * tmpPos);\r\n\t\/\/ GL to Vulkan coord space\r\n\toutWorldPos.y = -outWorldPos.y;\r\n\t\r\n\t\/\/ Normal in world space\r\n\tmat3 mNormal = transpose(inverse(mat3(ubo.model)));\r\n\toutNormal = mNormal * normalize(inNormal);\t\r\n\toutTangent = mNormal * normalize(inTangent);\r\n\t\r\n\t\/\/ Currently just vertex color\r\n\toutColor = inColor;\r\n}\r\n<\/pre>\n<h2>Conclusion<\/h2>\n<p>Au fil de cette s\u00e9rie d&#8217;article, on a vu comment manipuler et former des transformations bas\u00e9es sur les matrices 4&#215;4 ou les quaternions et on a utilis\u00e9 tout \u00e7a afin de former un graphe de sc\u00e8ne. Il ne nous reste maintenant qu&#8217;\u00e0 exploiter ces donn\u00e9es dans un syst\u00e8me de rendu (Qt, OpenGL, Vulkan, DirectX, &#8230;).<\/p>\n<p>La hi\u00e9rarchie des n\u0153uds de transformation est extr\u00eamement utile car en bougeant le n\u0153ud de haut niveau, on d\u00e9place tous ceux qui en d\u00e9pendent.<br \/>\nPar exemple, j&#8217;ai une sc\u00e8ne avec une table sur laquelle se trouve des objets (lampe, mug, &#8230;); si je d\u00e9place la table, mes objets vont rester \u00e0 la m\u00eame position sur la table.<\/p>\n<p>Pensez toujours \u00e0 faire des graphes de sc\u00e8ne simple. D\u2019ailleurs, la critique qu&#8217;on pourrait faire de celui que je vous ai pr\u00e9sent\u00e9 est bien sur les n\u0153uds <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-47d24c8a268b9afa7723470f82dca763_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;&#95;&#123;&#48;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"17\" style=\"vertical-align: -3px;\"\/>, <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-849922048b28f9c55ecd44f08e16ad55_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#95;&#123;&#48;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"17\" style=\"vertical-align: -3px;\"\/>, <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mouca.fr\/wordpress\/wp-content\/ql-cache\/quicklatex.com-f504cbe322b404744591404bf80d428c_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;&#95;&#123;&#48;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"20\" style=\"vertical-align: -3px;\"\/>.<br \/>\nIci ils n&#8217;apportent rien, le plus simple serait de modifier les points du maillage directement.<\/p>\n<p>J&#8217;esp\u00e8re que ce type de s\u00e9rie vous a plu. \u00c7a va me permettre de poser les bases du rendu 3D et ainsi aller plus loin dans les futurs articles.<\/p>\n<p>Merci d&#8217;avoir lu cet article !<\/p>\n<p>N&#8217;h\u00e9sitez pas \u00e0 le partager, \u00e0 me signaler les probl\u00e8mes, et aussi \u00e0 le commenter afin d&#8217;en faire un outils dynamique et constructif !<\/p>\n<h2>Sources<\/h2>\n<p><a href=\"http:\/\/www.opengl-tutorial.org\/fr\/beginners-tutorials\/tutorial-3-matrices\/\">OpenGL Tutorial: Les matrices<\/a><br \/>\n<a href=\"https:\/\/tcuvelier.developpez.com\/tutoriels\/jeux\/opengl\/swiftless-opengl-4\/3-matrices\/#LII-B\">Matrices dans OpenGL 4<\/a><br \/>\n<a href=\"http:\/\/www.irisa.fr\/prive\/kadi\/DIIC\/SDI-2-annee\/Graphe_Scene\/SceneGraph2_V2_4.pdf\">Introduction to Scene Graphs<\/a><br \/>\n<a href=\"https:\/\/www.cs.utexas.edu\/users\/fussell\/courses\/cs354\/lectures\/lecture11.pdf\">Viewing and Modeling<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous allons terminer notre compr\u00e9hension des matrices et quaternions avec un exemple concret : l&#8217;utilisation de ces outils dans un graphe de sc\u00e8ne. On va apprendre \u00e0 manipuler la hi\u00e9rarchie des objets et calculer la mod\u00e8le-vue (ou ModelView en anglais).<\/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,63,50,65,67,52],"class_list":["post-200","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-maths","tag-c-fr","tag-glm-fr","tag-graphe-de-scene","tag-matrice-fr","tag-modelview","tag-mvp","tag-quaternion-fr"],"_links":{"self":[{"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/posts\/200","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=200"}],"version-history":[{"count":41,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/posts\/200\/revisions"}],"predecessor-version":[{"id":452,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/posts\/200\/revisions\/452"}],"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=200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/categories?post=200"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/mouca.fr\/wordpress\/wp-json\/wp\/v2\/tags?post=200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}