ik animation (flash player 10)




import fl.ik.* 
// 스테이지에 등록한 IKArmature 를 등록한다
var doll:IKArmature = IKManager.getArmatureAt(0); 
doll.registerElements(stage);
trace(doll.name);
//bones / 구조물에서 뼈들을 정의
var bone_neck0:IKBone = doll.getBoneByName("ikBone_neck0");
var bone_neck1:IKBone = doll.getBoneByName("ikBone_neck1");
var bone_neck2:IKBone = doll.getBoneByName("ikBone_neck2");
var bone_leg0:IKBone = doll.getBoneByName("ikBone_leg0");
var bone_leg1:IKBone = doll.getBoneByName("ikBone_leg1");
var bone_leg2:IKBone = doll.getBoneByName("ikBone_leg2");
var bone_leg3:IKBone = doll.getBoneByName("ikBone_leg3");
var bone_tail0:IKBone = doll.getBoneByName("ikBone_tail0");
var bone_tail1:IKBone = doll.getBoneByName("ikBone_tail1");
var bone_tail2:IKBone = doll.getBoneByName("ikBone_tail2");
//IKjoints to move / IK 핸들러에 영향을 받을 조인트를 정의
var endJoint_neck0:IKJoint = bone_neck0.tailJoint; 
var endJoint_neck1:IKJoint = bone_neck1.tailJoint; 
var endJoint_neck2:IKJoint = bone_neck2.tailJoint; 
//Position to start / IK 핸들러의 처음 위치를 정한다
var pos_neck0:Point = endJoint_neck0.position; 
var pos_neck1:Point = endJoint_neck1.position; 
var pos_neck2:Point = endJoint_neck2.position; 
//set speed of IKjoint / IK 조인트의 움직임 속도를 정한다.
endJoint_neck0.speed = 100;
endJoint_neck1.speed = 50;
endJoint_neck2.speed = 10;

// IKMovers //영향받을 조인트와 핸들러의 시작포인트로 IKMover 생성
var neck0_mover:IKMover = new IKMover(endJoint_neck0,pos_neck0);
var neck1_mover:IKMover = new IKMover(endJoint_neck1,pos_neck1);
var neck2_mover:IKMover = new IKMover(endJoint_neck2,pos_neck2);
neck0_mover.limitByIteration = true; 
neck0_mover.iterationLimit = 10; 


const pi:Number = Math.PI;
var rad:Number = 0;

var xshift_neck0:Number=0;
var yshift_neck0:Number=0;
var xshift_neck1:Number=0;
var yshift_neck1:Number=0;
var xshift_neck2:Number=0;
var yshift_neck2:Number=0;

this.addEventListener(Event.ENTER_FRAME,rendering);

function rendering(evt:Event):void{
rad += 2;
rad = rad%360;
xshift_neck0 = Math.cos(rad*pi/180)*300;
yshift_neck0 = Math.abs(Math.sin(rad*pi/180))*(-300);
xshift_neck1 += (xshift_neck0 - xshift_neck1)*.1;
yshift_neck1 += (yshift_neck0 - yshift_neck1)*.1;
xshift_neck2 += (xshift_neck1 - xshift_neck2)*.1;
yshift_neck2 += (yshift_neck1 - yshift_neck2)*.1;

pos_neck0.x = xshift_neck0 + ikNode_neck0.x;
pos_neck0.y = yshift_neck0 + ikNode_neck0.y;
pos_neck1.x = xshift_neck1 + ikNode_neck1.x;
pos_neck1.y = yshift_neck1 + ikNode_neck1.y;
pos_neck2.x = xshift_neck2 + ikNode_neck2.x;
pos_neck2.y = yshift_neck2 + ikNode_neck2.y;


        //move position of IK/ IK 핸들러의 위치를 움직인다.
neck0_mover.moveTo(pos_neck0);
neck1_mover.moveTo(pos_neck1);
neck2_mover.moveTo(pos_neck2);
this.graphics.clear();
this.graphics.lineStyle(1,0,1);
this.graphics.moveTo(Point(bone_neck0.tailJoint.position).x,
Point(bone_neck0.tailJoint.position).y);
this.graphics.lineTo(pos_neck0.x,pos_neck0.y);
this.graphics.lineStyle(1,0xf00000,1);
this.graphics.moveTo(Point(bone_neck1.tailJoint.position).x,
Point(bone_neck1.tailJoint.position).y);
this.graphics.lineTo(pos_neck1.x,pos_neck1.y);
this.graphics.lineStyle(1,0xf0f000,1);
this.graphics.moveTo(Point(bone_neck2.tailJoint.position).x,
Point(bone_neck2.tailJoint.position).y);
this.graphics.lineTo(pos_neck2.x,pos_neck2.y);
pos_body.x = mouseX;
pos_body.y = mouseY;
body_mover.moveTo(pos_body);
}

var bone_toNeck:IKBone = doll.getBoneByName("ikBone_toNeck");
var bodyJoint:IKJoint = bone_toNeck.headJoint; 
trace(bone_toNeck.headJoint.name);
var pos_body:Point = bodyJoint.position;
var body_mover:IKMover = new IKMover(bodyJoint,pos_body);

Flash player 10(flash cs4)에 추가된 Ik 애니메이션은 쓰기가 어려운 듯 하다.
스테이지 타임라인상에 등록해서 쓰다보니 Ik로 만든 무비클립을 Loader로 불러서 사용하기도 어렵다. IK 구조물을 액션스크립트로 제어하면 재밌을 꺼라 생각했는데, 만만치 않다.
또한, 마야나 맥스에서 사용되는 IK 핸들러에 대한 이해도 필요하다.
무튼, 전반적으로 일반 클래스를 사용하는 방법과 차이가 있어서 쉽지가 않다는 것.
아직 발전의 여지가 많아보인다.



저작자 표시 비영리 변경 금지