Werken met IK

Flash Player 10 en hoger, Adobe AIR 1.5 en hoger, vereist Flash CS4 of hoger

IK (Inverse kinematics, Omgekeerde bewegingen) is een prachtige techniek voor het creëren van natuurlijke beweging.

Met IK kunt u gecoördineerde bewegingen maken binnen een keten van verbonden onderdelen, een zogenaamde IK-armatuur, zodat de onderdelen samen bewegen als op een natuurlijke manier. De onderdelen van de armatuur worden de beenderen en gewrichten genoemd. Aan de hand van het eindpunt van de armatuur berekent IK de hoeken voor de gewrichten die nodig zijn om dat eindpunt te bereiken.

Het handmatig berekenen van deze hoeken zou een hele opgave zijn. Het mooie van deze functie is dat u interactief armaturen kunt maken met Adobe® Flash® Professional. Daarna kunt u ze laten bewegen met ActionScript. Het IK-systeem dat in Flash Professional voor het schrijven van programmacode is opgenomen, voert de berekeningen uit die de beweging van de armatuur beschrijven. U kunt de beweging beperken tot bepaalde parameters in uw ActionScript-code.

In de Flash Professional CS5-versie van IK wordt boonvering geïntroduceerd, een functie die meestal wordt aangetroffen in geavanceerde animatietoepassingen. In combinatie met de nieuwe, dynamische fysische engine kunt u zo levensechte bewegingen configureren. En het effect is zowel tijdens runtime zichtbaar als tijdens de ontwerpfase.

U moet een licentie voor Flash Professional hebben om IK-armaturen te maken.

Basisinformatie over IK

Met IK kunt u natuurlijke bewegingen maken door onderdelen zo aan elkaar te koppelen dat ze op een realistische wijze ten opzichte van elkaar bewegen.

Met IK kunt u bijvoorbeeld één been naar een bepaalde positie verplaatsen door de bewegingen van de gewrichten in het been te construeren die nodig zijn om de gewenste houding te verkrijgen. IK gebruikt een framework van beenderen die aan elkaar zijn gekoppeld in een structuur die een IK-armatuur wordt genoemd. Het pakket fl.ik helpt u bij het maken van natuurlijke bewegingen. Hiermee kunt u meerdere IK-armaturen naadloos laten bewegen, zonder dat u veel kennis hoeft te hebben van de natuurkundige facetten achter de IK-algoritmen.

Maak de IK-armatuur met de hulpbeenderen en -gewrichten in Flash Professional. Daarna kunt u de IK-klassen benaderen om deze tijdens de runtime te animeren.

Raadpleeg de sectie IK gebruiken in Flash Professional gebruiken voor gedetailleerde instructies over het maken van een IK-armatuur.

Belangrijke concepten en termen

De volgende referentielijst bevat belangrijke termen die relevant zijn voor deze functie:

Armatuur
Een bewegingsketen, bestaande uit beenderen en gewrichten, die in een computeranimatie wordt gebruikt om realistische bewegingen te simuleren.

Bone
Een star segment in een armatuur, te vergelijken met een bot in een skelet.

IK (Inverse kinematics ofwel omgekeerde bewegingen)
Het bepalen van de parameters van een samengevoegd flexibel object, dat een bewegingsketen of armatuur wordt genoemd.

Gewricht
De plaats waar twee beenderen elkaar raken, geconstrueerd om beweging van de beenderen mogelijk te maken; te vergelijken met een gewricht in een lichaam.

Fysische engine
Een pakket met fysische algoritmen die worden gebruikt om de bewegingen van animaties levensecht te laten overkomen.

Veer
De eigenschap dat een been, wanneer het bovenliggende been wordt bewogen, beweegt en reageert De beweging vermindert naar verloop van tijd.

Animaties van IK-armaturen - overzicht

Gebruik na het maken van een IK-armatuur de fl.ik -klassen om de beweging te beperken, gebeurtenissen te volgen en de armatuur tijdens de runtime te animeren.

In de volgende afbeelding ziet u het filmfragment Wheel. De as is een instantie van een IKArmature met de naam Axle . De klasse IKMover beweegt de armatuur synchroon met de rotatie van het wiel. De IKBone, ikBone2 , in de armatuur is via het eindgewricht aan het wiel gekoppeld.

