Modelle mit Scripten animieren ed
Animiert wird ein Modell (Klasse: Model).
Animationen abspielen ed
Die im Editor erstellten Animationen können auf drei Arten verwendet werden:
Standart-Fall ed
Bei einem neu geladenen Modell wird automatisch die erste Animation als Schleife abgespielt (diejenige, die im Editor den niedrigsten Index hat).
Script ed
Zuerst müssen mit Model.reset_animation() alle bisherigen Animationsdaten des Modells zurückgesetzt werden.
Das eigentliche Animieren geschieht mit Model.animate(). Sollen sich mehrere Animationen überlagern, wird diese Funktion mehrmals mit den Daten der unterschiedlichen Animationen aufgerufen. Man benötigt für jede Animation eine eigene Variable vom Typ float, die speichert, wie weit die Animation schon ist, diese wird an die Funktion übergeben und von dieser weitergezählt.
Wenn sich ein Modell kontinuierlich bewegen soll (was fast immer der Fall ist!), müssen diese Befehle in der Funktion Model.on_iterate() ausgeführt werden.
Beispiel:
class MyModel extends Model
// die Variablen, die den Vortschritt der Animationen speichern
float time_1, time_2
override void on_init()
time_1 = 0
time_2 = 0
override void on_iterate(float dt)
// Animationen abspielen lassen
// Geschwindigkeit des Objektes berechnen
float v = vel.length()
// Zurücksetzen der Animationsdaten
reset_animation()
// erste Animation
animate(MoveOpSet, 0, 0, // alles bisherige überschreiben
23, // Animation mit Index 23
time_1, // wird automatisch weiter gezählt
dt, // in Spielzeit weiter zählen
v, // abhängig von der Geschwindigkeit
true) // als Schleife
// zweite Animation
bool b = animate(MoveOpNewKeyed, 0, 0, // überschreiben, nur wenn es wichtig ist
8, // Animation mit Index 8
time_2,
dt * 0.5, // in halber Spielzeit weiter zählen
0, // unabhängig
false) // einmalig
// Test, ob die 2. Animation zu Ende ist
if b
// ...
Skelett direkt beeinflussen ed
Besitzt ein Modell (Model) ein Skelett, so gibt es den Array Model.bone[], der die aktuelle Ausrichtung (bone.cur_ang, bone.cur_pos) der einzelnen Knochen repräsentiert. Wird Model.begin_edit_animation() ausgeführt, so kann dieser Array direkt durch ein Script beschrieben werden und die Engine verwendet es zur Animation des Modells.
bone.cur_ang ist dabei die Winkel-Ausrichtung der Knochen. bone.cur_pos ist die Positon eine freien Knochens (d.h. er hat keinen übergeordneten Knochen) relativ zur Objektmitte, und wird nur für freie Knochen verwendet!
Sobald Model.reset_animation() ausgeführt wird, werden diese Variablen wieder ignoriert und es können auch wieder vorgefertigte Animationen abgespielt werden.
Beispiel:
class MyModel extends Model
float time
override void on_init()
// wir wollen selbst editieren!
begin_edit_animation()
time = 0
override void on_iterate(float dt)
// alle Knochen beeinflussen
for b in bone
// zugegebenermaßen nicht die sinnvollste Animation
b.cur_ang = quaternion.rotation_v(vector(0, 0, time))
time += dt