-
[UE5] 블렌더로 루트 모션 애니메이션 만드는 방법언리얼엔진/그 외 2024. 1. 25. 17:37
이 주제와 관련된 질문글을 봤는데 관심이 생겨서 방법을 연구해봤다.
기억해두면 나중에 도움이 될거같아서 정리해둔다.
블렌더 오브젝트를 언리얼 엔진으로 임포트 해주는 블렌더 애드온인 Send to Unreal을 사용해서 에셋을 임포트하겠다.
https://github.com/EpicGamesExt/BlenderTools
GitHub - EpicGamesExt/BlenderTools: Blender addons that improve the game development workflow between Blender and Unreal.
Blender addons that improve the game development workflow between Blender and Unreal. - EpicGamesExt/BlenderTools
github.com
애니메니션은 Mixamo에서 루트 모션으로 사용할만한 애니메이션을 골랐다.
모든 스켈레톤이 루트 모션에 적합한건 아니다.
믹사모에서 다운받은 애니메이션도 마찬가지다.
이런 에셋을 이용해서 루트 모션을 적용하려면 먼저 루트 모션이 무엇인지 이해해야한다.
루트 모션은 스켈레톤의 루트 본에 이동하는 애니메이션이 있는 경우에 사용한다.
이런 경우에 루트 모션을 적용하지 않으면 캐릭터의 스켈레탈 메시는 이동하더라도 실제 위치는 이동하지 않으므로 애니메이션이 끝나면 원래의 위치로 되돌아오게 된다.
또한 스켈레탈 메시가 벽과 부딪히더라도 캐릭터의 캡슐 콜리전은 부딛치지 않으므로 벽을 통과해서 이동하듯이 보일 수도 있다.
루트 모션을 적용하면 루트 본은 이동하지 않고 고정되지만, 루트 본에 적용되어있던 애니메이션을 캐릭터의 캡슐 컴포넌트에 적용해서 캐릭터를 움직이게 한다.
캡슐이 직접 움직이므로 콜리전의 영향을 받아서 벽과 부딪치면 막히게 되고, 벽을 뚫고 지나가는 문제는 발생하지 않는다.
여기에서 중요한 점은 루트의 애니메이션을 사용한다는 점이다.
믹사모에서 다운받은 파일을 그대로 언리얼 엔진에 임포트 하면 스켈레톤의 계층 구조는 아래와 같이 나온다.
루트 본은 Hips고, 오른쪽을 보면 빨간색 선이 있는걸 확인할 수 있다.
빨간색 선은 스켈레톤에 존재하는 본이 아니고, 루트 본이 원점에서 저 만큼 떨어져있다는걸 보여준다.
그리고 Hips 본은 deform 본인데 이런 경우 루트 모션을 사용할 때 문제가 생긴다.
루트 모션은 루트 본을 고정시키므로 루트 본이 deform 본이면 이 본과 연결된 메시도 고정된다.
원래는 아래와 같은 애니메이션이지만, 루트 모션을 켜면 골반이 고정된 상태로 팔 다리만 허우적 거리는 모습을 보게 된다.
루트모션을 켜면 이렇게 된다.
실제로 적용해보면 이렇게 된다.
캐릭터의 골반이 고정되어있어서 모션이 어색해지고, 골반의 회전 애니메이션이 캡슐에 그대로 적용되어 캡슐이 기울어지게 된다.
따라서 루트로 사용할 새로운 본을 추가해서 그 루트 본에 애니메이션을 넣는게 기본적인 해결 방법이다.
믹사모에서 다운받은 파일을 그대로 임포트 하면 이런 문제가 발생하므로 블렌더같은 프로그램을 한번 거쳐서 언리얼 엔진에 맞게 수정한 다음 언리얼 엔진에 임포트 해야한다.
블렌더의 오브젝트를 언리얼 엔진으로 보낼때 주의할 점이 있다.
스켈레톤을 보내는 경우 블렌더의 오브젝트가 루트 본이 된다.
따라서 이 방법을 쓸 때에는 새로운 본을 추가하지 않아도 된다.
예시로 믹사모에서 다운받은 fbx 파일을 블렌더에 임포트하면 아래와 같은 아마추어가 생성된다.
이 아마추어의 본 계층을 보면 루트 본으로 Hips가 있고 이건 언리얼 엔진에 바로 임포트 했을때와 마찬가지다.
하지만 이걸 Send to Unreal 애드온을 통해 언리얼 엔진으로 보내면 루트본이었던 Hips 본 상위에 root 라는 본이 추가된다.
사실 root 본이 새로 생기는 것이 아니라 아래 이미지에서 Armature라는 오브젝트가 루트 본이 되는건데 겉으로 보기에는 root 본이 새로 추가되는것 처럼 보인다.
블렌더에서의 본 계층 구조 Send to Unreal 애드온으로 블렌더에서 언리얼 엔진으로 보낸 후의 본 계층 구조 따라서 애니메이션을 수정하지 않고 그대로 언리얼 엔진에 보내면 아래와 같이 루트 모션으로 사용할 수 없게 된다.
루트에 이동하는 애니메이션이 있다면 빨간색 선으로 표시해주지만, 이 경우에는 새로 생긴 root 본에는 애니메이션이 없어서 빨간색으로 표시되지 않는다.
대신에 그 하위 본인 Hips 본에 애니메이션이 있으므로 루트 모션을 적용해도 결과는 그대로다.
따라서 루트 모션을 적용하고 싶다면 블렌더의 본이 아니라 오브젝트에 애니메이션을 넣어야한다.
위에 썼듯이 언리얼 엔진에 보낼때 생성되는 root 라는 본은 사실 블렌더의 오브젝트이기 때문이다.
참고로 블렌더의 메시 오브젝트는 개별 스켈레탈 메시로 임포트 되므로 둘을 Join 하고 이름도 맞춰주면 좋다.
Beta_Joints와 Beta_Surface를 Join해서 하나로 만들고 이름을 SK_Mixamo로 변경
이제 블렌더에서 애니메이션을 수정해서 보내야 한다.
참고할 원본 레퍼런스가 필요하므로 아마추어를 복제한다.
아마추어에 적용되어있던 애니메이션도 복제되므로 애니메이션까지 복제할 필요는 없다.
만약 안되었다면 애니메이션도 복제해서 레퍼런스로 사용될 원본을 따로 남겨둬야한다.
구분을 위해서 애니메이션 이름을 바꿔두면 좋다.
먼저 루트모션으로 사용될 아마추어의 애니메이션을 만든다.
루트 모션은 원하는대로 만들수있다.
여기에선 기존의 애니메이션이 있으므로 Hips 본 위치의 x와 y좌표를 따라가는 애니메이션을 아마추어에 추가하겠다.
아마추어에 추가하는 루트 모션은 언리얼 엔진에서 캐릭터가 실제로 움직이게 될 경로이므로 평면을 따라 이동하게 한다.
Hips 본에 있는 에니메이션에서 xy평면을 따라 이동하는 애니메이션을 가져와서 아마추어로 옮겨야한다.
따라서 아마추어는 복제해뒀던 원본 애니메이션의 Hips 본을 따라가게 Constraint를 추가한다.
이렇게 하면 수정할 애니메이션의 Hips 본에 적용되어있었던 애니메이션 키 프레임들을 삭제해도 된다.
Armature라는 아마추어에 Child Of 라는 Constraint를 추가해서 Original 아마추어의 Hips 본을 따라가게 만들고, Location의 x랑 y만 따라가게 만들어서 평면을 따라 이동하게끔 했다.
주의할 점은 Armature 오브젝트에 Constraint를 추가한 것이고, 본에 추가한게 아니라는 점이다.
위 이미지 오른쪽 하단의 프로퍼티 창의 탭을 보면 Constraint 탭이 두개 있는데 현재 선택되어있는 Constraint 탭이 오브젝트의 Constraint고, 그 아래에 있는 뼈 그림이 추가된 Constraint 탭은 본의 Constraint다.
그 다음 Hips 본에 있던 애니메이션 키프레임을 모두 지운다.
필수는 아니지만 진행 과정을 직관적으로 이해하는데에 도움이 된다.
지우기 전 지운 후 그러면 애니메이션이 아래처럼 된다.
원본 애니메이션과 겹쳐있어서 구분이 잘 안될수도 있지만 잘 보면 평면을 따라 움직이는 애니메이션이 있다.
파란색 외관선이 표시된 본을 보면 된다.
애니메이션을 수정해서 이렇게 만들면 된다.
루트 모션으로 사용될 Armature의 애니메이션은 이것으로 끝났다.
다음은 수정된 Hips 본의 애니메이션을 원본의 Hips 본을 따라가게 만들면 된다.
수정할 Hips 본에 본 Constraint를 추가해서 원본의 Hips 본 트랜스폼을 그대로 복사해서 적용한다.
이때 Target과 Owner 둘 다 월드 스페이스의 위치를 기준으로 복사한다.
이렇게 하면 아래처럼 원본과 차이가 없어진다.
Mix 옵션을 Replace로 하면 기존의 애니메이션을 덮어쓰기 때문에 이전에 했던 Hips 본의 애니메이션 키 프레임들을 지우는건 필수가 아니다.
이렇게 수정된 애니메이션을 Bake Action으로 구우면 끝이다.
Bake Action 설정은 아래와 같이 한다.
Constraint가 적용된 최종 결과를 애니메이션에 적용해야하므로 Visual Keying을 켜고,
여기에서는 Constraint가 더이상 필요 없으므로 Clear Constraints도 켰다.
그리고 중요한 점은 Bake Data에서 Pose와 Object 둘 다 선택해야한다는 점이다.
둘 다 선택해야 Armature 오브젝트에도 애니메이션이 추가된다.
쉬프트 키를 누른상태로 클릭하면 둘 다 선택할 수 있다.
Bake하면 Action이라는 애니메이션이 새로 생긴다.
결과를 확인해서 적용이 제대로 됐고 원본과 차이가 없어보인다면 언리얼 엔진에 보내면 된다.
언리얼 엔진에서는 이렇게 보여야한다.
루트가 이동한다는 뜻인 빨간색 선이 보이고, 그 선이 평면을 따라 이동해야한다.
루트 모션을 적용하면 아래처럼 된다.
최종 결과는 아래처럼 된다.
조금 응용하면 이렇게도 가능하긴 하다.
루트 모션을 제대로 만들지 못해서 어색하게 보이지만 z축으로도 움직이게 만들수있다.
루트 모션을 재생하기 전에 캐릭터 무브먼트의 무브먼트 모드를 Flying으로 변경하면 z축으로 올라가는 루트모션도 사용할수있다.
'언리얼엔진 > 그 외' 카테고리의 다른 글
[UE5] C++로 애니메이션 시퀀스 변경, 커브 추가 (0) 2024.07.03 [UE5] 캐릭터 무브먼트 컴포넌트 작동 순서 정리 (0) 2024.06.13 [UE5] USTRUCT의 NetSerialize (1) 2024.03.12 [UE5] Enhanced Input Binding with Gameplay Tags C++ (0) 2024.01.21 [UE5] 시퀀스 이밸류에이터에 대해 (0) 2023.08.19