Werken met IKFlash 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 IKMet 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 termenDe volgende referentielijst bevat belangrijke termen die relevant zijn voor deze functie:
Animaties van IK-armaturen - overzichtGebruik 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. ![]()
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:
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:
Zie het IK-pakket voor een complete en uitgebreide beschrijving van deze klassen. Informatie krijgen over een IK-armatuurEerst 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 beperkenEen 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:
Standaard zijn alle Booleans ingesteld op false. Dat betekent dat de beweging niet wordt beperkt, tenzij u dit expliciet trueopgeeft. 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 verplaatsenDe 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 gebruikenIK 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 gebruikenMet 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); } |
![]() |