Arbeiten mit inverser Kinematik

Flash Player 10 und höher, Adobe AIR 1.5 und höher, erfordert Flash CS4 oder höher

Die inverse Kinematik (IK) ist eine leistungsstarke Technik zur Erstellung realistischer Bewegungen.

Mithilfe von IK können Sie innerhalb einer Kette verbundener Teile, eines sogenannten IK-Skeletts, koordinierte Bewegungen erstellen, damit die Teile sich realitätsgetreu zusammen bewegen. Das Skelett setzt sich aus Knochen (Bones) und Gelenken zusammen. Ausgehend vom Endpunkt des Skeletts berechnet IK die Winkel der Gelenke, die erforderlich sind, damit der Endpunkt erreicht wird.

Eine manuelle Berechnung dieser Winkel wäre äußerst schwierig. Der große Vorteil dieser Funktion liegt darin, dass Sie Skelette interaktiv mit Adobe® Flash® Professional erstellen können. Anschließend animieren Sie die Skelette mit ActionScript. Die in Flash Professional enthaltene IK-Engine führt die Berechnungen aus, die die Bewegungen des Skeletts beschreiben. Sie können die Bewegung im ActionScript-Code auf bestimmte Parameter beschränken.

Neu in der IK-Version von Flash Professional CS5 ist das Konzept der Bone-Federung, das bisher hauptsächlich von Spezialanwendungen für die Animation angeboten wurde. In Kombination mit dem neuen dynamischen Physikmodul (Physics Engine) ermöglicht dieses Merkmal die Konfiguration von realistischen Bewegungen. Dieser Effekt ist sowohl zur Laufzeit als auch beim Authoring sichtbar.

Zur Erstellung von IK-Skeletten benötigen Sie eine Lizenz für Flash Professional.

Grundlagen der inversen Kinematik

Mit der inversen Kinematik (IK) können Sie realitätsgetreue Animationen erstellen, indem Sie Teile so verbinden, dass sie sich zusammen auf realistische Weise bewegen.

Beispielsweise können Sie mithilfe von IK ein Bein an eine bestimmte Position bewegen, indem Sie die dazu erforderlichen Beingelenkbewegungen nachbilden. IK stützt sich auf eine miteinander verbundene Bone-Struktur, die als IK-Skelett bezeichnet wird. Verwenden Sie das fl.ik -Paket zur Erstellung von Animationen mit realitätsgetreuen Bewegungsabläufen. Mithilfe dieses Pakets können Sie mehrere IK-Skelette nahtlos animieren, ohne dass Sie die Physik der IK-Algorithmen genau verstehen müssen.

Sie erstellen das IK-Skelett mit seinen zugehörigen Bones und Gelenken in Flash Professional. Anschließend können Sie auf die IK-Klassen zugreifen, um das Skelett zur Laufzeit zu animieren.

Ausführliche Anleitungen zur Erstellung eines IK-Skeletts finden Sie im Abschnitt zur inversen Kinematik im Handbuch Verwenden von Flash Professional .

Wichtige Konzepte und Begriffe

In der folgenden Referenzliste sind wichtige Begriffe aufgeführt, die mit dieser Funktion zu tun haben:

Skelett
Eine kinematische Kette aus Bones (Knochen) und Gelenken, die bei der Computeranimation zur Simulation von realistischen Bewegungsabläufen verwendet wird.

Bone
Ein starres Segment in einem Skelett, das sich mit einem Knochen eines Tierskeletts vergleichen lässt.

Inverse Kinematik (IK)
Verfahren zum Bestimmen der Parameter für ein verbundenes flexibles Objekt, das als kinematische Kette oder Skelett bezeichnet wird.

Gelenk
Die Kontaktstelle zweier Knochen (Bones), die die Bewegung der Knochen ermöglicht; analog zum Gelenk eines Tieres.

Physikmodul (Physics Engine)
Ein Paket mit physikalischen Algorithmen, mit denen in Animationen realistische Bewegungen und Aktionen erstellt werden können.

