상세 컨텐츠

본문 제목

Hiking: 6주차 Foot IK를 적용한 이동 구현

Computer Graphics/Hiking

by Banjosh 2025. 5. 9. 12:38

본문

 지난주까지는 하체의 움직임을 애니메이션 없이 100% Foot IK만을 이용하여 구현해보려 하였다.
 하지만 실제 게임을 구현할 때의 범용성과 앞으로 작업할 일들을 생각해보면 애니메이션에 Foot IK를 적용하는 방향이 더 좋을 수 있다는 조언을 들었고, 그 후로 방향성을 바꿔 애니메이션에 Foot IK를 적용시키는 구현을 진행하였다.

 

 그 과정에서 다음과 같은 기능들을 추가하였다.

 

현재 애니메이션 Keyframe의 발목과 발가락 각도를 IK에 적용

다음은 지난주에 사용한 발목 각도 조정을 그대로 사용하여 애니메이션과 IK를 블랜딩한 영상이다.

(아직 왼발에만 IK chain이 존재하기 때문에 왼발만 적용)

지난주에 사용한 발목 각도 조정은 가만히 서있을 때를 기준으로 한 것이었다.

 따라서 걷는 동안 실시간으로 변하는 발목의 local 좌표계에 각도를 맞추지 못하여 발목이 꿈틀 꿈틀하는 모습이 발견된다.

 

따라서 이번에 적용한 방법은 현재 애니메이션의 발목과 발가락의 각도를 가져와 사용하는 방법이다.

발목과 발가락이 실제 애니메이션과 똑같은 각도로 움직이기 때문에 지면에 맞는 각도를 항상 유지할 수 있다.

혹시나 지면의 normal 방향이 변화할 것을 대비해 normal의 변화만큼 각도를 회전시켜주는 것도 추가하였다.

 

 

첫 영상과 다르게 발목이 부드럽게 움직이고 지면에 맞는 것을 볼 수 있다.

(현재 애니메이션과 IK를 블랜딩한 상태라 발을 지면에 올릴때 부터 떼는 순간 까지만 IK 적용)

 


오른발 Chain 생성

 이제 양발에 IK를 적용한 후 문제점들을 하나하나 고쳐야하기 때문에 오른발에도 Chain을 생성하여 관찰하기로 하였다.

오른발에 IK chain을 추가한 후 다음과 같이 변했다.

(IK를 100%적용한 영상)

 


경사에서도 발이 지면을 뚫고 가지 않도록 IK Target 수정

 현재는 100% IK를 사용하여 하체의 애니메이션이 적용되지 않아 경사로에서 발이 지면을 확 뚫고 가지는 않는다. 

다음 영상이 100% IK를 사용하여 경사로를 오르는 영상이고 100% IK라 발을 질질 끌고 다니는 모습을 볼 수 있다.

 

 100% IK는 부자연스럽기 때문에 보통 IK와 애니메이션을 블랜딩하여 사용한다고 한다. 하지만 IK와 애니메이션을 walkPhase에 맞게 블랜딩해서 쓰는 경우 애니메이션 100%가 되는 순간 하체가 바닥을 확 뚫고 들어가버리는 문제가 발생한다. 

 

 위 문제를 해결하기 위해 애니메이션은 이용하되 발이 지면을 뚫고 나가지 않는 방법을 고민한 결과, 기본 애니메이션 루프에서 발과 지면의 y차이를 기록해 놓은뒤 IK Target을 적용할때 이를 이용하는 방법을 떠올렸다.

 

 따라서 기존엔 Target을 그냥 지면으로 고정시켜놨다면 기본 애니메이션에서 지면과 발의 높이차이를 그대로 Target에 적용해 발을 띄우는 방법을 사용하였다.

 

 

현재 캐릭터의 y값 조정이 잘 안되고 있어 target까지 수렴을 못하는 것이 있긴 하지만, 발이 지면을 뚫고 들어가지 않으면서 애니메이션이 잘 진행되는 모습을 볼 수 있다.


IK 적용시 갑작스러운 Target 변경으로 인해 애니메이션이 끊기는 문제 해결

 이번엔 캐릭터의 계단 오르기를 테스트 해보았다.

 

 계단을 올라가긴 하지만 부드럽지 않고 애니메이션이 끊기는 느낌이 있다.

계단과 같이 target의 y값이 급격하게 변하는 경우 IK 자체가 순간적으로 변하고, raycasting의 결과를 이용하여 결정하고 있는 캐릭터의 y값 또한 급격하게 변하게 된다.

 

 따라서 캐릭터의 y값과 target이 순간적으로 계속 변하게 되어 부드럽게 진행되지 못하는 것이다.

