이것 저것 개발하고 만들어보기
article thumbnail

 

 

 

기존에 쓰던 바이패드 애니메이션을 따와서 Rindo 아바타와 휴머노이드로 연동하면 생기는 현상

 

 

 

최근 VRChat 버튜버들이 많이 등장하면서 VRChat 내부에 있는 아바타들이 각자의 개성을 가지고 많은 컨텐츠들을 생산하고 있고 저 또한 VRChat 모델링과 애니메이션에 관심이 많았습니다.

 

 

또한 VRC SDK에 있는 Descriptor 를 통해서 유니티 기반의 다양한 애니메이션 커스텀이 가능하며 여러가지 기능구현 또한 가능해서 커뮤니티 게임인데도 불구하고 꽤나 자유로운 커스터마이징이 가능했습니다.

 

 

그런데, Booth 같은 에셋 플랫폼에서는 모델링도 굉장히 많고 업로드나 인게임 내 편의성을 위한 스크립트나 그 외 VRC의 SDK만을 위한 유니티 스크립트도 존재하는데, 애니메이션 관련 에셋은 굉장히 제한적이고 적으며 애니메이션을 만들기 위해서는 블렌더나 U Motion을 써서 애니메이션을 만드는 것 외에는 다른 가이드라인이 별로 없었습니다.

 

 

유저가 직접 풀 트래킹을 착용해 모션을 직접 보여주는 VRC 특성상 애니메이션이 별로 부각되지 않는데, 최근 VRC 아바타들이 다른 곳에 활용되는 것을 보면서 해당 아바타들의 활용도가 높아졌습니다.

 

 

개인 모션캡쳐 장비인 Vive나 Oculus 같은 모션캡쳐 장비를 사용해 애니메이션을 구현하는 것에도 한계가 있으니, 저에게 꽤 익숙한 바이패드와 3D MAX를 통해 직접 아바타 애니메이팅을 하는것이 어떨까... 하는 취지에서 나름대로 연구를 해보았습니다.

 

 

 

研究目的のVRCモデリングを提供してくださったLINT様に感謝します。

 

 

기본적으로 리깅을 하기 위해서는 각자 아바타들이 가지고 있는 모델링 체형에 주목할 필요가 있습니다.

 

그런데 Booth에서 주로 쓰이는 인기 모델들을 살펴보면 기본적인 본 계층구조는 휴머노이드 사용을 위하여 거의 동일하나, 각자의 체형과 본의 정렬, 심지어는 비슷한 체형이라도 팔길이나 다리 길이, 관절의 형태와 축의 정렬이 죄다 제각각 입니다.

 

다른 유저가 같은 모델로 다르게 디자인한 프리셋만 해도 엄청난 경우에 수가 나오니, 사실상 해당 아바타가 가진 리깅 구조는 가급적 유지한 채로 바이패드로써 컨트롤 하는게 가장 좋을 것 입니다.

 

 

 

 

 

 

그런데 사실 그냥 애니메이션만 만들어 포트폴리오로 쓰거나 씬 애니메이팅만 하려고 한다면 가장 간단명료한 방법은 맥스의 바이패드를 쓰기 위해서 VRC 아바타의 스킨 데이터를 초기화 하고 바이패드를 통해 다시 리깅하면 됩니다.

 

 

 

 

하지만 이렇게 한다면 다음과 같은 문제가 발생합니다.

 

 

1. Booth나 다른 에셋 플랫폼에서 판매하는 해당 아바타의 전용 에셋들을 내가 바이패드를 쓰기 위해 재 리깅한 형태로 전부 다시 리깅해 주어야 한다.

 

2. VRC에서 기본 제공하는 애니메이션의 휴머노이드 계층구조나 축의 위치가 달라지게 되면서 일부 애니메이션이 엉성하게 작동되거나 문제가 발생할 수도 있다.

 

3. 해당 아바타 제작자가 업데이트를 계속 하면서 일부 쉐이프키나 체형, VRC에 대응하는 여러가지 기능 구현에 대한 지원을 받을 때마다 에셋과 함께 리깅값을 다시 복사해 주는 귀찮은 과정을 거쳐야 한다.

 

4. 이를 VRC 내부에서 이용하려고 한다면, VRC가 기본적으로 제공하는 Phys Bone이나 기타 스크립트들을 재설정 해주어야 한다.

 

 

 

이렇게 바이패드로 재 리깅하여 쓰는것도 방법이나 이를 VRC에 다시 이용하려 하거나 현재 리깅한 캐릭터 이외의 캐릭터도 똑같은 절차를 거쳐야 하는등 아주 귀찮고 시간이 걸릴 수 밖에 없습니다.

 

 

그래서 가급적이면 바이패드가 컨트롤러 역할을 하고 기존 리깅을 유지한 스켈레톤을 움직여 애니메이팅하는것이 가장 최적의 방법이라 판단해 스키닝을 다시 하지 않으면서도 최대한 아바타를 바이패드로 컨트롤 해 보려 합니다.

 

 

 

 

 

 

