역기구학을 사용한 작업

Flash Player 10 이상, Adobe AIR 1.5 이상, Flash CS4 이상 필요

역기구학(IK)은 실감나는 모션을 만들기 위한 뛰어난 기술입니다.

IK를 사용하면 IK 뼈대라고 하는 연결 부분의 체인 내에서 좌표가 지정된 움직임을 만들 수 있으므로 해당 부분들이 실제처럼 함께 이동합니다. 뼈대는 뼈와 연결점으로 구성됩니다. 뼈대의 끝점을 지정하면 IK는 해당 끝점에 도달하는 데 필요한 연결점 각도를 계산합니다.

이러한 각도를 직접 계산하기는 어렵습니다. 이 기능의 장점은 Adobe® Flash® Professional을 사용하여 뼈대를 대화식으로 만들 수 있다는 것입니다. 그런 다음 ActionScript를 사용하여 뼈대에 애니메이션 효과를 적용할 수 있습니다. Flash Professional에 포함된 IK 엔진은 뼈대의 움직임을 나타내기 위한 계산을 수행합니다. ActionScript 코드에서는 몇 가지 매개 변수로 움직임을 제한할 수 있습니다.

Flash Professional CS5 버전의 IK에는 뼈 반동 개념이 새로 포함되었습니다. 이 개념은 일반적으로 고성능 애니메이션 응용 프로그램과 관련됩니다. 이 기능을 새로운 동적 물리 엔진과 함께 사용하면 실제와 같은 움직임을 구성할 수 있습니다. 또한 이 효과는 런타임 및 제작 중에도 볼 수 있습니다.

역기구학 뼈대를 만들려면 Flash Professional 라이센스가 있어야 합니다.

역기구학의 기초

역기구학(IK)을 사용하면 여러 부분이 서로 유기적으로 실감나게 움직이도록 각 부분을 연결하여 실제적인 애니메이션을 만들 수 있습니다.

예를 들어 IK를 사용하면 원하는 포즈를 만드는 데 필요한 다리의 관절 움직임을 구조화하여 다리를 특정 위치로 이동할 수 있습니다. IK에서는 여러 개의 뼈가 IK 뼈대라는 하나의 구조로 서로 연결된 구성을 사용합니다. fl.ik 패키지는 실제 모션과 비슷한 애니메이션을 만드는 데 유용합니다. 이 패키지를 사용하면 IK 알고리즘의 기반이 되는 물리학적 지식이 많지 않아도 무리 없이 여러 IK 뼈대에 애니메이션을 적용할 수 있습니다.

Flash Professional을 사용하여 보조 뼈와 연결점이 있는 IK 뼈대를 만듭니다. 그런 다음 IK 클래스에 액세스하여 런타임에 IK 뼈대에 애니메이션을 적용할 수 있습니다.

IK 뼈대를 만드는 방법에 대한 자세한 내용은 Flash Professional 사용 의 "역기구학 사용" 단원을 참조하십시오.

중요한 개념 및 용어

이 기능과 관련된 중요한 용어들이 아래 참조 목록에 정리되어 있습니다.

뼈대
실감나는 모션을 시뮬레이션하기 위해 컴퓨터 애니메이션에 사용되는 뼈와 연결점으로 구성된 기구학 체인입니다.

뼈대의 딱딱한 부분으로, 동물 뼈대의 뼈와 비슷합니다.

역기구학(IK)
기구학 체인 또는 뼈대라고 하는 유연한 연결 객체의 매개 변수를 결정하는 프로세스입니다.

연결점
두 개의 뼈가 연결되는 위치에서 뼈의 움직임이 가능하도록 구성된 연결 부분으로, 동물의 관절과 비슷합니다.

물리 엔진
애니메이션에 실제와 같은 동작을 제공하기 위해 사용되는 물리 관련 알고리즘의 모음입니다.

반동
상위 뼈대가 이동할 때 이동 및 반응하고 시간이 지날수록 점차 사라지는 뼈대의 품질입니다.

IK 뼈대 애니메이션 개요

Flash Professional에서 IK 뼈대를 만든 후에는 fl.ik 클래스를 사용하여 움직임을 제한하고 이벤트를 추적하며 런타임에 움직임을 애니메이션 처리합니다.

