Zentrales Element des Skeletts sind die Gelenke, die über gedachte Verbindungslinien (virtuelle Knochen) miteinander verbunden sind. Genau wie in der Natur ermöglichen die Gelenke die Bewegung einzelner Knochen oder ganzer Extremitäten, wodurch sich die benötigten Animationsposen modellieren lassen. Wie sich diese Bewegungen dann auf das eigentliche 3D-Modelle übertragen lassen, werden wir zu einem späteren Zeitpunkt besprechen.
Der Aufbau eines Animations-Skeletts lässt sich am besten am Dateiformat verdeutlichen, das unsere beiden Demo-Programme (DemoWithOpenGL_Tut21 sowie DemoWithOpenGL_Tut22) zum Speichern der Skelett-Eigenschaften verwenden:
NumJoints: 41
NonAnimatedJointPositions:
0.070000, 0.720000, 0.050000,
0.070000, 0.720000, -0.050000,
0.000000, 0.810000, 0.000000,
-0.070000, 0.680000, 0.000000,
. . .
-0.010000, -0.380000, -0.120000,
-0.010000, -0.380000, 0.120000,
NumBones: 40
8, 7,
7, 6,
6, 5,
5, 4,
. . .
39, 31,
40, 26,
NumJointHierarchies: 14
NumJoints-Wirbelsaeule+Hals+KopfTeil1: 8
8, 7, 6, 5, 4, 3, 2, 0,
NumJoints-Hals+KopfTeil2: 2
2, 1,
NumJoints-linkeObereRippe: 3
5, 10, 36,
NumJoints-rechteObereRippe: 3
5, 9, 35,
NumJoints-linkeUntereRippe: 2
6, 12,
NumJoints-rechteUntereRippe: 2
6, 11,
NumJoints-rechteSchulter+Arm+HandTeil1: 6
4, 19, 20, 21, 22, 23,
NumJoints-rechtesHandgelenk+HandTeil2: 2
22, 24,
NumJoints-linkeSchulter+Arm+HandTeil1: 6
4, 13, 14, 15, 16, 17,
NumJoints-linkesHandgelenk+HandTeil2: 2
16, 18,
NumJoints-rechtesBecken+Bein+FussTeil1: 7
8, 30, 37, 39, 31, 32, 33,
NumJoints-rechtesFussgelenk+FussTeil2: 2
32, 34,
NumJoints-linkesBecken+Bein+FussTeil1: 7
8, 25, 38, 40, 26, 27, 28,
NumJoints-linkesFussgelenk+FussTeil2: 2
27, 29,
NonAnimatedJointPositions:
0.070000, 0.720000, 0.050000,
0.070000, 0.720000, -0.050000,
0.000000, 0.810000, 0.000000,
-0.070000, 0.680000, 0.000000,
. . .
-0.010000, -0.380000, -0.120000,
-0.010000, -0.380000, 0.120000,
NumBones: 40
8, 7,
7, 6,
6, 5,
5, 4,
. . .
39, 31,
40, 26,
NumJointHierarchies: 14
NumJoints-Wirbelsaeule+Hals+KopfTeil1: 8
8, 7, 6, 5, 4, 3, 2, 0,
NumJoints-Hals+KopfTeil2: 2
2, 1,
NumJoints-linkeObereRippe: 3
5, 10, 36,
NumJoints-rechteObereRippe: 3
5, 9, 35,
NumJoints-linkeUntereRippe: 2
6, 12,
NumJoints-rechteUntereRippe: 2
6, 11,
NumJoints-rechteSchulter+Arm+HandTeil1: 6
4, 19, 20, 21, 22, 23,
NumJoints-rechtesHandgelenk+HandTeil2: 2
22, 24,
NumJoints-linkeSchulter+Arm+HandTeil1: 6
4, 13, 14, 15, 16, 17,
NumJoints-linkesHandgelenk+HandTeil2: 2
16, 18,
NumJoints-rechtesBecken+Bein+FussTeil1: 7
8, 30, 37, 39, 31, 32, 33,
NumJoints-rechtesFussgelenk+FussTeil2: 2
32, 34,
NumJoints-linkesBecken+Bein+FussTeil1: 7
8, 25, 38, 40, 26, 27, 28,
NumJoints-linkesFussgelenk+FussTeil2: 2
27, 29,
Zunächst werden die Positionen der einzelnen Gelenke im Modellkoordinatensystem des 3D-Modells festgelegt. Je besser die Skelett-Proportionen mit dem 3D-Modell übereinstimmen, um so besser sieht die spätere Animation aus.
Im Anschluss daran werden die einzelnen Gelenkverbindungen – die Knochen (Bones) – definiert. Diese Definitionen werden zum einen für die Darstellung des Skeletts benötigt und sind darüber hinaus wichtig, um später die Anbindung der Modellvertices an das Animations-Skelett bestimmen zu können. Hierbei ist zu beachten, dass Gelenk 1 in der Definition ein Dreh- bzw. Beugegelenk ist (ermöglicht die Bewegung des Knochens) und Gelenk 2 ein Endgelenk (dient zur Befestigung des nachfolgenden Knochens).
Im letzten Schritt werden die einzelnen Bewegungsgruppen definiert. Das erste Gelenk (von links) einer Bewegungsgruppe steht dabei immer an der Spitze der Gruppenhierarchie. Nachfolgend ein praktisches Beispiel: Heben sie ihren rechten Arm, dann bewegt sich zunächst ihr Schultergelenk. Die Bewegung des Schultergelenks führt daraufhin zur Bewegung des Ellenbogengelenks und ihrer Hand Beugen sie lediglich ihren Ellenbogen, dann hat diese Bewegung andererseits keinerlei Einfluss auf ihr Schultergelenk. Ellenbogen- und Schultergelenk sind also Teil einer Bewegungsgruppe, wobei die Schulter in der Gruppenhierarchie oberhalb des Ellenbogens steht.
Die Bewegungsgruppen lassen sich ihrerseits ebenfalls in eine Hierarchie einordnen. Bei einem menschlichen Animationsskelett steht diejenige Bewegungsgruppe, die die Bewegung der Wirbelsäule (bzw. des Oberkörpers) beschreibt, stets an der Spitze der Hierarchie und muss demzufolge auch als Erstes definiert werden. Bewegt sich der Oberkörper, dann bewegen sich sowohl Kopf als auch die Schultern und Arme.
In der Natur unterscheidet man zwischen sieben Gelenksystemen, die je nach Aufbau eine unterschiedliche Beweglichkeit ermöglichen. Wir wollen uns hier jedoch mit nur einem Gelenksystem (einem Universalgelenk) begnügen, dessen Beweglichkeit allein vom Animateur bzw. im Rahmen einer physikalischen Simulation von der Physik-Engine bestimmt wird. Ein Universalgelenk zeichnet sich dadurch aus, dass es um drei zueinander senkrechte Achsen frei drehbar ist. Als Drehachsen werden wir zukünftig immer die x-, y- sowie die z-Achse verwenden.
Um die einzelnen Gelenke in einer Animationspose zu beschreiben, bedarf es lediglich der Angabe von drei Gelenkwinkeln für die Drehungen um die jeweiligen Gelenkachsen. Das verwendete Dateiformat ist folglich alles andere als komplex. Wir wollen uns darauf einigen, dass in der Standardpose alle Gelenkwinkel gleich null sind.
NumJoints: 41
JointAngles:
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, -0.170000, 0.000000,
0.000000, -0.300000, 0.000000,
0.000000, 0.000000, 0.000000,
. . .
JointAngles:
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000,
0.000000, -0.170000, 0.000000,
0.000000, -0.300000, 0.000000,
0.000000, 0.000000, 0.000000,
. . .