Choose your operating system:
Windows
macOS
Linux
Inverse Kinematics (IK, 역운동학)은, 조인트 로테이션을 직접 처리하지 않고 End Effector (엔드 이펙터)위치에서 조인트 로테이션을 처리할 수 있는 방편입니다. 실제적으로는, 이펙터 위치를 주면 IK 솔루션에서 조인트의 최종 위치가 그 위치와 가급적 일치되는 로테이션 값을 구합니다. 이 방법은 울퉁불퉁한 땅이나 기타 상황에서의 캐릭터의 발이 제대로 놓일 수 있도록 하여, 월드에 재대로 반응하는 듯한 느낌을 내 줍니다.
언리얼 엔진에서는 팔이나 다리같은 것에 이상적인 2 본 IK 시스템을 사용합니다.
손발 IK 예제는 애니메이션 콘텐츠 예제 문서의 1.8 섹션을 참고하시기 바랍니다.
IK 대 FK
IK 가 무엇이고 그 작동 원리는 어떻게 되는지 이미 잘 알고 계시다면 이 부분은 건너뛰셔도 됩니다!
언리얼의 애니메이션 스켈레톤 대부분은 캐릭터나 스켈레탈 메시의 본에 바로 물려지는 로테이션 데이터로 직접 구동됩니다. 이는 Forward Kinematics , 또는 조인트나 본에 로테이션을 직접 적용하는 것으로 생각해 볼 수 있습니다. 아래는 그 개념을 도표로 나타내 본 것입니다:
이름에서 암시하듯, Inverse Kinematics (역운동학)의 작동방식은 반대입니다. 본에 로테이션을 적용하는 대신, 본 체인에 타깃 (또는 End Effector (엔드 이펙터))를 통해 체인 마지막에서 도달해야 하는 위치를 주는 것입니다. 사용자나 애니메이터는 이펙터를 움직이면 IK 솔버(IK 시스템에서 로테이션을 구동하는 알고리즘)에서 체인 마지막의 최종 본 위치가 타깃 위치에 오도록 본을 회전시킵니다. 아래 그림에서, 엔드 이펙터는 빨강 십자선으로 표시됩니다.
UE4 에서 IK 는 기존의 애니메이션을 덮어써 캐릭터나 스켈레탈 메시의 모션이 배경과 더욱 잘 맞아떨어지도록 만드는 데 사용할 수 있습니다.
IK 셋업하기
캐릭터에 IK 를 활용하는 방법은, 사람이나 동물의 발을 땅에 놓는 것에서부터 캐릭터가 움직이는 물체에 매달리거나 붙들고 있는 것처럼 보이게 만드는 것까지, 다양합니다. 이 문서의 목적상 가장 흔히 사용되는 방법: 고르지 않은 땅이나 계단에 발딛기를 다뤄보겠습니다.
IK 를 사용하는 데 있어서 가장 중요한 고려사항은, 일반적으로 여러 곳에서의 셋업이 필요하다는 점입니다. 하이 레벨에서 보자면:
-
이펙터 위치 처리를 위한 셋업. 보통 폰 또는 캐릭터 블루프린트에서 이뤄집니다.
-
애니메이션 블루프린트 이벤트 그래프에서 폰 또는 캐릭터의 이펙터 위치를 구해오는 셋업. IK 솔버에 사용됩니다.
-
캐릭터의 애니메이션 블루프린트 애님 그래프 안에 2-본 IK 노드 셋업.
계획짜기
언제나 그렇듯이, 약간의 계획이 큰 도움이 되는 법입니다. IK 셋업으로 어떤 작업을 하려고 하는지 확실히 정해 두세요. 캐릭터의 발인지, 아니면 손인지, 반응할 것이 생기면 어떻게 할 것인지, 이러한 질문에 대한 대답을 일찍서부터 준비해 둘 수록 셋업도 쉬워집니다. 물론 UE4 의 블루프린트 비주얼 스크립팅 덕에, 나중에 기능을 추가하는 것도 충분히 쉬울 터입니다.
발딛기 IK 셋업
첫 번째 예제로, 고르지 않은 땅에 캐릭터의 발이 제대로 유지되도록 하는 단순한 IK 셋업에 대해 개괄적으로 살펴보겠습니다.
이 예제는 Content Examples 프로젝트에서 찾을 수 있습니다. Animation.umap 이란 이름의 맵을 열고 예제 1.8 을 살펴보세요.
폰 또는 캐릭터 블루프린트 셋업
첫 단계는 폰 또는 캐릭터 블루프린트가 필요한 데이터를 제대로 처리할 수 있도록 셋업해 주는 것입니다. 본질적으로는 발에서 약간의 트레이스를 하여 딛고 설 장애물이 있는지 확인하여 기록해야 한다는 뜻입니다.
아래 예제에서 유의할 점이 있는데, 문서에서 어지러워 보이지 않도록 블루프린트 와이어 정리를 위해 변수를 조금 추가했다는 점입니다. 이 변수는 실제 Content Examples 프로젝트에서는 찾아볼 수 없습니다.
컨스트럭션 스크립트
캐릭터 블루프린트의 컨스트럭션 스크립트는 딱 두 가지 핵심 데이터에 대한 셋업입니다:
-
캐릭터의 Z 높이 계산을 위한 Scale 변수.
-
피직스 캡슐의 절반 높이에 Scale 을 곱해 사용하는 IKTraceDistance 변수.
이벤트 그래프
이 셋업의 경우, 이벤트 그래프가 본질적으로 담당하는 부분은, 캐릭터의 발 아래쪽으로 그냥 쏴서 장애물이 있나 찾아보는 트레이스 처리입니다. 뭔가 걸리면 나중에 애니메이션 블루프린트에서 IK 의 이펙터를 움직이는 데 사용할 수 있도록 그 거리를 저장해 둡니다.
이 그래프에서 중요한 점 한 가지는, IKFoottrace 라 불리는 커스텀 함수입니다. 이 함수는 거리와 소켓 이름을 받아 트레이스의 토대로 삼습니다. 그 후 그 결과에 따른 오프셋 값을 반환하며, 이 값은 나중에 IK 이펙터 위치 오프셋에 사용됩니다.
그리고 이건 이벤트 그래프입니다. 위 함수 덕분에, 이 인스턴스에서는 왼발 오른발에서 트레이스를 쏴 주는 일이 거의 전부인 것을 볼 수 있습니다.
그 결과 게임 매 틱마다 하향 트레이스가 일어나, 땅이 얼마나 고르지 않은가를 나타내는 접점을 찾고 있는 것을 볼 수 있습니다. 걸리면 그 접점을 IK 오프셋에 저장하여 나중에 애니메이션 블루프린트에서 사용합니다.
애니메이션 블루프린트 셋업
애니메이션 블루프린트에서 처음으로 살펴볼 부분은 이벤트 그래프입니다. 일반적으로 말해서, 애니메이션 블루프린트에서 이벤트 그래프의 주 목적은 캐릭터 또는 폰 블루프린트와 같은 다른 소스에서 데이터를 받은 다음 애님 그래프에서 사용할 수 있도록 변수 업데이트로 변환시키는 것입니다.
이벤트 그래프
여기서 먼저 해 줄 작업은, 현재 폰을 잡아다가 모든 셋업 작업을 해 준 특정 폰 기반 클래스로 형 변환해 주는 것입니다. 그러면 폰 블루프린트의 해당 인스턴스와 직접 통신하여 그 변수에 저장된 데이터를 읽을 수 있게 됩니다.
폰 블루프린트에 저장된 IK 오프셋 데이터를 가지고, 나중에 IK 이펙터에 사용될 위치 벡터를 생성할 수 있습니다.
애님 그래프
애님 그래프는 지금까지 조합한 정보를 적용하여 캐릭터용으로 생성된 기존의 애니메이션을 업데이트하는데 사용하는 것으로 지금까지의 셋업의 마지막을 장식합니다. 이 예제의 경우, 애님 그래프는 정말이지 애니메이션 딱 하나 재생한다는 점에서 매우 간단합니다. 대부분의 경우 Play JumpingJacks 노드를 다른 노드 여러개로 대체시켜 줘야 원하는 동작을 낼 수 있을 것입니다.
중요한 부분은, 현재 스페이스를 로컬에서 컴포넌트로 전환하는 부분입니다. 캐릭터에 재생되는 모든 애니메이션은 로컬 스페이스를 기반으로 합니다. 로컬 트랜스폼 작업은 각 본의 계층구조상 부모를 기준으로 하기 때문에 계산 속도가 가장 빠른 방식입니다. 그러나 2-본 IK 적용같은 본 조작은, 루트 본을 기준으로 하는 컴포넌트 스페이스에서 이루어져야 합니다.
이런 젼차로, 딱 IK 계산을 할 만큼만 데이터를 로컬에서 컴포넌트로 전환해 줘야 합니다. 동시에 Final Animation Pose 노드는 로컬 스페이스 데이터만 받을 수 있기에, IK 적용이 끝나면 다시 역변환해 줘야 합니다.
애니메이션의 좌표계 관련 상세 정보는 좌표계 용어집 문서를 참고해 주시기 바랍니다.