[UE5] Crouch 상태일 때 Foot IK 문제 해결

2024. 2. 20. 10:26강의/UE5 기타 강의들

 

 

 

- 이전에 작성한 글을 그대로 따라가면, 웅크리기시 위와 같이 부자연스러운 모습을 볼 수 있습니다. 

- 이전 글과 상관없이 따라갈 수 있도록 언리얼 기본 마네킹의 BasicFootIK Control Rig 을 기반으로 작성했습니다.

 

1. Calf 와 Thigh 의 각도를 감지하여, Pelvis의 위치를 조절 (실패)

 

- 제가 첫 번째로 떠올린 해결방법은 다리의 각도를 감지하여, 일정한 범위를 벗어나면, Pelvis를 위로 올리는 방법입니다.

- 계층구조에서 Foot 위로는 Calf, Thigh가 있습니다. 

- 이 두 본의 Local Rotation 추적하였습니다.

 

 

 

Calf

- Initial Pose 에서 Local Rotation이 상대적으로 얼마나 변했는지를 측정했습니다.

- Euler 각도의 z축이 -5 이하가 되면, 위 이미지같이 꺽인 모습이 된다는 것을 확인했습니다.

- 따라서, 블루프린트의 Initial 체크, 그리고 MakeRelaative, ToEuler, Less 노드를 통해 로직을 작성하였습니다.

 

 

 

 

Thigh

- 마찬가지로, Initial Pose 에서 Local Rotation이 상대적으로 얼마나 변했는지를 측정했습니다.

- 다리가 너무 많이 올라가는 상황에서 이상한 포즈를 볼 수 있었습니다.

- 따라서, 웅크리기시 90 도가 넘어가는 상황이 오는지를 체크하였습니다.

 

 

 

하지만, 이 방법은 모든 애니메이션에 영향을 주었습니다.

그렇기 때문에 IsCrouched 변수를 두고, 웅크리기 시에만 이 로직이 동작하도록 작성하였습니다.

그래도, 이 방법은 디버깅이 불편하였고, 복잡하기만하여 좋지 못했습니다.

 

Pelvis 위치만 잘 조정하면, 이를 해결할 수 있다는 것을 알게되어 더 단순한 방법을 생각해냈습니다.

 

2. IsCrouch 상태일 때 Pelvis는 두 발의 위치중 높은 위치로 조정 (Max값)

 

 

- 보통 IK에서는 Pelvis를 조정합니다.

- 그 이유는, 위 이미지와 같이 Pelvis를 내려줘야 발이 바닥에 닿기 위해서입니다.

- 그래서, 보통 Foot IK에서는 두 발의 충돌 지점을 구하고, Offset이 더 낮은 쪽에 맞추어서 Pelvis 또한 Offset을 적용해줍니다. 

(여기서 Offset이란, 원래 애니메이션의 위치와, IK로 설정되어야할 위치의 차이입니다.)

 

 

- 하지만, Crouch 상태인 경우, 보통 Pelvis는 충분히 낮은 상태입니다. 따라서, Pelvis를 낮춰줄 필요가 없습니다.

- 그러면, Crouch상태일 때 Pelvis Offset 조정을 끄면되는 것 아닌가? 라고 생각했지만, 아니었습니다.

 

 

- 기본 Crouch 애니메이션 위에 IK를 적용하는 것 이기 때문입니다.

- 기본 애니메이션이 적용된 Pelvis보다 더 높이 발이 위치해 있을 수 있다는 것 입니다.

 

- 그러므로, Idle/Walk 상황과는 반대로 생각해야합니다.

- 두 발의 Offset 중 더 높은 Offset을 Pelvis에 적용하면 자연스러워지겠구나 라는 생각이 들었습니다.

- 그리고 결과는 다음과 같습니다.

 

 

 

- 해결된 것 같지만, 한가지 문제가 있었습니다.

- Crouch -> Idle -> Crouch를 반복해보면, 낮은 발이 뜨는 현상을 볼 수 있습니다.

 

 

3. Pelvis를 두 발의 보간으로 위치 조정

 

- 먼저 이런일이 왜 발생하는지 알아보기 위하여,

- 애니메이션의 blend 속도를 낮추었습니다.

- 확인한 결과, pelvis가 순간적으로 더 높은 발의 offset이 적용되면서 이런 현상이 나타난 것입니다.

 

 

 

 

- 그렇기 때문에, 두발의 Offset 중 Max와 Min을 선택하는 방식 대신 두 값을 보간하는 방향으로 생각하였고, Interpolate 노드를 사용하였습니다.

- Interpolate의 Alpha를 Alpha Interpolate 노드를 사용하여 Max 값과 Min 값을 보간할 수 있었습니다.

(Alpha InterPolate는 https://nsgg.tistory.com/580 이 글에서 설명한 것 처럼, 내부에 Reult 변수가 있어,

 Target Value를 설정하면 Result 변수를 Target으로 서서히 보간한 값을 리턴합니다.) 

 

 

- 하지만 여기서도 발이 뜨는 문제가 발생합니다. 

- 이는 Alpha Interpolate의 Speed를 조정하는 것으로 해결할 수 있습니다.

- Interp Speed Increase는 빨라야하며

- Interp Speed Decrease는 느려야합니다.

 

- Idle -> Crouch: Decrease(1 -> 0)

    - Decrease 속도가 빠르면 2번에서 발생했던, Pelvis 가 높게 잡혀 발이 뜨는 현상이 일어납니다.

- Crouch -> Idle: Increase (0 -> 1)

    - Increase 속도가 느리면, Idle 애니메이션의 Pelvis를 조정하는데 시간이 걸려 발이 뜨는 현상이 일어납니다.

 

- 이러한 Seed 변수를 잘 조절하면, 상태변화에도 발이 항상 지면에 붙어있는 애니메이션을 구현할 수 있습니다. 

- 결과는 아래와 같습니다.

 

 

 

- 웅크리기시 Pelvis가 자연스럽게 자신의 위치를 찾는 것을 볼 수 있습니다.