TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 22 READS

게임 캐릭터 발이 바닥에서 미끄러지는 이유와 해결법: 인버스 키네마틱스와 풋 락킹

게임 캐릭터 발이 바닥에서 미끄러지는 이유와 해결법: 인버스 키네마틱스와 풋 락킹
SOURCE IMAGE · HACKER NEWS
게임 캐릭터 발이 바닥에서 미끄러지는 이유와 해결법: 인버스 키네마틱스와 풋 락킹

도입

게임 캐릭터가 걸을 때 발이 바닥에서 스르륵 미끄러지는 현상, 한 번쯤 보셨을 거예요. 흔히 '풋 슬라이딩(foot sliding)'이라고 부르는데, 캐릭터 애니메이션에서 제일 눈에 거슬리는 결함 중 하나예요. 유비소프트 연구 조직에서 애니메이션 연구를 했던 다니엘 홀든(Daniel Holden)이 이 문제를 어떻게 푸는지를 인버스 키네마틱스와 풋 락킹이라는 두 기법을 중심으로 정리한 글을 올렸어요. 이 분은 모션 매칭, 이너셜라이제이션 같은 현대 게임 애니메이션 기법의 핵심 자료를 계속 써온 사람이라 게임 애니메이션 쪽에서는 꽤 알려져 있어요.

왜 발이 미끄러지나요

애니메이션 데이터는 보통 모션 캡처로 찍어요. 배우가 걷는 걸 찍으면 발이 땅에 닿아 있는 동안은 정확히 제자리에 고정돼 있죠. 문제는 이 데이터를 게임에서 쓸 때 생겨요. 여러 애니메이션을 섞고(블렌딩), 캐릭터 속도를 조절하고, 경사진 지형 위에 올려놓고, 방향을 틀면, 원본에서 완벽하게 고정돼 있던 발이 조금씩 어긋나기 시작해요. 두 걷기 애니메이션을 50대50으로 섞으면 발 위치도 두 위치의 중간이 되는데, 그 중간 위치는 실제로 땅에 닿아 있던 위치가 아니거든요. 그래서 발이 땅에 붙어 있어야 할 시간 동안 살짝살짝 움직이는 게 보이는 거예요.

인버스 키네마틱스가 뭐냐면

보통 애니메이션은 순방향(forward)이에요. 골반 회전을 정하고, 허벅지 회전을 정하고, 무릎 회전을 정하면 발 위치가 결과로 나와요. 인버스 키네마틱스(IK, 역기구학)는 이걸 거꾸로 해요. '발을 여기에 두고 싶다'는 목표를 먼저 정하고, 그러려면 허벅지와 무릎이 얼마나 돌아가야 하는지를 역산하는 거예요.

다리처럼 관절이 두 개인 경우엔 '투본 IK(two-bone IK)'라는 아주 깔끔한 해법이 있어요. 허벅지 길이, 정강이 길이, 그리고 골반에서 목표 지점까지의 거리를 알면 삼각형이 하나 그려지잖아요. 세 변의 길이를 아니까 코사인 법칙으로 무릎 각도를 바로 계산할 수 있어요. 반복 계산이 필요 없어서 한 프레임에 수백 개 캐릭터를 처리해도 부담이 없어요.

다만 삼각형만으로는 무릎이 어느 방향으로 꺾일지 정해지지 않아요. 같은 발 위치에 대해 무릎이 앞으로 꺾일 수도 옆으로 꺾일 수도 있거든요. 그래서 '폴 벡터(pole vector)' 또는 힌트 방향이라는 걸 추가로 줘서, 무릎이 원래 애니메이션에서 향하던 방향을 최대한 유지하게 해요. 원본 애니메이션의 무릎 방향을 그대로 힌트로 쓰면 IK가 적용돼도 원래 동작의 느낌이 안 깨져요.

또 하나 실무에서 중요한 게 다리 길이 한계예요. 목표 지점이 다리를 쭉 뻗어도 안 닿는 곳이면 무릎이 완전히 펴지면서 뚝 끊기는 느낌이 나요. 그래서 목표 거리가 최대 길이에 가까워질수록 부드럽게 눌러주는 소프트 IK 같은 기법을 써서 관절이 딱딱하게 잠기는 걸 막아요.

풋 락킹은 어떻게 동작하나요