휴머노이드 애니메이션을 위해 최소한의 베이스 본만을 사용해 바이패드와 컨트롤러로 연결시켜 주기 위해서는 아바타가 가지고 있는 베이스 본의 모양과 바이패드 모양을 일치 시켜주어야 합니다.

 

그러기 위해서 휴머노이드에서 동작하는 최소한의 베이스 스켈레톤과 체형만을 남긴 뒤, 3D MAX로 임포트 시킵니다.

 

하지만 3D MAX로 리깅을 해 보신 분들이라면 알겠지만, 바이패드를 특정 위치로 정렬시키는건 불가능합니다.

 

얼라인 기능으로 정렬을 시키려고 해도 애당초  바이패드는 스크립트 기반이라 스트럭쳐 구조에 맞춰 팔다리는 아예 고정되어 있기 때문에 정렬도 안되거니와, 피겨모드에서 직접 손으로 스케일을 늘려 위치를 맞춘다고 하더라도 한계가 있습니다.

 

 

 

 

 

 

 

그래서 사용해 볼 맥스 스크립트는 FBX to Biped 라는 특정 위치에 바이패드의 형태를 타겟팅 시켜주는 유용한 스크립트 입니다.

 

해당 스크립트에 대한 정보는 아래 링크에서 사용할 수 있습니다.

 

 

 

 

 

FBX to Biped | ScriptSpot

Date Updated:  02/28/2016 Author Name:  Lee Sang-won You can convert FBX animation to Biped with this script Version Requirement:  3ds Max 2014 Links

www.scriptspot.com

 

 

현재 청강대학교 교수로써 전임중이시며 '캐릭터 셋업 테크닉'의 저자 이상원 님이 직접 제작한 스크립트입니다.

 

간단하게 설명하면, 이 툴은 FBX로 구성된 스켈레톤과 바이패드를 지정해 베이스 스켈레톤의 모양과 바이패드를 거의 일치시켜주는 스크립트로, 주로 다른 리깅 구조를 바이패드와 일치시키기 위하여 사용하는 툴 입니다.

 

스크립트의 대략적인 사용법은 해당 링크의 유튜브 영상에 있습니다.

 

현재 제가 하려는 VRC 아바타의 스켈레톤에 바이패드를 일치시켜야 함으로, 이보다 더 좋은 스크립트가 아닐 수 없습니다...

 

 

 

 

 

 

FBX to Biped를 쓰기 위해서는 리타게팅 하고자 하는 축과 원본을 로컬스페이스에서 일치시켜야 합니다.

 

상박 본으로부터 바이패드는 X Forward, -Z UP 이므로 FBX도 이와 같이 축을 바꿔줘야 바이패드가 무리없이 맞물려 들어갑니다.

 

하지만 이미 리깅된 FBX 파일은 Y Forward, X UP  인 시점에서 해당 FBX 본을 직접 바이패드와 맞춰주게 된다면...

 

 

 

 

 

 

원본 FBX 파일은 리깅이 이미 되어있기 때문에 리깅된 본의 축이 바뀐다면 다음과 같은 괴현상을 목격할 수 있습니다.

 

이렇게 된다면 바이패드를 컨트롤러 역할로 쓸 수는 있더라도 이미 찌그러진 모델링을 3D MAX에서 애니메이팅 하는것은 의미가 없기 때문에 이 경우에선 FBX 타겟을 헬퍼로 대신하는것이 좋습니다.

 

 

 

좌 : 헬퍼의 로컬 축 /우 : 원본 FBX 파일의 로컬 축

 

 

 

포지션과 로테이트를 정렬시켜주고, Forward 와 UP 의 축 정렬을 바이패드와 일치시키는 작업을 해 줍니다.

 

이렇게 하면 위치는 본과 맞물려 들어가고, 로테이션 정렬은 바이패드를 기반으로 하기 때문에 모든 계층구조가 문제없이 맞물려 들어갑니다.

 

 

 

 

 

모든 관절 부위에 각 관절에 대응하는 헬퍼를 만들어 주고, 해당 위치 헬퍼는 해당 관절의 자식으로써 링크를 걸어줍니다.

 

이렇게 링크를 해주는 이유는 애니메이팅의 편리함을 위해서도 있지만, 같은 휴머노이드를 공유하는 아바타들 계층구조가 이름만 다를 뿐 구조는 똑같아 본의 이름만 같게 해주면 해당 헬퍼를 다른 프로젝트에 Merge 하는것으로 각 관절의 위치에 바이패드로 정렬된 헬퍼를 계속해서 돌려 쓸 수 있습니다.

 

3D MAX의 Merge에 대해서는 예전에 다룬적이 있습니다.

 

 

 

[3D MAX] Merge 기능 활용하기

각자 다른 파일의 작업 사항을 하나의 MAX 파일로 합쳐주는 머지(Merge) 기능은 미리 만들어 둔 작업물을 다른 작업물에 불러와야 할 때 유용하게 사용 할 수 있습니다. 새 프로젝트에 이전에 쓰였

