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

발 미끄러짐 없애기: 역기구학과 풋 로킹 실전 레시피

캐릭터 애니메이션에서 발바닥이 지면을 딛고 있어야 할 순간에 미세하게 미끄러지는 현상, 이른바 '풋 슬라이딩(foot sliding)'은 거의 모든 애니메이션 시스템이 안고 있는 고질적인 문제다. 시각적으로는 사소해 보여도 한 번 눈에 띄면 몰입을 깨는 대표적 요소이고, 반대로 발을 지면에 제대로 '고정(locking)'하면 결과물의 완성도가 눈에 띄게 올라간다. 문제는 이 주제가 과학이라기보다 기예에 가깝다는 점이다. 애니메이션 프로그래머 두 명에게 최선의 해법을 물으면 서로 다른 답이 돌아오기 일쑤이고, 그래서 학계에서도 상대적으로 조명을 덜 받으며 참고 자료도 찾기 어렵다. 원저자 역시 자신의 방법이 검증된 최선은 아니며 더 잘 처리하는 게임도 많겠지만, 오랜 실무에서 유효했던 출발점이라고 분명히 선을 긋는다.

다리 체인을 푸는 역기구학

첫 단계는 발가락(toe) 관절을 원하는 위치에 놓도록 다리 관절 체인을 푸는 일이다. 핵심 발상은 기존 포즈를 최대한 보존하면서 로컬 회전만 조정하는 것이다. 먼저 목표 발뒤꿈치(heel) 위치를 구하는데, 이는 입력 포즈에서 발가락으로부터 발뒤꿈치로 향하는 벡터를 그대로 발가락 타깃에 더하면 된다. 발뒤꿈치 타깃이 정해지면 엉덩이와 무릎 관절의 로컬 회전을 두 관절 역기구학(two-bone IK)으로 계산한다. 저자는 여기에 두 가지를 덧붙였다. 하나는 사용자가 지정한 최대 신장 길이(maxExtension)를 향해 완화 거리(softening) 기반으로 부드럽게 클램프해, 다리가 최대 길이에 지수적으로만 접근하도록 만들어 과신장을 막는 것이다. 다른 하나는 무릎 관절의 측면 벡터를 회전축으로 삼아 폴 벡터(pole-vector) 없이도 안정적인 축을 확보하는 것이다. geno 캐릭터 기준으로 무릎 측면 벡터는 (1,0,0), 완화 값은 0.005m 정도가 전형적이다.

발뒤꿈치를 타깃에 맞춘 뒤에는 발가락 관절이 더 이상 타깃을 향하지 않게 되므로, QuaternionBetween을 이용한 기본적인 룩앳(look-at)으로 발가락 방향을 다시 맞춘다. 여기에 지면 충돌 처리를 더할 수 있다. 바인드 포즈에서 발뒤꿈치와 발가락의 높이를 구해 두고, 다리를 풀 때 각 타깃을 해당 높이로 클램프하며, 발끝이 바닥을 파고들지 않도록 높이를 제한했다면 그에 맞춰 발끝의 회전도 다시 정렬한다. 다만 이 예시는 지면을 높이 0으로 가정하므로, 동적 지형이라면 발밑 실제 높이를 레이캐스트로 구해야 한다. 이렇게 완성된 함수는 '기존 포즈 + 새 발가락 타깃'을 넣으면 언제나 그럴듯한 결과를 내주는 일종의 블랙박스가 된다. 덕분에 풋 로킹 문제는 '발가락 타깃이 미끄러지지 않게만 만들면 된다'는 훨씬 단순한 형태로 축소된다.

접촉 구간에서 발을 고정하기

런타임 고정 로직 자체는 간단하다. 접촉이 없을 때는 입력 애니메이션의 발가락 위치를 따라가고, 접촉이 활성화되면 접촉이 처음 시작된 순간의 발가락 위치를 바닥에 고정해 그 정적 위치를 따라간다. 두 소스 사이 전환은 관성화(inertialization), 구체적으로는 큐빅 관성화 함수로 부드럽게 처리한다. 입력이 발을 고정 상태로 보고하고 현재 출력과 새 입력 사이 거리가 충분히 작으면 접촉 위치를 기록해 그 지점을 추종하고, 입력이 고정을 해제하거나 출력과 입력의 거리가 너무 벌어지면 다시 입력 위치 추종으로 되돌아간다. 이렇게 얻은 타깃을 앞서 만든 솔버에 넣으면 접촉 구간 동안 발가락을 고정된 위치로 강제할 수 있다.