Sprungfeder
Die Bewegung eines Bone als Reaktion auf eine Bewegung des übergeordneten Bone, die sich im Zeitverlauf schrittweise abschwächt.

Animieren von IK-Skeletten – Überblick

Nach der Erstellung eines IK-Skeletts in Flash Professional verwenden Sie die fl.ik -Klassen, um die Bewegung einzuschränken, die Ereignisse zu verfolgen und das Skelett zur Laufzeit zu animieren.

Die folgende Abbildung zeigt einen Movieclip namens Wheel. Bei der Achse handelt es sich um eine Instanz eines IK-Skeletts namens Axle . Die IKMover-Klasse bewegt das Skelett synchron mit der Drehung des Rades. Der IK-Bone ikBone2 des Skeletts ist am Rückgelenk mit dem Rad verbunden.

A.
Rad

B.
Achse

C.
ikBone2

Zur Laufzeit dreht sich das Rad gemäß dem Bewegungs-Tween __motion_Wheel , das unter Beschreiben der Animation erläutert wird Ein IKMover-Objekt initialisiert und steuert die Bewegung der Achse. Die folgende Abbildung zeigt zwei Schnappschüsse des Achsenskeletts, das jeweils an unterschiedlichen Positionen am sich drehenden Rad angefügt ist.

IK-Skelett in Bewegung an zwei verschiedenen Positionen
Zur Laufzeit führt der folgende ActionScript-Code diese Aufgaben aus:
  • Abrufen von Informationen über das Skelett und seine Komponenten

  • Instanziieren eines IKMover-Objekts

  • Bewegen der Achse zusammen mit der Drehung des Rads

import fl.ik.* 
 
var tree:IKArmature = IKManager.getArmatureByName("Axle"); 
var bone:IKBone = tree.getBoneByName("ikBone2"); 
var endEffector:IKJoint = bone.tailJoint; 
var pos:Point = endEffector.position; 
 
var ik:IKMover = new IKMover(endEffector, pos); 
ik.limitByDistance = true; 
ik.distanceLimit = 0.1; 
ik.limitByIteration = true; 
ik.iterationLimit = 10; 
 
Wheel.addEventListener(Event.ENTER_FRAME, frameFunc); 
 
function frameFunc(event:Event) 
{ 
    if (Wheel != null) 
    { 
        var mat:Matrix = Wheel.transform.matrix; 
        var pt = new Point(90, 0); 
        pt = mat.transformPoint(pt); 
         
        ik.moveTo(pt); 
    } 
}

Zur Bewegung der Achse werden die folgenden IK-Klassen verwendet:

  • IKArmature: beschreibt das aus Bones (Knochen) und Gelenken bestehende Skelett; muss in Flash Professional erstellt werden.

  • IKManager: Container-Klasse für alle IK-Skelette im Dokument; muss in Flash Professional erstellt werden.

  • IKBone: ein Segment eines IK-Skeletts.

  • IKJoint: eine Verbindung zwischen zwei IK-Bones.

  • IKMover: initialisiert und steuert die Bewegungen von IK-Skeletten.

Ausführliche Erläuterungen dieser Klassen finden Sie in der Beschreibung zum ik-Paket .

Abrufen von Informationen über IK-Skelette

Zunächst deklarieren Sie Variablen für das Skelett, den Bone und das Gelenk, aus denen die zu bewegenden Strukturen bestehen.

Im folgenden Code wird die getArmatureByName() -Methode der IKManager-Klasse verwendet, um den Wert der Axle-Struktur der IKArmature-Variablen tree zuzuweisen. Das Axle-Skelett wurde zuvor mit Flash Professional erstellt.

var tree:IKArmature = IKManager.getArmatureByName("Axle");

Ähnlich wird im folgenden Code die getBoneByName() -Methode der IKArmature-Klasse verwendet, um der IKBone-Variablen den Wert des Bones ikBone2 zuzuweisen.

var bone:IKBone = tree.getBoneByName("ikBone2");

Das Rückgelenk des Bones ikBone2 ist der Teil des Skeletts, der an das Drehrad angefügt wird.

