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
[kml_flashembed fversion=“9.0.0″ replaceId=“example“ movie=“/wp-content/uploads/2008/11/inverse-kinematics-as.swf“ targetclass=“flashmovie“ publishmethod=“dynamic“ width=“550″ height=“450″/]
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.
[ad]
Der Code lautet:
[as]
// Skelett von der Bühne anhand des Namens erfassen
var skelett:IKArmature = IKManager.getArmatureByName(„meinSkelett“);
// den Knochen anhand des Namens erfassen (es ist der äußerste Knochen)
var knochen:IKBone = skelett.getBoneByName(„meinKnochen“);
// neues Gelenk mit Endgelenk dieses Knochen initialisieren
var gelenk:IKJoint = knochen.tailJoint;
// neues IKMover-Objekt zur Steuerung des Skeletts (init mit Gelenk und Anfangsposition)
var ikMover:IKMover = new IKMover(gelenk, gelenk.position);
stage.addEventListener (Event.ENTER_FRAME, onClick);
function onClick (evt:Event):void {
// neue Zielkoordinaten anhand der Mausposition
ikMover.moveTo( new Point(stage.mouseX, stage.mouseY) );
}
[/as]
Cool gemacht. Vielen Dank für die Anleitung