tintana4168.tistory.com

 

[3D MAX Rigging] Biped 중간본을 Merge 하기

2022.08.25 - [3D MAX/3D MAX Basic] - [3D MAX] Merge 기능 활용하기 [3D MAX] Merge 기능 활용하기 각자 다른 파일의 작업 사항을 하나의 MAX 파일로 합쳐주는 머지(Merge) 기능은 미리 만들어 둔 작업물을 다..

tintana4168.tistory.com

 

 

 

 

 

 

 

심지어 FBX to Biped에서는 관련 설정값을 저장하고 불러올 수 있는 기능이 있는데, 이것은 이름으로 인식하기 때문에 헬퍼의 이름을 통일해두고 사용하면 편리합니다.

 

다른 모션 캡쳐 데이터에도 응용할 수 있고 늘어난 본이나 줄어든 본은 바이패드 스트럭처를 바꾸고, FBX to Biped의 목록에서 찾아서 삭제하거나 늘리면 되서 좀더 빠른 작업이 가능해집니다.

 

 

 

 

 

다른 아바타들이나 모델링은 아닐 수도 있지만 현재 이 VRC 모델의 경우 Root 다음에 바로 리깅된 Hip 본이 존재합니다.

 

그리고 이 Hip 본은 바로 Spine이랑 이어지기 때문에, 바이패드 스트럭쳐에서 척추 관절을 Hip 본이랑 매칭시켜주었습니다.

 

이것은 현재 이 FBX 파일은 바이패드 기반이 아니기 때문에 바이패드를 이용해 애니메이팅을 하기 위해서는 Pelvis 를 컨트롤러에서 아예 제외시키고, Spine0 을 이 모델의 Hip으로 대신합니다.

 

애니메이팅 할 땐 바이패드 특성상 어짜피 Pelvis 본을 굳이 움직이지 않습니다.

 

개인적으로는 엔진에 임포트시킬 목적으로 리깅을 하던, 애니메이션 포트폴리오나 씬 애니메이션을 위한 리깅을 하던 트위스트 스파인이 적용 가능한 시점에서  Spine0 을 Hip 으로 리깅합니다.

 

바이패드 Com의 루트가 없는 이 FBX 파일은 바이패드가 Com의 위치를 찾아 타게팅 될 수 있게 헬퍼를 새로 생성해서 다리 사이에 정렬시켜주고, Pelvis도 바이패드 축에 맞취 같은 위치에 다른 축 방향으로 회전해 줍니다. 

 

이렇게 하면 Com이 없는 바이패드 기반의 리깅 데이터가 아니더라도, 바이패드와 어느정도 모양새를 맞춰 줄 수 있습니다.

 

 

 

 

 

 

만약 FBX의 계층구조가 월드 기준 X나 Y축이 서로 다른데 해당 관절의 로테이션이 적용되어 있지 않으면 헬퍼에 Look at Contraint 를 걸어서 위치가 다른 관절을 바라보며 축이 정렬되게 업로드본을 지정해 줍니다.

 

이렇게 하면 FBX to Biped가 작동 될 때 헬퍼에 적용된 로테이트를 통해서 좀더 정확히 헬퍼와 바이패드가 정렬됩니다.

 

 

 

 

 

 

모든 헬퍼 세팅이 다 끝났으면 FBX to Biped 의 Figure Sync 를 통해 모양새가 맞춰진 바이패드를 참조하기 위하여 Position과 Rotation의 Constraint 를 바이패드에 걸어 바이패드의 움직임을 리깅된 본이 참조 할 수 있도록 합니다.

 

 

 

 

 

 

 

이후 모든 본의 Constraint 세팅이 끝났다면, 바이패드를 직접 움직여 모든 본이 정상작동하는지 확인합니다.

 

 

 

 

 

 

 

 

 

애니메이션을 제작하고 리깅된 본과 모델링만을 빼낸 뒤, 각 엔진에서 모델링과 애니메이션이 잘 연동되는지도 확인합니다

 

 

이렇게 3D MAX에서도 헬퍼와 스크립트를 적극 사용하여 바이패드를 통해 애니메이션과 대응할 수 있도록 만들어 줄 수 있습니다. 

 

VRC를 예로 들어서 제작하긴 했습니다만, 굳이 VRC가 아니더라도 다른 리깅 데이터를 활용한 모델링에서도 부득이하게 바이패드를 FBX 파일에 매칭시켜야 할 때, FBX to Biped를 적극 활용하고 몇가지 컨트롤러를 이용하는 것으로 기존에 이용하던 바이패드를 통해서 애니메이팅 작업이 가능해집니다.

 

 

조금 두서없이 쓴 것도 있는데 긴글 읽어주셔서 감사합니다. 다음엔 좀더 유익한 포스팅으로 돌아오겠습니다!

 

profile

이것 저것 개발하고 만들어보기

@Tintana'k