다음 그림에서는 Wheel 이라는 동영상 클립을 보여 줍니다. 축은 Axle 이라는 IKArmature 인스턴스입니다. IKMover 클래스는 바퀴의 회전에 맞춰 뼈대를 움직입니다. 뼈대의 IKBone인 ikBone2 는 꼬리 연결점에서 바퀴에 연결됩니다.

A.
Wheel

B.
Axle

C.
ikBone2

런타임에 바퀴는 애니메이션 설명 에서 설명한 애니메이션 설명 모션 트윈과 연관되어 회전합니다. IKMover 객체는 축의 움직임을 시작하고 제어합니다. 다음 그림에서는 회전하는 바퀴에 연결된 축 뼈대의 스냅샷 두 개를 각기 다른 회전 프레임으로 보여 줍니다.

서로 다른 두 위치에서 본 IK 뼈대의 움직임
런타임에 다음 ActionScript가 수행하는 작업은 아래와 같습니다.
  • 뼈대 및 해당 구성 요소에 대한 정보 얻기

  • IKMover 객체 인스턴스화

  • 바퀴의 회전과 함께 축 이동

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

축을 이동하는 데 사용되는 IK 클래스는 다음과 같습니다.

  • IKArmature: 뼈와 연결점으로 구성된 트리 구조의 뼈대를 나타내며, Flash Professional을 사용하여 만들어야 합니다.

  • IKManager: 문서의 모든 IK 뼈대에 대한 컨테이너 클래스로서, Flash Professional을 사용하여 만들어야 합니다.

  • IKBone: IK 뼈대의 한 부분입니다.

  • IKJoint: 두 개의 IK 뼈가 연결되는 부분입니다.

  • IKMover: 뼈대의 IK 움직임을 시작하고 제어합니다.

이러한 클래스에 대한 모든 자세한 내용은 ik 패키지 를 참조하십시오.

IK 뼈대에 대한 정보 얻기

먼저 움직일 부분을 구성하는 뼈대, 뼈 및 연결점에 대한 변수를 선언합니다.

다음 코드에서는 IKManager 클래스의 getArmatureByName() 메서드를 사용하여 IKArmature의 tree 변수에 Axle 뼈대의 값을 할당합니다. Axle 뼈대는 Flash Professional을 사용하여 이미 만들어졌습니다.

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

마찬가지로 다음 코드에서는 IKArmature 클래스의 getBoneByName() 메서드를 사용하여 IKBone 변수에 ikBone2 뼈의 값을 할당합니다.

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

ikBone2 뼈의 꼬리 연결점은 뼈대에서 회전하는 바퀴에 연결되는 부분입니다.

다음 행에서는 endEffector 변수를 선언한 다음 ikBone2 뼈의 tailjoint 속성에 이 변수를 할당합니다.

var endEffector:IKJoint = home.tailjoint;
pos 변수는 endEffector 연결점의 현재 위치를 저장하는 부분입니다.
var pos:Point = endEffector.position;

이 예제에서 pos 는 연결점이 축의 끝에서 바퀴에 연결되는 위치입니다. 이 변수의 원래 값은 IKJoint의 position 속성에서 가져옵니다.

IK Mover 인스턴스화 및 움직임 제한

IKMover 클래스의 인스턴스는 축을 움직입니다.

다음 행에서는 IKMover 객체 ik 를 인스턴스화하고 해당 생성자에 이동할 요소와 이동 시작점을 전달합니다.
var ik:IKMover = new IKMover(endEffector, pos);

IKMover 클래스의 속성을 사용하면 뼈대의 움직임을 제한할 수 있습니다. 움직임의 거리, 반복 수 및 시간에 따라 움직임을 제한할 수 있습니다.

다음 속성 쌍은 이러한 제한을 적용합니다. 이 속성 쌍은 움직임이 제한되는지 여부를 나타내는 Boolean 값과 제한 정도를 지정하는 정수로 구성됩니다.

Boolean 속성

Integer 속성

제한 설정

limitByDistance:Boolean

distanceLimit:int

IK 엔진이 각 반복에 대해 움직이는 최대 거리(픽셀)를 설정합니다.