접촉 구간은 어떻게 자동으로 라벨링하는가

이 모든 것은 입력 애니메이션에서 발이 언제 지면과 접촉하는지를 알아야 성립한다. 가장 확실한 기준은 수작업 라벨링이지만, 간단한 휴리스틱으로 약 90%까지 도달할 수 있다. 핵심 신호는 발가락 관절의 전역 속도 크기다. 접촉 중에는 속도가 낮게 유지되므로 임계값으로 이진 접촉 라벨을 근사하기 쉽다. 발 높이는 사람이 걸을 때 발을 그다지 높이 들지 않아 임계 처리가 어렵지만, 공중에 정지한 발을 접촉으로 오인하지 않게 하는 보조 지표로는 유효하다. 고품질 데이터에서는 대략 0.5~0.1 m/s의 속도 임계값과 0.1m 높이 임계값이 무난하며, 이는 골격상 발가락 위치에 따라 달라진다.

임계 처리 후에는 후처리를 더한다. 짧은 윈도우에서 다수결을 취하는 필터(넘파이에서는 이진 신호에 대해 미디언 필터로 동일하게 동작)는 단일 프레임의 오작동을 막아 주며, 60Hz에서 폭 5프레임이 좋은 출발점이다. 가우시안 스무딩을 적용해 이진 신호를 연속 신호로 바꾸면 런타임에서 접촉 발동 시점을 앞당기거나 늦추는 여유를 확보할 수 있다. 다만 빠른 달리기에서는 신발과 발의 변형이 커 발이 위아래로 꽤 움직이고 접촉 시간도 짧아 여전히 까다롭다. 30Hz에서는 달리기 접촉이 1~2프레임에 불과해 다수결 필터와 결합하면 놓치기 쉬우므로 데이터를 60Hz로 유지하는 것이 크게 도움이 되고, 30Hz에서 업샘플링한다면 속도 계산에 선형보다 큐빅 보간이 임계 처리에 유리하다.

오프라인이라면 제약 조건으로 푼다

전체 클립에 접근할 수 있고 연산 여유가 있다면 런타임과 전혀 다른 접근이 가능하다. 골반과 양쪽 발가락 위치를 매 프레임 계산해 이를 연결된 입자로 취급하고, 프레임 간·프레임 내 상대 위치가 입력 애니메이션과 비슷해지도록 부드러운 스프링형 연결을 건다. 여기에 접촉으로 판정된 발가락 입자에 대해서는 프레임 간 거리를 0으로 강제하는 더 단단한 제약을 추가한다. 그러면 접촉 구간 동안 발가락 입자들이 한 점으로 모이고, 그 보정 효과가 애니메이션 전체에 자연스럽게 분산된다. 전체 애니메이션을 여러 번 반복하며 각 제약을 조금씩 만족시키는 위치 기반 동역학(PBD) 방식으로 풀면, 미끄러짐은 사라지되 원래 동작은 보존한 새 골반·발가락 타깃을 얻고 이를 다시 다리 솔버에 넣어 로컬 회전을 조정한다.

실무자 입장에서 이 레시피들이 주는 교훈은 분명하다. 풋 로킹은 단일 마법 공식이 아니라, 안정적인 IK 솔버라는 블랙박스를 먼저 확보하고 그 위에 '타깃을 미끄러지지 않게 만드는' 문제를 얹는 계층적 설계에 가깝다. 그리고 그 성패의 상당 부분은 알고리즘보다 데이터 관리에서 갈린다. 접촉 라벨의 품질, 샘플링 레이트, 보간 방식 같은 선택이 결과를 좌우한다는 점은, 자동 접촉 주석 하나만 봐도 데이터를 세심히 돌보는 일이 그대로 품질로 돌아온다는 사실을 잘 보여준다.

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

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

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

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