A.
Wiel

B.
As

C.
ikBone2

Tijdens de runtime draait het wiel gekoppeld aan de bewegingstween __motion_Wheel die is beschreven in Animaties beschrijven . Een IKMover-object initieert en bestuurt de beweging van de as. In de volgende afbeelding ziet u twee momentopnamen van de asarmatuur, gekoppeld aan het draaiende wiel, in verschillende frames in de rotatie.

Bewegende IK-armatuur in twee verschillende posities
Tijdens de runtime zal het volgende ActionScript:
  • informatie ophalen over de armatuur en de componenten daarvan;

  • een IKMover-object instantiëren;

  • de as samen met de rotatie van het wiel bewegen.

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); 
    } 
}

De volgende IK-klassen worden gebruikt om de as te bewegen:

  • IKArmature: beschrijft de armatuur, een boomstructuur die uit beenderen en gewrichten bestaat; moet in Flash Professional zijn gemaakt

  • IKManager: containerklasse voor alle IK-armaturen in het document; moet in Flash Professional zijn gemaakt.

  • IKBone: een segment van een IK-armatuur

  • IKJoint: een verbinding tussen twee IK-beenderen

  • IKMover: initieert en bestuurt de IK-beweging van armaturen

Zie het IK-pakket voor een complete en uitgebreide beschrijving van deze klassen.

Informatie krijgen over een IK-armatuur

Eerst declareert u variabelen voor de armatuur, het been en het gewricht waaruit de onderdelen bestaan die u wilt laten bewegen.

In de volgende code wordt de methode getArmatureByName() van de klasse IKManager gebruikt om de waarde van de Axle-armatuur toe te kennen aan de IKArmature-variabele tree . De Axle-armatuur is eerder met Flash Professional gemaakt.

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

Evenzo wordt in de volgende code de methode getBoneByName() van de klasse IKArmature gebruikt om aan de IKBone-variabele de waarde van het been ikBone2 toe te kennen.

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

Het eindgewricht van het been ikBone2 is het onderdeel van de armatuur dat aan het draaiende wiel wordt vastgemaakt.

Op de volgende regel wordt de variabele endEffector gedeclareerd en krijgt deze de waarde van de eigenschap tailjoint van het been ikBone2 :

var endEffector:IKJoint = home.tailjoint;
De variabele pos is een punt dat de huidige positie van het gewricht endEffector bevat.
var pos:Point = endEffector.position;

In dit voorbeeld is pos de positie van het gewricht aan het einde van de as, waar deze aan het wiel is gekoppeld. De oorspronkelijke waarde van deze variabele is verkregen uit de eigenschap position van de IKJoint.

IK-bewegingsobjecten instantiëren en de beweging beperken

Een instantie van de klasse IKMover laat de as bewegen.

Op de volgende regel wordt het IKMover-object ik geïnstantieerd en worden aan de constructor van dit object het te bewegen object en het beginpunt van de beweging doorgegeven:
var ik:IKMover = new IKMover(endEffector, pos);

Met de eigenschappen van de klasse IKMover kunt u de beweging van een armatuur beperken. U kunt een beweging beperken op basis van afstand, herhalingen en de tijd van de beweging.

Met de volgende eigenschappenparen worden deze beperkingen afgedwongen. De paren bestaan uit een Boolean die aangeeft of de beweging wordt beperkt, en een getal dat de beperking opgeeft:

Boolean-eigenschap

Integer-eigenschap

Limit-instelling

limitByDistance:Boolean

distanceLimit:int

Stelt de maximumafstand in pixels in die de IK-engine voor elke herhaling aflegt.

limitByIteration:Boolean

iterationLimit:int

Stelt het maximum aantal herhalingen in dat de IK-engine voor elke beweging uitvoert.

limitByTime:Boolean

timeLimit:int

Stelt de maximumtijd in milliseconden in die aan het IK-systeem is toegekend om de beweging uit te voeren.