limitByIteration:Boolean

iterationLimit:int

IK 엔진이 각 움직임에 대해 수행하는 최대 반복 수를 설정합니다.

limitByTime:Boolean

timeLimit:int

움직임을 수행하기 위해 IK 엔진에 할당되는 최대 시간(밀리초)을 설정합니다.

기본적으로 모든 Boolean 값은 false 로 설정되어 있으므로 Boolean 값을 true 로 명시적으로 설정하지 않는 한 움직임이 제한되지 않습니다. 제한을 적용하려면 해당하는 속성을 true 로 설정한 다음 해당하는 정수(integer) 속성의 값을 지정하십시오. 해당 Boolean 속성을 설정하지 않고 제한을 값으로 설정한 경우에는 제한이 무시됩니다. 이 경우 IK 엔진은 다른 제한 또는 IKMover의 대상 위치에 도달할 때까지 객체를 계속 움직입니다.

다음 예제에서는 뼈대 움직임의 최대 거리를 각 반복 당 0.1픽셀로 설정합니다. 모든 움직임의 최대 반복 수는 10으로 설정됩니다.
ik.limitByDistance = true; 
ik.distanceLimit = 0.1; 
ik.limitByIteration = true; 
ik.iterationLimit = 10; 

IK 뼈대 움직임

IKMover는 바퀴의 이벤트 리스너 내에서 축을 움직입니다. 바퀴의 각 enterFrame 이벤트에서는 뼈대의 새 대상 위치가 계산됩니다. moveTo() 메서드를 사용하면 IKMover는 꼬리 연결점을 limitByDistance , limitByIteration 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); 
    } 
} 

반동 사용

Flash Professional CS5의 역기구학은 뼈 반동을 지원합니다. 뼈 반동은 제작 중에 설정할 수 있으며, 뼈 반동 특성은 런타임에 추가하거나 수정할 수 있습니다. 반동은 뼈 및 연결점의 속성입니다. 여기에는 반동의 크기를 설정하는 IKJoint.springStrength 와 강도 값에 대한 저항을 추가하고 반동의 감소율을 변경하는 IKJoint.springDamping 이라는 두 가지 특성이 있습니다.

반동 강도는 기본값 0(완전히 고정)에서 100(매우 느슨하며 물리 기능으로 제어됨) 사이의 퍼센트 값입니다. 반동이 있는 뼈는 연결점의 이동에 반응합니다. 다른 변환(회전, x 또는 y)이 함께 설정되어야만 반동 설정이 나타납니다.

반동 감폭은 기본값 0(저항 없음)에서 100(감폭 큼) 사이의 퍼센트 값입니다. 감폭은 뼈가 처음 이동을 시작하여 안정된 위치로 돌아올 때까지의 시간을 변경합니다.

IKArmature 객체에 반동이 설정되었는지 여부는 IKArmature.springsEnabled 속성으로 확인할 수 있습니다. 다른 반동 속성 및 메서드는 개별 IKJoint 객체에 속합니다. 연결점에는 각도 회전과 x 축 및 y 축에 따른 평행 이동을 설정할 수 있습니다. IKJoint.setSpringAngle 을 사용하여 회전 연결점의 반동 각도를 배치하고, IKJoint.setSpringPt 를 사용하여 평행 이동 연결점의 반동 위치를 배치할 수 있습니다.

아래 예에서는 이름으로 뼈를 선택하고 해당 tailJoint를 식별합니다. 이 코드에서는 부모 뼈대를 테스트하여 반동이 설정되었는지 확인한 후 연결점에 대해 반동 속성을 설정합니다.

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 이벤트 사용

IKEvent 클래스를 사용하면 IK 이벤트에 대한 정보가 들어 있는 이벤트 객체를 만들 수 있습니다. IKEvent 정보는 지정된 시간, 거리 또는 반복 제한이 초과되었기 때문에 종료된 모션을 설명합니다.

다음 코드에서는 추적 시간 제한 이벤트에 대한 이벤트 리스너 및 핸들러를 보여 줍니다. 이 이벤트 핸들러는 IKMover의 시간 제한이 초과되면 발생하는 이벤트의 시간, 거리, 반복 수 및 연결점 속성을 보고합니다.

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