Die folgende Codezeile deklariert die Variable endEffector und weist ihr die tailjoint -Eigenschaft des Bones ikBone2 zu:

var endEffector:IKJoint = home.tailjoint;
In der Variablen pos wird die aktuelle Position des endEffector -Gelenks gespeichert.
var pos:Point = endEffector.position;

In diesem Beispiel ist pos die Position des Gelenks am Ende der Achse und am Verbindungspunkt mit dem Rad. Der ursprüngliche Wert dieser Variablen stammt aus der position -Eigenschaft von IKJoint.

Instanziieren eines IKMover-Objekts und Einschränken seiner Bewegung

Die Achse wird von einer Instanz der IKMover-Klasse bewegt.

Mit der folgenden Codezeile wird das IKMover-Objekt ik instanziiert. Dabei werden das zu bewegende Element und der Startpunkt der Bewegung an den Konstruktor übergeben:
var ik:IKMover = new IKMover(endEffector, pos);

Mit den Eigenschaften der IKMover-Klasse können Sie die Bewegung eines Skeletts einschränken. Die Bewegung lässt sich nach Entfernung, Iterationen und Zeit der Bewegung einschränken.

Diese Einschränkungen werden mit den folgenden Eigenschaftspaaren erzwungen. Die Paare bestehen aus einem booleschen Wert, der angibt, ob die Bewegung eingeschränkt ist, und aus einer Ganzzahl, die die Einschränkung definiert:

Boolean-Eigenschaft

Integer-Eigenschaft

Festgelegte Beschränkung

limitByDistance:Boolean

distanceLimit:int

Legt die maximale Entfernung der Bewegung in Pixel fest, die das IK-Modul bei jeder Iteration durchführt.

limitByIteration:Boolean

iterationLimit:int

Legt die maximale Anzahl der Iterationen fest, die das IK-Modul für jede Bewegung durchführt.

limitByTime:Boolean

timeLimit:int

Legt die maximale Zeit in Millisekunden fest, die dem IK-Modul zur Durchführung der Bewegung zur Verfügung steht.

Standardmäßig sind alle Boolean-Eigenschaften auf false eingestellt, die Bewegung ist also nicht eingeschränkt, sofern Sie nicht explizit einen Boolean-Wert auf true festlegen. Um eine Beschränkung festzulegen, setzen Sie die jeweilige Eigenschaft auf true und geben Sie einen Wert für die entsprechende Integer-Eigenschaft an. Wenn Sie die Einschränkung auf einen Wert festlegen, ohne jedoch die entsprechende Boolean-Eigenschaft festzulegen, wird die Einschränkung ignoriert. In diesem Fall wird das Objekt vom IK-Modul weiter bewegt, bis eine andere Einschränkung oder die Zielposition des IKMover-Objekts erreicht wird.

Im folgenden Beispiel ist die maximale Entfernung der Skelettbewegung auf 0,1 Pixel pro Iteration eingestellt. Die maximale Anzahl an Iterationen für jede Bewegung beträgt 10.
ik.limitByDistance = true; 
ik.distanceLimit = 0.1; 
ik.limitByIteration = true; 
ik.iterationLimit = 10; 

Bewegen eines IK-Skeletts

IKMover bewegt die Achse innerhalb des Ereignis-Listeners für das Rad. Bei jedem enterFrame-Ereignis des Rades wird eine neue Zielposition für das Skelett berechnet. Unter Verwendung seiner moveTo() -Methode bewegt das IKMover-Objekt das Rückgelenk an die Zielposition oder so weit wie innerhalb der Einschränkungen möglich, die von den Eigenschaften limitByDistance , limitByIteration und limitByTime vorgegeben sind.
Wheel.addEventListener(Event.ENTER_FRAME, frameFunc); 
 
function frameFunc(event:Event) 
{ 
    if (Wheel != null) 
    { 
        var mat:Matrix = Wheel.transform.matrix; 
        var pt = new Point(90,0); 
        pt = mat.transformPoint(pt); 
         
        ik.moveTo(pt); 
    } 
} 

Verwenden von Federn