Standaard zijn alle Booleans ingesteld op false . Dat betekent dat de beweging niet wordt beperkt, tenzij u dit expliciet true opgeeft. Om een beperking wilt afdwingen, stelt u de gerelateerde eigenschap in op true en geeft u een waarde op voor de gerelateerde integer-eigenschap. Als u de beperking op een waarde instelt zonder de corresponderende Boolean in te stellen, wordt de beperking genegeerd. In dat geval blijft de IK-engine het object bewegen tot een andere beperking of de doelpositie van de IKMover is bereikt.

In het volgende voorbeeld is de maximumafstand van de armatuurbeweging ingesteld op 0,1 pixel per herhaling. Het maximum aantal herhalingen voor elke beweging is ingesteld op tien.
ik.limitByDistance = true; 
ik.distanceLimit = 0.1; 
ik.limitByIteration = true; 
ik.iterationLimit = 10; 

IK-armaturen verplaatsen

De IKMover beweegt de as binnen de gebeurtenislistener voor het wiel. Bij elke enterFrame-gebeurtenis van het wiel wordt een nieuwe doelpositie voor de armatuur berekend. Met de methode moveTo() beweegt de IKMover het eindgewricht naar de doelpositie of zover mogelijk binnen de beperkingen die zijn ingesteld met de eigenschappen limitByDistance , limitByIteration en limitByTime .
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); 
    } 
} 

Vering gebruiken

IK biedt in Flash Professional CS5 bovendien ondersteuning voor beenvering. Beenvering kan tijdens de ontwerpfase worden ingesteld en kenmerken voor beenvering kunnen tijdens runtime worden toegevoegd of gewijzigd. De vering is een eigenschap van een been en de gewrichten van dit been. De vering heeft twee kenmerken, namelijk IKJoint.springStrength en IKJoint.springDamping . Door het eerste kenmerk wordt de hoeveelheid vering ingesteld en door het tweede kenmerk wordt weerstand aan de hoeveelheid vering toegevoegd. Het tweede kenmerk wijzigt eveneens de snelheid waarmee de vering vermindert.

De hoeveelheid vering is een procentuele waarde, variërend van de standaardinstelling 0 (totaal onbuigzaam) tot 100 (bijzonder flexibel en bestuurd door fysica). Benen met vering reageren op de beweging van het bijbehorende gewricht. Als er geen andere translatie is ingesteld (rotatie, x of y), hebben de veringsinstellingen geen effect.

De demping is een procentuele waarde, variërend van de standaardinstelling 0 (geen weerstand) tot 100 (bijzonder sterke weerstand). De demping verandert de hoeveelheid tijd tussen de eerste beweging van een been en het moment waarop het been weer terugkeert in de ruststand.

U kunt zien of veringen geschikt zijn voor een IKArmature-object door de eigenschap IKArmature.springsEnabled van het object te controleren. De andere veringseigenschappen en -methoden horen bij afzonderlijke IKJoint-objecten. Een gewricht kan geschikt worden gemaakt voor hoekrotatie en translatie langs de x- en y-assen. U kunt de veringshoek van een roterend gewricht positioneren met IKJoint.setSpringAngle en de veringspositie van een translerend gewricht met IKJoint.setSpringAngle .

In dit voorbeeld wordt een been op naam geselecteerd en wordt de tailJoint van het been geïdentificeerd. De code controleert de bovenliggende armatuur om te zien of veringen zijn ingeschakeld en stelt vervolgens veringseigenschappen voor het gewricht in.

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 
    } 
}

IK-gebeurtenissen gebruiken

Met de klasse IKEvent kunt u een gebeurtenisobject maken dat informatie over IK-gebeurtenissen bevat. IKEvent-gegevens beschrijven beweging die is beëindigd omdat de opgegeven beperking voor tijd, afstand of herhaling is overschreden.

De volgende code illustreert een gebeurtenislistener en -handler voor het bijhouden van tijdbeperkingsgebeurtenissen. Deze gebeurtenishandler brengt rapport uit over de tijd, de afstand, het aantal herhalingen en de gewrichten van een gebeurtenis die wordt geactiveerd wanneer de tijdbeperking voor de IKMover is overschreden.

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); 
}