{"id":2747,"date":"2020-06-12T12:54:24","date_gmt":"2020-06-12T09:54:24","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2747"},"modified":"2024-12-16T22:32:27","modified_gmt":"2024-12-16T19:32:27","slug":"%d1%81%d0%ba%d0%b5%d0%bb%d0%b5%d1%82%d0%bd%d0%b0%d1%8f-%d0%b0%d0%bd%d0%b8%d0%bc%d0%b0%d1%86%d0%b8%d1%8f-%d1%87%d0%b0%d1%81%d1%82%d1%8c-2-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d1%8f-%d0%bd","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2020\/06\/12\/%d1%81%d0%ba%d0%b5%d0%bb%d0%b5%d1%82%d0%bd%d0%b0%d1%8f-%d0%b0%d0%bd%d0%b8%d0%bc%d0%b0%d1%86%d0%b8%d1%8f-%d1%87%d0%b0%d1%81%d1%82%d1%8c-2-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d1%8f-%d0%bd\/","title":{"rendered":"Animation squelettique (partie 2 &#038; # 8211; hi\u00e9rarchie de n\u0153uds, interpolation)"},"content":{"rendered":"<p>Je continue \u00e0 d\u00e9crire l&#8217;algorithme d&#8217;animation squelettique tel qu&#8217;il est impl\u00e9ment\u00e9 dans Flame Steel Engine.<\/p>\n<p><strong><em>\u00c9tant donn\u00e9 que l&#8217;algorithme est le plus complexe de tous ceux que j&#8217;ai impl\u00e9ment\u00e9s, des erreurs peuvent appara\u00eetre dans les notes sur le processus de d\u00e9veloppement. Dans l&#8217;article pr\u00e9c\u00e9dent sur cet algorithme, j&#8217;ai commis une erreur\u00a0: le r\u00e9seau d&#8217;os est transf\u00e9r\u00e9 au shader pour chaque maillage s\u00e9par\u00e9ment, et non pour l&#8217;ensemble du mod\u00e8le.<\/em><\/strong><\/p>\n<h3>Hi\u00e9rarchie des n\u0153uds<\/h3>\n<p>Pour que l&#8217;algorithme fonctionne correctement, il est n\u00e9cessaire que le mod\u00e8le contienne une connexion entre les os entre eux (graphique). Imaginons une situation dans laquelle deux animations sont jou\u00e9es simultan\u00e9ment &#8211; sautez et levez la main droite. L&#8217;animation de saut doit soulever le mod\u00e8le le long de l&#8217;axe Y, tandis que l&#8217;animation de lever de bras doit en tenir compte et monter avec le mod\u00e8le au fur et \u00e0 mesure qu&#8217;il saute, sinon le bras restera en place tout seul.<\/p>\n<p>Nous d\u00e9crirons la connexion des n\u0153uds pour ce cas &#8211; le corps contient la main. Lors de l&#8217;\u00e9laboration de l&#8217;algorithme, le graphique osseux sera lu, toutes les animations seront prises en compte avec les connexions correctes. Dans la m\u00e9moire du mod\u00e8le, le graphique est stock\u00e9 s\u00e9par\u00e9ment de toutes les animations, uniquement pour refl\u00e9ter la connectivit\u00e9 des os du mod\u00e8le.<\/p>\n<h3>Interpolation sur CPU<\/h3>\n<p>Dans le dernier article, j&#8217;ai d\u00e9crit le principe du rendu de l&#8217;animation squelettique\u00a0: &#8220;Les matrices de transformation sont transf\u00e9r\u00e9es du CPU au shader \u00e0 chaque image de rendu.&#8221;<\/p>\n<p>Chaque image de rendu est trait\u00e9e sur le processeur\u00a0; pour chaque os de maillage, le moteur re\u00e7oit la matrice de transformation finale en utilisant l&#8217;interpolation de position, la rotation et le zoom. Lors de l&#8217;interpolation de la matrice osseuse finale, un passage est effectu\u00e9 \u00e0 travers l&#8217;arborescence des n\u0153uds pour toutes les animations de n\u0153uds actives, la matrice finale est multipli\u00e9e par celles parent, puis envoy\u00e9e pour rendu au vertex shader.<\/p>\n<p>Les vecteurs sont utilis\u00e9s pour l&#8217;interpolation de position et le grossissement\u00a0; les quaternions sont utilis\u00e9s pour la rotation, car ils sont tr\u00e8s faciles \u00e0 interpoler (SLERP), contrairement aux angles d&#8217;Euler, et ils sont \u00e9galement tr\u00e8s faciles \u00e0 repr\u00e9senter sous forme de matrice de transformation.<\/p>\n<h3>Comment simplifier la mise en \u0153uvre<\/h3>\n<p>Pour faciliter le d\u00e9bogage du vertex shader, j&#8217;ai ajout\u00e9 une simulation du vertex shader sur le CPU \u00e0 l&#8217;aide de la macro FSGLOGLNEWAGERENDERER_CPU_BASED_VERTEX_MODS_ENABLED. Le fabricant de la carte vid\u00e9o NVIDIA dispose d&#8217;un utilitaire de d\u00e9bogage du code de shader Nsight, peut-\u00eatre qu&#8217;il peut aussi simplifier le d\u00e9veloppement d&#8217;algorithmes complexes de shader de sommets\/pixels, mais je n&#8217;ai jamais pu tester sa fonctionnalit\u00e9 sur le CPU, c&#8217;\u00e9tait suffisant.<\/p>\n<p>Dans le prochain article, je pr\u00e9vois de d\u00e9crire le m\u00e9lange de plusieurs animations et de combler les lacunes restantes.<\/p>\n<h3>Sources<\/h3>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=f3Cr8Yx3GGA\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.youtube.com\/watch?v= f3Cr8Yx3GGA<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je continue \u00e0 d\u00e9crire l&#8217;algorithme d&#8217;animation squelettique tel qu&#8217;il est impl\u00e9ment\u00e9 dans Flame Steel Engine. \u00c9tant donn\u00e9 que l&#8217;algorithme est le plus complexe de tous ceux que j&#8217;ai impl\u00e9ment\u00e9s, des erreurs peuvent appara\u00eetre dans les notes sur le processus de d\u00e9veloppement. Dans l&#8217;article pr\u00e9c\u00e9dent sur cet algorithme, j&#8217;ai commis une erreur\u00a0: le r\u00e9seau d&#8217;os est<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2020\/06\/12\/%d1%81%d0%ba%d0%b5%d0%bb%d0%b5%d1%82%d0%bd%d0%b0%d1%8f-%d0%b0%d0%bd%d0%b8%d0%bc%d0%b0%d1%86%d0%b8%d1%8f-%d1%87%d0%b0%d1%81%d1%82%d1%8c-2-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d1%8f-%d0%bd\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Animation squelettique (partie 2 &#038; # 8211; hi\u00e9rarchie de n\u0153uds, interpolation)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[49,61,52],"tags":[],"class_list":["post-2747","post","type-post","status-publish","format-standard","hentry","category-blog","category-techie","category-tutorials","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=2747"}],"version-history":[{"count":9,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2747\/revisions"}],"predecessor-version":[{"id":3912,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2747\/revisions\/3912"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=2747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=2747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=2747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}