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