프로그래밍/Unreal Engine

230313_언리얼 포트폴리오(Project_Zombie_FPS)

이동헌 2023. 3. 14. 00:39

딱 방금! 따끈따끈하게 사슴의 몸 기울이기 시스템을 완성하였다. 구현 방식은 다음과 같다.

 

1. 네 발에서 트레이스 광선을 쏴주고, HitPoint, HitPoint의 Normal Vector, HitPoint와 발 사이의 오프셋(거리) 정보를 받아온다.

2. 앞 발 HitPoint의 평균, 왼쪽/오른쪽 뒷발 HitPoint 총 세 점으로 평면을 만들어 Normal Vector를 구한다(몸의 각도를 결정할 평면, 처음엔 HitPoint의 Normal Vector의 평균을 가지고 하였으나 그러면 계단과 같은 특수한 경우에는 전혀 몸이 움직이질 않는다는 단점이 있어 세 점을 지나는 평면으로 하였다)

3. 해당 평면의 Normal Vector를 사슴의 전방벡터/Z축을 포함하는 평면에 사영시킨다(Projection)

4. 사영시킨 Normal Vector가 XY평면-Z평면 사이에 이루는 각이 몸이 기울어져야 하는 각도이고, 이만큼 다리는 반대로 회전해주기.

5. 여기서 문제가 발생했는데, NormalVector의 Z/Y값의 Atan값으로 구하면 X방향으로 기울어진 기울기에서는 몸이 기울지 않았다. 이 해결방안으로 NormalVector의 XY방향 벡터와 사슴의 방향벡터의 내적값을 곱해주어(Normalize 된 벡터의 내적이므로 항상 1 또는 -1이고, 반대방향인 것은 사슴이 올라가는 경사면에 있으므로 각도가 -가 됨) 깔끔하게 해결하였다!

6. 마지막으로 Offset + 회전하여 생긴 다리길이 차이(다리가 회전되면서 기존 Offset보다 더 공중에 뜨게됨)만큼 메쉬를 낮추거나 올려서 지면에 닿게 하기.

 

그런데 한가지 의문점은 원래 이렇게 복잡한 방식으로만 가능한걸까?..너무 복잡하게 생각하다보니 더 복잡해진건 아닐까 걱정되지만 잘 동작하고 깔끔한 원리이니 나름 만족한다! 이제 애니메이션이 어색한지 확인하고 IK시스템도 적용하자.

 

p.s. 그림을 내가 잘 그린다면 블로그에 추가하고 싶은데..연습을 해야하나?ㅎㅎ