Angeregt durch zwei Kommentare im vorigen Beitrag, habe ich ein ActionScript-Beispiel zum Thema "Inverse Kinematik" erstellt. Es zeigt, wie man ein Skelett über ActionScript-Code animieren kann.

Beispiel anschauen

Vorbereitungen mit dem Bone-Werkzeug

Ganz ohne Flash IDE geht es nicht. Hier baut man zuerst ein Skelett und gibt ihm einen Instanznamen (meinSkelett). Wichtig: Damit es über ActionScript ansprechbar ist, stellt man "Laufzeit" als "Typ" ein ("Eigenschaften > Optionen > Typ").

Außerdem nenne ich den äußersten Knochen (Bone) meinKnochen.

Hier noch ein Video

Objekt animieren

Im AS-Code schafft man zunächst eine Referenz zum Skelett, dann zum entsprechenden Knochen. Dieser Knochen hat zwei Gelenke. Eines davon ist dem Anfang des Skeletts zugewandt (Anfangsgelenk, headJoint), das andere dem Ende (Endgelenk, tailJoint). Im Beispiel verwende ich das äußere Gelenk.

Um das Skelett zu animieren, kommt ein Objekt der Klasse IKMover zum Einsatz. Es wird mit dem obigen Gelenk und dessen Anfangsposition initialisiert. Beim Bewegen der Maus wird das Gelenk immer auf die aktuelle Mausposition bewegt. Die restlichen Glieder der Kette bewegen sich aufgrund der Skelettstruktur automatisch mit.

Der Code lautet:

Actionscript:
  1. // Skelett von der Bühne anhand des Namens erfassen
  2. var skelett:IKArmature = IKManager.getArmatureByName("meinSkelett");
  3.  
  4. // den Knochen anhand des Namens erfassen (es ist der äußerste Knochen)
  5. var knochen:IKBone = skelett.getBoneByName("meinKnochen");
  6.  
  7. // neues Gelenk mit Endgelenk dieses Knochen initialisieren
  8. var gelenk:IKJoint = knochen.tailJoint;
  9.  
  10. // neues IKMover-Objekt zur Steuerung des Skeletts (init mit Gelenk und Anfangsposition)
  11. var ikMover:IKMover = new IKMover(gelenk, gelenk.position);
  12.  
  13.            
  14. stage.addEventListener (Event.ENTER_FRAME, onClick);
  15.  
  16. function onClick (evt:Event):void {
  17.     // neue Zielkoordinaten anhand der Mausposition
  18.     ikMover.moveTo(  new Point(stage.mouseX, stage.mouseY)  )
  19. }