Die inverse Kinematik in Flash Professional CS5 unterstützt die Bone-Federung. Die Bone-Federung kann beim Authoring festgelegt werden. Attribute für Bone-Federn können zur Laufzeit hinzugefügt oder geändert werden. Die Spring-Eigenschaft gilt für einen Bone und seine Gelenke. Sie hat zwei Attribute: IKJoint.springStrength definiert die Stärke der Federung, während IKJoint.springDamping der Federungsstärke einen Widerstand entgegensetzt und sich auf die Abschwächung der Federung auswirkt.

Die Federungsstärke hat einen Wert von 0-100 %. Beim Standardwert 0 wird eine völlig starre Feder verwendet, während beim Wert 100 eine sehr lose Feder angewendet wird, die durch physikalische Eigenschaften gesteuert wird. Bones mit Federn reagieren auf die Bewegung ihrer Gelenke. Wenn keine andere Versetzung (Drehung in x- oder y-Richtung) aktiviert ist, haben die Federeinstellungen keine Auswirkungen.

Die Federdämpfung hat einen Wert von 0-100 %. Beim Standardwert 0 wird kein Widerstand angewendet, während beim Wert 100 eine starke Dämpfung auf die Feder wirkt. Die Dämpfung wirkt sich darauf aus, wie lange es dauert, bis ein Bone nach dem Bewegungsanfang zur Ruheposition zurückkehrt.

Anhand der IKArmature.springsEnabled -Eigenschaft können Sie überprüfen, ob Federn für ein IKArmature-Objekt aktiviert sind. Die anderen Federeigenschaften und -methoden gehören zu individuellen IKJoint-Objekten. Ein Gelenk kann für eine Winkeldrehung und für das Versetzen entlang der x- und y-Achsen aktiviert werden. Der Drehungswinkel für eine Gelenkfeder kann über IKJoint.setSpringAngle festgelegt werden, die Versatzposition über IKJoint.setSpringPt .

In diesem Beispiel wird ein Bone anhand seines Namens ausgewählt und die tailJoint-Eigenschaft wird identifiziert. Der Code testet das übergeordnete Skelett, um festzustellen, ob Federn aktiviert sind. Dann werden die Federeigenschaften für das Gelenk festgelegt.

var arm:IKArmature = IKManager.getArmatureAt(0); 
var bone:IKBone = arm.getBoneByName("c"); 
var joint:IKJoint = bone.tailJoint; 
if (arm.springsEnabled) { 
    joint.springStrength = 50; //medium spring strength 
    joint.springDamping = 10; //light damping resistance 
    if (joint.hasSpringAngle) { 
        joint.setSpringAngle(30); //set angle for rotational spring 
    } 
}

Verwenden von IK-Ereignissen

Mithilfe der IKEvent-Klasse können Sie ein Ereignisobjekt erstellen, das Informationen über IK-Ereignisse enthält. IKEvent-Informationen beschreiben Bewegungen, die beendet wurden, da die angegebene Einschränkung der Zeit, Entfernung oder Iterationsanzahl erreicht wurden.

Das folgende Codebeispiel zeigt einen Ereignis-Listener und eine Ereignisprozedur zur Verfolgung von Ereignissen, die sich auf eine zeitliche Einschränkung beziehen. Diese Ereignisprozedur liefert Informationen zu Zeit, Entfernung, Iterationsanzahl und Gelenkeigenschaften eines Ereignisses, das ausgelöst wird, wenn das Zeitlimit des IKMover-Objekts überschritten wird.

var ikmover:IKMover = new IKMover(endjoint, pos); 
ikMover.limitByTime = true; 
ikMover.timeLimit = 1000; 
 
ikmover.addEventListener(IKEvent.TIME_LIMIT, timeLimitFunction); 
 
function timeLimitFunction(evt:IKEvent):void 
{ 
    trace("timeLimit hit"); 
    trace("time is " + evt.time); 
    trace("distance is " + evt.distance); 
    trace("iterationCount is " + evt.iterationCount); 
    trace("IKJoint is " + evt.joint.name); 
}