유니티 개발 관련

unity animation clip generation for the humaniod rig

DualQuaternion 2023. 6. 21. 13:27

거의 한주간 조사한 결과물을 정리해본다.

 

내가 하려던 작업은

1. 영상을 준비

2. 영상에서 모션을 추적

3. 모션 추적 결과를 편집 

4. 편집 결과를 애니메이션 파일로 저장

의 단계를 거친다.

 

그 과정에서 알게된 것들을 몇가지 적어보자면,  

 

일단 유니티에 들어가는 캐릭터는 애니메이션 타입이라는 속성을 가진다.

한 예로 smplx 캐릭터의 경우

인스펙터 창에서 보면 generic 이라는 애니메이션 타입을 가지고 있다.

 

그리고 제작된 애니메이션의 범용적 활용을 위한 애니메이션 타입도 있는데 그게 바로

Humanoid 라는 타입이다.

 

humanoid 타입은 유니티에서 자동으로 매핑해주는 형태로 아래와 같이 생성된다. 

 

나같은 경우는 humanoid rig가 된 캐릭터를 위한 animation clip을 스크립팅으로 생성하는 방법을 찾고자 했는데, 그 과정이 너무 험난해서 돌아가는 방법을 채택했다.

 

일단 bvh importer 를 이용한 방법은 다음과 같이 진행되었다.

 1. 우선 딥러닝으로 모션을 추출하고, 그 결과를 smpl 아바타에 적용했다. 

 2. 모션을 수정하고 수정된 모션을 가지고 generig rig용 애니메이션 클립을 스크립트로 생성했다.

 3. generic rig 캐릭터에 생성한 애니메이션 클립을 적용했다.  

 4. bvh recorder 기능을 이용해서 애니메이션을 bvh로 익스포트 했다.

 

문제는 bvh importer 를 이용해서 애니메이션을 재생할 때 발생했다.

 

과정은 다음과 같다. 

휴머노이드 rig가 된 캐릭터에

bvh loader를 부착하고 작동시키면 아무 작동도 안한다. 아무 동작도 안한다기보다는 아무 클립이 안들어간 상태가 유지가 된다.

바로 이 상태...

 

그래서 bvh를 블렌더를 이용해서 fbx로 변환해보았다.  (2.93 기준의 명령어다)

blender.exe -b --python-expr "import bpy;import sys;argv = sys.argv;argv = argv[argv.index(\"--\") + 1:];bvh_in = argv[0];fbx_out = argv[0] + \".fbx\";objs = bpy.data.objects;bpy.ops.import_anim.bvh(filepath=bvh_in, filter_glob=\"*.bvh\", global_scale=1, frame_start=1, use_fps_scale=False, use_cyclic=False, rotate_mode='NATIVE', axis_forward='-Z', axis_up='Y');bpy.ops.export_scene.fbx(filepath=fbx_out, axis_forward='-Z', axis_up='Y', bake_anim=True, use_selection=True);" -- "E:/UnityProjects/DanceEditor/DanceEditor/Assets/motion.bvh"

 

 

그 결과물을 애셋 폴더에 넣으면

이런 결과물이 생성되는데, 이걸 클릭해보면 

generic rig를 위한 애니메이션 타입이 생성된 것을 확인할 수 있다.

 

그리고 이 모션을 클릭해보면

이런 형태로 애니메이션이 들어가있는 것을 알 수 있다. 이제 이 모션 클립은 위 창에서 본것과 같은 구조를 가진 캐릭터에 적용을 할 수 있을 것으로 보인다. 

 

나의 목적은 이 애니메이션을 휴머노이드 리그가 된 캐릭터에 적용하는 것이다. 

 

다시 인스펙터 창으로 가서 애니메이션 타입을 휴머노이드로 변경하고 적용한 후에

 

다른 휴머노이드 아바타를 보유한 객체의 애니메이터에 

이런식으로 모션을 세팅해주면 그럴싸 한결과물이 나온다. 

 

그리고 이녀석의 경우 

애니메이션을 확인해보면 이런식으로 이름이 들어가있는 것을 확인할 수 있다.

 

결과적으로 유니티의 휴머노이드 리그는 각 관절의 회전값이 아니고, 신체의 움직임을 기준으로 값을 기술하는걸 확인할 수 있었다.