이를 해결하기 위해 target과 y값은 바로 이동하지 않고, 정해진 속도록 목표지점으로 이동하게 만들었다.

 

 

 

Target의 위치 뿐만 아니라 Target의 변경으로 인한 IK 결과값인 Bone의 각도들도 갑작스러운 변화로 인해 문제가 발생하였다.

 

 다음과 같이 IK 결과 Bone의 각도가 급격하게 변하는 구간에서는 부드럽지 못한 애니메이션이 발생한다.

 

 

이 또한 같은 방법으로 수정해주었다.

 

 

 

Raycasting 범위 확장

 지금까지 Foot IK는 ToeBase라는 Bone에서만 Raycasting을 진행하였다. (ToeBase는 발의 중앙 부분)

따라서 발의 앞부분이나 뒷부분에 지면이 튀어나와있는 경우 다음과 같이 발이 지면을 파고들어가는 경우가 발생하였다.

 

[발 앞부분이 지면에 들어간 경우]

 

[발 뒷부분이 지면에 들어간 경우]

 

 위와 같은 현상을 막기 위해 발 앞부분과 뒷부분에서 Ray를 발사해 발 1개당 총 3개의 Ray를 발사하여 지면을 감지한다.

3개의 Ray 중 가장 높은 지면에 발을 맞추는 형식으로 구현을 하였다.

 

[발 앞부분 Ray 추가]

 

[발 뒷부분 Ray 추가]

 

 

IK 적용에 의한 캐릭터의 Y값 수정

 

지금까지 캐릭터의 Y값 처리에 대해 다양한 처리 시도를 해보았다.

 

1. Hips Bone을 기준으로 지면으로 Raycasting 실행 결과를 통해 Y값 처리

2. Hips Bone보다 앞에 Ray를 1개 더 쏴서 더 높은 지면에 대해 Y값 처리

3. 양발의 Raycasting 결과의 중간 값을 사용하여 Y값 처리

 

 하지만 1,2 번은 결국 IK와 상관없이 Y값을 조절하기 때문에 부자연스러운 결과가 발생할 수 밖에 없었고, 3번은 생각보다 높은 Y값에 IK가 수렴하지 못하는 결과가 발생하였다.

 

[Hips 위치 기준 Raycasting으로 Y값을 처리한 경우 발생하는 문제점]

 보통 발이 Hips보다 앞쪽에 위치하므로 양발은 살짝 앞에 있는 높은 지형에 맞춰 Target이 맞춰지는데, Hips는 바로 아래있는 낮은 지형에 맞춰 Y값을 처리하므로 발생하는 문제이다. (발과 골반의 위치 차이에 의한 문제 발생)

 

[양발의 평균값으로 Y값 처리시 발생하는 문제점]

  양발의 평균값으로 Y값을 처리해버리면 낮은 곳에 있는 발이 수렴하지 못하는 Y값이 돼버린다.

 다음 영상이 바로 양발의 평균값을 적용한 영상이고 IK가 수렴하지 못하는 것을 볼 수 있다.

 

 

[뒷발을 기준으로 Y값을 맞추는 방법 적용]

 다음으로 시도해본 방법은 뒷발을 기준으로 Y값을 맞추는 방법이었다. 결국 IK가 수렴하기 위해서는 더 낮은 쪽의 발에 Y값을 맞추는게 맞다 생각이 들었고 이를 바로 적용하였다.

 

 그 결과 급격한 Y값 변화에도 Target에 맞추기 때문에 이상한 자세가 나오지 않고

 

 

경사를 오를 때도 뒷발이 어느정도 수렴하는 것을 볼 수 있다.

 

 

 

 하지만 발의 Target에 몸을 맞추다 보니 발생하는 문제도 있었다.

발이 몸통보다 앞에 나와있기 때문에 경사가 높아지는 구간에서는 Y값이 현재 position 보다 더 높게 측정돼 아래 사진과 같이 IK 수렴이 안되는 경우가 발생하였다. (오른발을 보면 target에 수렴하지 못하고 있음)

 

 

 target의 normal이 오르막 경사라면 그만큼 Y값을 낮게 보정해주는 방법으로 이를 해결할 수 있었다.

 

 

 

이렇게 이번주는 애니메이션과 IK의 결합을 진행하였으며 결과는 다음과 같다.

 

 

 

아직 발목각도가 완전히 잘 맞지 않거나, 수렴을 못하거나, 특정 상황에 부자연스러운 경우 등 고쳐야할 부분이 많다.

하지만 목표로 했던 2주 안에 어떻게든 결과를 내야하기 때문에 일단 수정은 여기까지하고, 이동 제한 구역 구현, Ragdoll을 이용한 피격시스템 등 마무리 단계에 들어갈 예정이다.

관련글 더보기