Controlling IK with ActionScript

Thursday, November 6th, 2008 | examples

View example
Download .fla and source

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.geom.Matrix;
	import fl.ik.*;
 
	import gs.*;
 
	/**
	 * @author John Lindquist - fp10.org
	 *
	 * note - In your armature layer, remember to set the "type" to "runtime"
	 */
	public class Main extends Sprite 
	{
		private var ikMover:IKMover;
		private var position:Point;
 
		private const MAX_X:Number = 550;
		private const MAX_Y:Number = 400;
 
		public function Main() 
		{
			//wait for the IK to be built before doing anything
			addEventListener(Event.FRAME_CONSTRUCTED, frameConstructedHandler);
		}
 
		private function frameConstructedHandler(event:Event):void
		{
			removeEventListener(Event.FRAME_CONSTRUCTED, frameConstructedHandler);
 
			setupIK();
			setupMotion();
		}
 
		private function setupIK():void
		{
			//dig into the IK structure to get set up a reference to the end position
			var tree:IKArmature = IKManager.getArmatureByName("arm");
			var bone:IKBone = tree.getBoneByName("bone");
			var endEffector:IKJoint = bone.tailJoint;
			position = endEffector.position;
 
			//setup an IKMover for moving the "tail" position
			ikMover = new IKMover(endEffector, position);
			ikMover.limitByDistance=true;
			ikMover.distanceLimit=0.1;
			ikMover.limitByIteration=true;
			ikMover.iterationLimit=10;
		}
 
		private function setupMotion():void
		{
			var targetX:Number = Math.random() * MAX_X;
			var targetY:Number = Math.random() * MAX_Y;
 
			TweenMax.to(tracker, 2, {x:targetX, y:targetY, onUpdate:onTweenUpdate, onComplete:setupMotion});
		}
 
		private function onTweenUpdate():void
		{
			position.x = tracker.x;
			position.y = tracker.y;
 
			ikMover.moveTo(position);
		}
	}
}

No comments yet.

Leave a comment

Categories

Archive

Links

Search