모션 캡쳐 데이터 처리 Processing Motion Capture Data

이 튜토리얼은 모션 캡쳐 데이터를 가지고 게임에 쓸 뼈대를 에니메이션을 가공하는 방법에 관한  튜토리얼입니다.



1. 모션 캡쳐 데이터 준비하기


모션 캡쳐 데이터는 카메기 멜론 대학의 모션 캡쳐 데이터베이스에서 받은 것을 사용하도록 하겠습니다. Motion and Keyword 검색 박스에서 run을 입력하고 그 중에 3번째로 검색되어 나오는 run_09_03.c3d 파일을 이 튜토리얼에서 사용합니다. c3d(http://www.c3d.org)는 바이너리 포멧으로 1980년대 중반부터 생체 역학, 에니메이션, 보행 분석 등의 분야에서 동기화된 3D 아날로그 데이터를 기록하기 위해 사용되어 왔습니다. 

다운로드 받은 파일은 Work/Motion/c3d/ 와 같은 적절한 폴더에 넣습니다. 그리고 아래와 같이 Import를 합니다.
Ctrl+Alt+U키를 누르면 나타나는 환경 설정 창에서 c3d 플러그인을 활성화 시킵니다.



파일 메뉴에서 c3d 임포트명령을 누르고 나타나는 파일 브라우져에서 다운로드 받은 .c3d파일을 선택합니다.


로딩을 하면 위와 같이 위치 에니메이션 데이터를 가지고 있는  Empty들이 사람 모양으로 배치가 되어 있습니다. 이제 이 에니메이션 데이터들을 뼈대에 연결을 시키는 작업을 해 주어야 합니다.



2. 뼈대 만들기


개발 중인 게임에서 요구 되는 뼈대 구조가 이미 정해져 있다면 해당 뼈대를 사용하시면 됩니다. 만약 그런게 아직 없다면 휴먼 템플릿 뼈대를 아래와 같이 생성합니다.


Ctrl+Alt+U키를 누르면 나오는 환경설정 창에서 Rigify 플러그인을 활성화 시킵니다.
Shift+A키를 누르면 나타나는 Add팝업메뉴에서 Armature->Human을 선택합니다. Rigify 플러그인이 활성화 되어 있어야 이 메뉴가 나타납니다.

그러면 위와 같이 미리 정의 되어 있는 사람 뼈대가 나타납니다.


3. 루트 본에 Location Constraint 박기


3D View에서 Alt+A키를 누르면 엠티Empty들의 위치가 변화하면서 달리는 에니메이션을 볼 수 있습니다. 달리는 방향이 +X축 방향입니다. 생성한 뼈대를 같은 방향으로 맞추기 위해서 뼈대를 오른쪽 버튼을 눌러 선택하고 R키=>Z키 => 숫자 90 => Enter를 차례대로 눌러서 Z축 중심으로 90도 만큼 회전 시킵니다. 물체의 회전 방법에 대한 자세한 내용은 [블렌더 매뉴얼] 물체의 이동/회전/스케일 포스트를 참고하시기 바랍니다.


뼈대를 Z축으로 90도 회전시켰습니다.

스케일도 동일하게 맞추기 위해서 S키를 누르고 마우스를 적당히 움직여서 뼈때의 스케일을 키웁니다. 키패드 3키를 눌러서 오른쪽 바라보기로 카메라를 이동하고 키패드 5키를 눌러서 직교투영 카메라로 변경하면 크기를 맞추기가 수월합니다.


스케일을 조정하여 엠티들이 형성하는 사람 크기와 맞추었습니다.

이제 루트 본에 Location Constraint를 박아서 엠티들이 뛰어갈때 본도 같이 움직이도록 만들겠습니다. 엠티들 중에서 엉덩이쪽에 있는 녀석을 하나 찾아야합니다. 이름이 COX입니다.

엉덩이에 있는 COX 엠티. 이 녀석이 루트입니다.


COX라는 이름을 기억하고 계세요. 이제 뼈대를 선택하고 Ctrl+ Tab키를 눌러 포즈 모드로 들어간 후에 뼈대의 루트본인 hips본을 선택합니다. 그리고 속성 윈도우의 본 콘스트레인트 컨텍스트에서 Copy Location을 추가하고 타겟을 좀 전에 점찍어 두었던 COX를 지정합니다. 이렇게 하면 COX가 움직일 때 그 위치가 hips본으로 복사가 되어 뼈대도 함께 움직이게 됩니다.


hips 본에 Copy Location Constraint를 추가합니다.


이제 Alt+A키를 눌러서  플레이를 해보면 뼈대가 COX 엠티를 따라 움직이는 것을 보실 수 있습니다.

  

4. 나머지 본에 Inverse Kinematic 적용하기


뼈가 COX 엠티를 따라 움직이기는 하는데 팔 다리 등 다른 뼈들은 그대로 고정이 되어 있습니다. 이제 팔/다리도 에니메이션을 시켜주기 위해서 팔/다리 본에 해당하는 엠티들을 찾아서 Inverse Kinematic Constraints를 만들어 주어야 합니다.


먼저 왼쪽 다리 무릎에 해당하는 엠티를 찾아야합니다. 타임라인에서 왼쪽 드래그로 타임바를 이동시켜서 왼쪽 다리를 구성하는 엠티들과 오른쪽 다리를 구성하는 엠티들이 겹쳐지지 않는 적당한 프레임을 선택합니다.

왼쪽 무릎에 해당하는 엠티들. 이 중에 가장 적절한 위치에 있는 놈을 집어야 합니다.

왼쪽 무릎 부분에 존재하는 엠티들을 클릭하고 카메라를 회전시켜 보면서 적당한 위치에 있는 엠티가 선택되었는지 확인해 봅니다. 카메라 회전에 관한 자세한 사항은 [블렌더 매뉴얼] 3D View 카메라 조작하기 포스트를 참고하시기 바랍니다. 회전이 원하는 대로 되지 않을 때는 키패드의 .키를 사용하여 회전 중심을 현재 선택된 물체 위치로 바꿀 필요가 있습니다.

LTIB1라는 엠티를 찾으실 수 있을 것입니다. 이제 이 녀석을 타겟으로 하는 Inverse Kinematic Constraint를 왼쪽 허벅지 뼈에 설정합니다. Location Constraint를 만들 때와 마찬가지로 뼈대를 선택한 후에 Ctrl+Tab키를 눌러 포즈 모드로 들어갑니다. 그리고 본 콘스트레인트 컨텍스트에서 Inverse Kinematic Constraint를 추가합니다.

Add Constraint 버튼을 눌러서 Inverse Kinematic Constraint를 추가하고 타겟을 좀 전에 찾아두었던 왼쪽 무릎에 해당하는 엠티인 LTIB1를 지정합니다. 그리고 Chain Length를 1로 설정합니다. 기본으로 0으로 설정이 되어 있는데 이것은 현재 뼈 뿐만 아니라 본 체인에 있는 모든 본에 영향을 미치게 됩니다. 우리는 오직 허벅지 본에만 이 Constraint를 적용할 것임으로 1로 변경합니다.


이제 나머지 본들도 모두 적절한 엠티들을 찾아서 Inverse Kinematic Constraint를 걸어줍니다. 아래는 각 본에 해당하는 엠티들의 이름이니 참고하시기 바랍니다.


thigh.L(왼쪽무릎) : LTIB1
thigh.R(오른쪽무릎) : RTIB1
shin.L(왼쪽정강이) : LTIB15
shin.R(오른쪽정강이) : RTIB15
heel.L(왼쪽뒤꿈치) : LHEE
heel.R(오른쪽뒤꿈치) : RHEE
foot.L(왼발) : LFO0
foot.R(오른발) : RFO0
toe.L(왼발가락) : LTO0
toe.R(오른발가락) : RTO0
hips(엉덩이) : LBK4
spine(척추) : UBK1
ribs(가슴) : LNK4
neck(목) : UNK1
head(머리) : TH1
shoulder.L(왼쪽어깨) : LHUM2
shoulder.R(오른어깨) : RHUM2
upper_arm.L(왼쪽상박) : LELB
upper_arm.R(오른상박):  RELB
forearm.L(왼쪽팔뚝) : LFRM
forearm.R(오른쪽팔뚝) : RFRM

모션 캡쳐 데이터는 위에서 살펴본대로 본에 직접 연결을 시켜주어서 사용하기도 하지만 숙련된 에니메이터는 불러들인 엠티들을 참고용으로만 사용하고 직접 손으로 에니메이션을 만들기도 합니다. 사람이 연기를 한 동작을 그대로 쓰기 보다는 조금 더 과장된 동작을 원하는 경우가 많기 때문입니다.


아래 동영상은 여기까지 작업을 한 결과물 입니다.






5. 애니메이션 굽기


이제 애니메이션을 구워야Bake 합니다. 블렌더 레이아웃을 Animation Layout으로 변경하고, 3D View 포즈 모드에서 모든 본을 선택합니다. Space키을 누르면 나타나는 명령 검색 창에서 Bake Action을 검색하여 명령을 내립니다. 시작프레임을 0으로 설정하고 끝프레임을 34로 설정합니다. 스텝을 4 프레임 정도로 선택합니다.

애니메이션 레이아웃으로 변경합니다.

포즈모드에서 모든 본을 선택하고 스페이스바를 누르면 나타나는 명령 검색창에서 Bake Action을 검색하여 클릭합니다.

시작 프레임, 끝 프레임, Frame Step을 선택합니다. Frame Step은 몇 프레임마다 에니메이션 정보를 베이크 할 지를 결정합니다. 움직임이 격한 에니메이션을 베이트 할 경우나 혹은 하이 퀄리티의 데이터를 뽑아내고 싶을 경우 낮은 수를 설정하시기 바랍니다. 게임에서 사용할 달리기 에니메이션 정도는 4프레임 정도 설정하시면 괜찮습니다.

이제, DopeSheet 윈도우에서에서 Acjtion Editor를 선택하면 새로운 액션인 'Action'이 추가된 것을 확인할 수 있습니다. Action이라고 쓰여진 텍스트 상자를 클릭하여 run으로 이름을 변경합니다.


DopeSheet 윈도우에서 헤더에 있는 버튼을 이용해서 Action Editor로 변경하고 Action이라고 쓰여진 텍스트 박스를 클릭하여 이름을 run으로 변경합니다.


이제 run에니메이션 정보가 만들어 졌습니다. 그런데 굽는 과정이 왜 필요할까요? 이 과정은 게임용 데이터로 사용하기 위해서 뿐만 아니라 애니메이션을 만들 때도 필요한 과정입니다. 임포트 된 모션데이터(엠티들)은 오직 한 방향으로 +X축으로만 달려가고 있습니다. 이것을 다른 방향으로 달려가게 하고 싶다면 이렇게 에니메이션을 구워서 뼈에 회전 정보를 박아주어야 합니다. 이제 뼈에 회전 정보들이 박혀 있기 때문에 엠티들이 없어도 에니메이션이 동작하게 되며 원하는 방향 어디로든 달려가게 할 수 있습니다.


지금까지 작업한 내용은 백업을 해두시고 다른 이름으로 저장을 해서 다른 파일에서 게임 데이터용으로 가공을 해보도록 하겠습니다.



6. 게임용으로 가공하기


먼저 이제 필요 없어진 엠티들을 싹 제거합니다. 오브젝트 모드에서 Select 메뉴의 Select All by Type 명령을 내려서 Empty들을 모두 선택한 후에  X키를 눌러서 삭제합니다.


게임용으로 사용하기 위해서는 캐릭터의 위치가 움직이면 안됩니다. 위치 이동을 없애기 위해서 Action 툴에서 hips 본을 선택하고 X/Y/Z Location 키 값들을 모두 삭제해 줍니다.

오브젝트 선택/삭제와 동일한 방법으로 B키+왼쪽 드래그로 선택, B키 + 가운데 버튼 드래그로 선택해제를 할 수 있고 X키를 눌러서 해당 키를 삭제할 수 있습니다. hips 본의 X/Y/Z Location을 선택하여 삭제합니다.

이렇게 Location Key들을 모두 삭제하면 캐릭터가 더 이상 움직이지 않습니다. 만약 현재 뼈대의 위치가 원점이 아니라면 3D View의 포즈 모드에서 hips 본을 선택하고 Alt+G키를 눌러 Location값을 초기화 해줍니다. 이제 플레이를 해보시면 원점에서 제자리 달리기를 하고 있을 것입니다.



다음 단계는 로테이션을 원래대로 되돌리는 단계입니다. 뼈대와 임포트된 모션 데이터의 방향을 맞추기 위해 Z축으로 90도를 회전시켰었습니다. 이제 오브젝트 모드에서 뼈대를 선택하고 Alt+R을 눌러 로테이션을 초기화 합니다.



다음 단계는 에니메이션을 반복적으로 만들어 주는 단계입니다. 0번 프레임의 모든 키를 선택하여 Shift+D키로 복사를 한 후에 23 프레임에 배치를 하면 0~22프레임을 반복 재생함으로써 무한 달리기 애니메이션을 게임에서 플레이할 수 있습니다.


녹색 사각형안의 키를 오른클릭하면 0번 프레임의 모든 키들을 선택할 수 있습니다. 선택을 한 후에 Shift+D키를 누르면 복사가 되고 Grab상태가 됩니다. 바로 숫자키 23을 누르고 엔터키를 누르면 23프레임에 배치가 됩니다.

이제 속성 윈도우의 렌더 컨텍스트에서 시작프레임을 0으로하고 끝 프레임을 22로 설정하고 Alt+A키를 누르면 무한 반복 달리기를 보실 수 있습니다.



시작프레임 끝 프레임을 설정하고 Alt+A키를 누르면 무한 반복 달리기 에니메이션이
플레이됩니다.

댓글

이 블로그의 인기 게시물