Unity/유니티 기본

[4.15] Inverse Kinematics (IK) - 역운동학

ljw4104 2021. 4. 15. 12:23

* Unity Document 발췌

  • 대부분의 애니메이션은 스켈레톤에서 미리 정해진 값에 조인트를 변경하여 회전하는 것으로 실현됩니다. 자식 조인트의 위치는 부모의 회전에 따라 변화하고, 이 때문에 일련의 조인의 종료점은, 각도 및 포함된 개별 조인트의 상대적 위치에 의해 결정됩니다. 이 스켈레톤의 포징(Posing) 기술은 Forward Kinematics (포워드 운동학)이라고 합니다.
  • 그러나 포징(Posing) 조인트가 할 작업을 다른 관점에서 파악하는 것이 중요합니다. (공간에서 선택된 위치, 거기에서 역산하여 조인트의 방향을 종료점이 되는 위치) 효과적인 방법을 찾을 수 있습니다. 오브젝트를 사용자에 의해 선택된 점을 터치 시키거나 평탄하지 않은 땅에 발을 붙이는 것 같은 포즈를 캐릭터가 해주길 바랄 때 유용합니다. 이 방법은 Inverse Kinematics(IK)라고하며 메카님에서 잘 설정된 아바타가 있는 휴머노이드 캐릭터에서 지원됩니다.

 

IK 적용방법

IK Pass 체크란에 체크만 하면 기본적으로 적용이 된다.

 

만약에 사람이 총을 들고 있다면 달릴 때, 총도 같이 흔들릴것이다. 하지만 IK를 적용하지 않은 오브젝트에서는 사람은 흔들리지만 총은 가만히 좌표만 변경이 된다.

이것은 Monobehaviour의 OnAnimatorIK를 이용하면 된다.

private void OnAnimatorIK(int layerIndex)
{
    //왼쪽손을 총의 미리정해진 쪽으로 붙임
    this.animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
    this.animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
    this.animator.SetIKPosition(AvatarIKGoal.LeftHand, this.leftHand.position);
    this.animator.SetIKRotation(AvatarIKGoal.LeftHand, this.leftHand.rotation);

    //오른쪽손을 총의 미리정해진 쪽으로 붙임
    this.animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
    this.animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
    this.animator.SetIKPosition(AvatarIKGoal.RightHand, this.rightHand.position);
    this.animator.SetIKRotation(AvatarIKGoal.RightHand, this.rightHand.rotation);
}

사람이 총을 쥐고 움직이는 것처럼 보인다.