GameDev.net beschreibt in einem am 26. Februar 2014 veröffentlichten Tutorial die Animation von Skinned Meshes mit Matrizen. Der Ansatz richtet sich an Anwendungen, die bereits importierte Modelle animieren. Modellierung, Rigging und Export bleiben außerhalb des behandelten Ablaufs.
Im Mittelpunkt steht eine Hierarchie aus Frames oder Knochen. Jeder Frame enthält unter anderem seine lokale Transformationsmatrix, die Verbindung zum übergeordneten Frame und Verweise auf Kindknoten. So kann eine Änderung am Root-Frame auf die gesamte Hierarchie wirken, während eine Rotation am Unterarm nur die nachfolgenden Knoten beeinflusst.
SRT-Transformationen in der Knochenhierarchie
Die Abkürzung SRT steht für Scale, Rotation und Translation. Die Reihenfolge der Matrixmultiplikationen hängt von der verwendeten Grafik-API ab. Das Tutorial stellt die Berechnung für DirectX mit Zeilenvektoren der üblichen OpenGL-Darstellung mit Spaltenvektoren gegenüber. Das Ergebnis bleibt eine skalierte, gedrehte und verschobene Position, die Reihenfolge der Operationen muss aber zur API passen.
Für jeden Frame wird zunächst eine Matrix vom lokalen Raum bis zum Root-Frame berechnet. Animationsdaten liegen davon getrennt vor. Ein Datensatz kann damit mehrere Bewegungsabläufe wie Gehen oder Laufen auf derselben Knochenhierarchie verwenden.
Offset-Matrix und finale Transformation
Damit sich ein Vertex korrekt mit einem Einflussknochen bewegt, muss er zunächst aus der Ruhepose in den Raum des Knochens übertragen werden. Dafür dient die Offset-Matrix. Sie basiert auf den unveränderten Posedaten und kann deshalb einmal berechnet und anschließend in jedem Renderzyklus wiederverwendet werden.
Die animierte Matrix beschreibt anschließend die aktuelle Bewegung des Frames. Aus Offset-Matrix und animierter Transformation entsteht die finale Matrix für jeden Einflussknochen. Der Renderer verwendet diese Matrizen, um die Vertexposition aus dem Knochenraum zurück in den animierten Root-Raum zu überführen.
Gewichtete Vertexdaten im Renderer
Ein Vertex kann von mehreren Knochen beeinflusst werden. Für jeden Einfluss werden ein Vertexindex und ein Gewicht gespeichert. Die Gewichte müssen zusammen den Wert eins ergeben, damit die gewichtete Summe der transformierten Positionen eine konsistente Deformation ergibt. Dieser Rechenschritt lässt die Oberfläche beim Bewegen der Knochen weich verformen.
Das Tutorial führt von der Datenstruktur über die Berechnung der Matrizen bis zur Übergabe an den Shader. Die Verbindung von Hierarchie, Vertexgewichten und Matrixmathematik ergänzt damit ältere technische Beiträge zur Spieleprogrammierung mit SIMD-Mathematik.
