{"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\/de\/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":"Skelettanimation (Teil 2 \u2013 Knotenhierarchie, Interpolation)"},"content":{"rendered":"<p>Ich beschreibe weiterhin den Skelettanimationsalgorithmus, wie er in der Flame Steel Engine implementiert ist.<\/p>\n<p><strong><em>Da der Algorithmus der komplexeste von allen ist, die ich implementiert habe, k\u00f6nnen in den Notizen zum Entwicklungsprozess Fehler auftreten. Im vorherigen Artikel \u00fcber diesen Algorithmus habe ich einen Fehler gemacht; das Array von Knochen wird f\u00fcr jedes Netz separat und nicht f\u00fcr das gesamte Modell an den Shader \u00fcbertragen.<\/em><\/strong><\/p>\n<h3>Knotenhierarchie<\/h3>\n<p>Damit der Algorithmus korrekt funktioniert, ist es notwendig, dass das Modell eine Verbindung zwischen den Knochen untereinander enth\u00e4lt (Grafik). Stellen wir uns eine Situation vor, in der zwei Animationen gleichzeitig abgespielt werden &#8211; Springe und hebe deine rechte Hand. Die Sprunganimation muss das Modell entlang der Y-Achse anheben, w\u00e4hrend die Animation zum Anheben des Arms dies ber\u00fccksichtigen und beim Springen mit dem Modell ansteigen muss, sonst bleibt der Arm von selbst an Ort und Stelle.<\/p>\n<p>Wir werden die Verbindung von Knoten f\u00fcr diesen Fall beschreiben &#8211; Der K\u00f6rper enth\u00e4lt die Hand. Bei der Ausarbeitung des Algorithmus wird der Knochengraph ausgelesen, alle Animationen werden mit den richtigen Verbindungen ber\u00fccksichtigt. Im Speicher des Modells wird das Diagramm getrennt von allen Animationen gespeichert, nur um die Konnektivit\u00e4t der Knochen des Modells widerzuspiegeln.<\/p>\n<h3>Interpolation auf der CPU<\/h3>\n<p>Im letzten Artikel habe ich das Prinzip des Renderns von Skelettanimationen beschrieben &#8211; \u201eTransformationsmatrizen werden bei jedem Rendering-Frame von der CPU an den Shader \u00fcbertragen.\u201c<\/p>\n<p>Jeder Rendering-Frame wird auf der CPU verarbeitet; f\u00fcr jeden Mesh-Bone erh\u00e4lt die Engine die endg\u00fcltige Transformationsmatrix mithilfe von Positionsinterpolation, Drehung und Zoom. W\u00e4hrend der Interpolation der endg\u00fcltigen Knochenmatrix wird f\u00fcr alle aktiven Knotenanimationen ein Durchlauf durch den Knotenbaum durchgef\u00fchrt, die endg\u00fcltige Matrix wird mit den \u00fcbergeordneten Matrix multipliziert und dann zum Rendern an den Vertex-Shader gesendet.<\/p>\n<p>Vektoren werden zur Positionsinterpolation und Vergr\u00f6\u00dferung verwendet; Quaternionen werden zur Rotation verwendet, weil Sie sind im Gegensatz zu Euler-Winkeln sehr einfach zu interpolieren (SLERP) und auch sehr einfach als Transformationsmatrix darzustellen.<\/p>\n<h3>So vereinfachen Sie die Implementierung<\/h3>\n<p>Um das Debuggen des Vertex-Shaders zu vereinfachen, habe ich mithilfe des Makros FSGLOGLNEWAGERENDERER_CPU_BASED_VERTEX_MODS_ENABLED eine Simulation des Vertex-Shaders auf der CPU hinzugef\u00fcgt. Der Grafikkartenhersteller NVIDIA verf\u00fcgt \u00fcber ein Dienstprogramm zum Debuggen von Shader-Code, Nsight. Vielleicht kann es auch die Entwicklung komplexer Vertex-\/Pixel-Shader-Algorithmen vereinfachen, aber ich konnte seine Funktionalit\u00e4t nie ausreichend auf der CPU testen.<\/p>\n<p>Im n\u00e4chsten Artikel m\u00f6chte ich das Mischen mehrerer Animationen beschreiben und die verbleibenden L\u00fccken schlie\u00dfen.<\/p>\n<h3>Quellen<\/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>Ich beschreibe weiterhin den Skelettanimationsalgorithmus, wie er in der Flame Steel Engine implementiert ist. Da der Algorithmus der komplexeste von allen ist, die ich implementiert habe, k\u00f6nnen in den Notizen zum Entwicklungsprozess Fehler auftreten. Im vorherigen Artikel \u00fcber diesen Algorithmus habe ich einen Fehler gemacht; das Array von Knochen wird f\u00fcr jedes Netz separat und<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/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;Skelettanimation (Teil 2 \u2013 Knotenhierarchie, 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":"de","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\/de\/wp-json\/wp\/v2\/posts\/2747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=2747"}],"version-history":[{"count":9,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2747\/revisions"}],"predecessor-version":[{"id":3912,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2747\/revisions\/3912"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}