IK가 '발을 어디에 둘지'를 실현하는 도구라면, 풋 락킹은 '발을 어디에 둬야 하는지'를 정하는 논리예요. 핵심 아이디어는 단순해요. 발이 땅에 닿아 있다고 판단되는 순간, 그 월드 좌표를 기억해 두고 접촉이 끝날 때까지 발을 그 자리에 못 박는 거예요.

먼저 접촉 감지가 필요해요. 애니메이션 데이터에서 발 속도가 일정 값 이하이고 높이가 바닥 근처면 '접촉 중'이라고 표시해요. 이걸 미리 계산해서 애니메이션에 태그처럼 붙여두는 게 일반적이에요. 게임 실행 중에는 그 태그가 켜지는 순간의 발 위치를 저장하고, 매 프레임 IK 목표를 그 저장된 위치로 잡아요. 애니메이션 블렌딩이 어떻게 되든, 캐릭터가 회전하든, 발은 그 자리에 고정돼요.

진짜 어려운 부분은 잠금이 풀리는 순간이에요. 접촉이 끝나면 발은 원래 애니메이션의 위치로 돌아가야 하는데, 잠긴 위치와 애니메이션 위치 사이에 차이가 있으면 발이 순간이동하는 것처럼 튀어요. 그래서 그 차이(오프셋)를 시간에 걸쳐 부드럽게 0으로 줄여야 해요. 홀든이 예전 글에서 소개한 이너셜라이제이션(inertialization)이라는 기법이 여기서 쓰이는데요, 이게 뭐냐면 두 상태를 선형으로 섞는 대신 차이값을 스프링처럼 감쇠시켜서 자연스럽게 사라지게 하는 방식이에요. 잠금이 시작될 때도 마찬가지로 애니메이션 위치에서 잠금 위치로 부드럽게 넘어가게 하고요.

그리고 이 모든 게 애니메이션 파이프라인의 어느 단계에서 도느냐도 중요해요. 순서는 보통 이래요. 애니메이션 블렌딩 결과를 받고, 그 위에 캐릭터의 실제 이동을 적용하고, 지형 높이에 맞춰 목표를 조정하고, 풋 락킹으로 목표를 확정하고, 마지막에 IK로 다리를 풀어요. 이 순서가 꼬이면 발이 땅속에 박히거나 공중에 뜨는 버그가 나와요.

업계 맥락

풋 IK와 풋 락킹은 언리얼 엔진의 컨트롤 릭이나 유니티의 애니메이션 리깅 패키지에 기본으로 들어 있는 기능이에요. 그래서 '이미 있는데 왜 배우냐'고 할 수 있는데, 엔진 기본 기능은 일반적인 케이스를 위한 거라 캐릭터마다, 게임마다 튜닝이 필요해요. 특히 모션 매칭처럼 매 프레임 애니메이션 클립이 바뀌는 시스템에서는 풋 락킹 없이는 아예 쓸 수가 없어요. 최근에는 신경망 기반 애니메이션이 늘고 있는데, 신경망 출력은 물리적 제약을 정확히 지키지 않는 경우가 많아서 오히려 후처리로 IK와 풋 락킹이 더 중요해지는 추세예요.

한국 개발자에게

게임 클라이언트 개발자나 테크니컬 아티스트라면 투본 IK는 한 번은 직접 구현해보길 권해요. 코사인 법칙 몇 줄이면 되는데, 이걸 이해하면 엔진 IK 노드가 왜 그렇게 동작하는지, 파라미터가 뭘 의미하는지가 보여요. 그리고 풋 락킹의 '잠금, 오프셋 감쇠, 해제' 패턴은 발뿐 아니라 손이 물체를 잡을 때, 무기를 쥘 때, 벽을 짚을 때 전부 똑같이 쓰여요. 한 번 배워두면 계속 재사용되는 패턴이에요. 게임이 아니더라도 로봇 공학이나 VR 아바타 쪽에서도 같은 원리가 그대로 적용돼요.

정리

풋 슬라이딩은 접촉 순간의 발 위치를 기억해서 고정하고(풋 락킹), 그 위치에 맞게 다리를 역산하고(IK), 잠금이 풀릴 때 차이를 부드럽게 감쇠시키는 세 단계로 해결해요.

여러분 프로젝트에서 발 미끄러짐이나 관절이 뚝 끊기는 문제를 어떻게 처리하고 계세요? 엔진 기본 기능으로 충분했나요, 아니면 직접 손봐야 했던 경험이 있나요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://theorangeduck.com/page/inverse-kinematics-foot-locki...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...