VRChat/VRChat 아바타 강좌

5. 3D모델 기초

FakeZero 2023. 12. 20. 16:15

5. 3D모델의 기초


  가장 먼저 알아볼 것은 3D 모델, 즉, FBX 파일에 대해서이다.

  3D 모델 파일인 FBX 파일은 생각보다 많은 정보를 가지고 있다. 본 강좌에선 무료 3D 모델링 프로그램인 Blender를 사용하는데 독자 여러분들이 설치할 필요는 없다.

왼쪽부터 점, 선, 면

  3D 모델의 메시(Mesh), 즉, 모양은 총 4가지 요소로 구성되어 있다. 점(Vertex), 변(Line), 면(Face), 그리고 전체다. 변은 2개의 점으로만 이루어지고 면은 최소 3개 이상의 점, 3개 이상의 변으로 이루어진다.

 

  -3D 모델의 기준점(Center, Pivot)

  3장에서 설명한 '기준점'에 대해서 설명하도록 하겠다. 이 기준점은 Blender와 같은 3D 모델링 프로그램에서 임의로 설정하는 것이 가능하기 때문에 모든 3D 모델의 기준점이 메시의 중점이라고는 할 수 없다.

  잠깐 Unity에 돌아가서 3D 모델을 불러온 오브젝트를 잘 보면 파일의 이름으로 되어있는 부모 오브젝트 안에 메시가 적용된 진짜 3D 모델 오브젝트가 있음을 알 수 있으며 이때, 부모 오브젝트와 자식 오브젝트의 기준점이 다른 것을 알 수 있다. 즉, FBX 파일을 오브젝트로 만들면 FBX 파일 이름의 Prefab이 생성되고 자식 오브젝트로써 3D 모델 오브젝트가 적용되는 것이다(단, 파일안에 있는 메시 데이터가 하나 뿐이라면 하나의 오브젝트로 된 프리팹이 생긴다.). 물론 자식 오브젝트를 부모 오브젝트 밖으로 꺼내도 문제가 없을 뿐더러 대부분의 경우 아바타 수정을 위해 프리팹을 해제하고 수정하는 경우가 더 많다.

 

  자식 오브젝트, 즉, 메시 정보를 가지고 있는 오브젝트의 경우 3D 모델링 프로그램에서 임의로 지정한 기준점을 사용하지만 부모 오브젝트 쪽의 경우 사용되는 기준점은 3D 모델링 프로그램에서 FBX 파일을 추출할 때의 시점에서 (0, 0, 0) 좌표를 부모 오브젝트의 기준점으로 사용한다. VRC Avatar Descriptor 컴포넌트는 부모 오브젝트 쪽에 적용되기 때문에 FBX 파일을 만들 때에는 이 점을 충분히 유의해서 만들어야 한다.

 

  말로는 체감하기 힘드니 직접 3D 모델링 프로그램과 Unity를 통해 보도록 하겠다. 본 글에서는 이해를 돕기 위해 메시 데이터가 2개 존재하는 모델을 준비했다.

  우선 이렇게 큐브와 스피어가 하나씩 있는 FBX파일을 하나 만들었다.

  큐브(Lecture_Cube)의 메시는 오브젝트의 중심과 메시의 중심이 같이 x로 2, y로 2로 움직였다.

  스피어(Lecture_Sphere)의 메시는 오브젝트의 중심은 X로만 -2, 메시 자체는 x로 -2, y로 2만큼 움직였다.

  이 두 메시의 차이를 잘 기억해 두기를 바란다.

  만든 3D 모델은 Lecture_File 이라는 이름으로 FBX파일로 추출했다. 이제 이 파일을 Unity에 불러와서 오브젝트로 만들어 보겠다.

  자, 사진의 붉은 색으로 표시해둔 곳을 봐주길 바란다.

  Project에 [Lecture_File]이라는 이름의 FBX파일을 불러왔고 이 에셋을 오브젝트로 만들자 부모 오브젝트의 이름이 [Lecture_File]로 되어 있고 자식 오브젝트에는 만들었던 2개의 메시, [Lecture_Cube]와 [Lecture_Sphere]이 있다.

적용된 중점 설정은 Center와 Global
적용된 중점 설정은 Pivot과 Global

  차이를 알겠는가? 차이가 없는게 정상이다. 왜냐하면 큐브의 오브젝트 중점과 메시 중점이 일치하고 있기 때문이다. 3D 모델링 과정에서 그렇게 설정했다.

  여기서 메시의 중점이란 컴퓨터의 백터(Vector) 계산으로 인해 정해지는데 유니티 자체에서 3D 모델의 각 점으로부터의 무게중심을 계산해서 정해지는 것을 말한다.

  또한 Lecture_Cube의 중점의 위치도 눈여겨 봐야 하는데. Inspector탭의 Transform 컴포넌트에 표시되는 위치는 메시 중점의 위치가 아니라 오브젝트 중점의 위치다. 그리고 이 좌표는 3D 모델링 프로그램에서 움직였던 값과 정확하게 일치한다. 단, 모델링 프로그램에선 x, y 좌표로 움직였던 것이 Unity에서 x, z좌표로 움직여 있는 것은 Unity와 3D 모델링 프로그램의 좌표계가 다르기 때문이다.

 

  자, 이번엔 스피어 오브젝트를 살펴보자.

적용된 중점 설정은 Center와 Global
적용된 중점 설정은 Pivot과 Global

  이제는 차이가 제대로 보일 것이다.

  Center에서는 도구의 중심이 메시의 중점에 있었다. 그러나 Pivot에서는 도구의 중심이 오브젝트의 중심에 가 있다.

  이제 Center와 Pivot이 어떤 차이를 가지는지 완벽하게 이해가 됬으리라 생각한다.

 

  요약하면 Center는 메시의 중점, Pivot은 3D 모델링 프로그램에서 설정된 오브젝트의 중점에 도구의 중심을 둔다. 또한 Transform 컴포넌트가 표시하고 있는 정보는 Pivot의 정보이다!

  Transform이 표시하고 있는 정보가 Center가 아니라 Pivot의 정보라는 것을 강조한 것은 이것이 애니메이션 제작과정에서 큰 영향을 끼치기 때문이다. 때문에 이 사항에 대해서는 9장에서 자세하게 다루겠다.

  -텍스쳐와 메트리얼(Texture & Material)

  텍스쳐와 메트리얼에 관해서는 4장에서 어느정도 설명한 바가 있다. 5장에서는 그것을 토대로 조금 더 자세하게 설명하려고 한다.

 

  우선 텍스쳐가 무엇이고 메트리얼이란 무엇인지 알아야 한다.

BOOTH에서 판매하고 있는 Malty의 옷 텍스쳐

  텍스쳐(Texture)라고 함은 곧 이미지 파일이다. 정확히는 3D모델을 위해 만들어진 이미지 파일을 가리킨다. 때문에 대부분의 텍스쳐 파일은 3D 모델의 전개도에 맞춰 색상이 배치되어 있다.

3D 모델링 프로그램에서의 메트리얼. 텍스쳐가 적용되어 있다.
Unity에서의 메트리얼. 3D 모델링 프로그램과 같은 세팅으로 메트리얼이 적용되어 있다.
Unity에서도 메트리얼에 텍스쳐를 적용할 수 있다.

  메트리얼(Material)은 의미 그대로 3D 모델의 재질을 결정한다. 이 모든 것은 메트리얼에 적용되어 있는 셰이더 덕분인데. 즉, 메트리얼이라는 파일은 셰이더와 메시의 연결점이라고 할 수 있다.

메트리얼이 사라져 분홍색으로 보이는 3D 모델

  따라서 메트리얼이 없으면 메시는 컴퓨터에 어떻게 3D 모델을 표시할지 알 수 없게 되고 이에 따라 메트리얼이 적용되지 않은 3D 모델은 게임 엔진에서 설정한 오류 텍스쳐를 적용한 임시 메트리얼을 쓰게 되는 것이다.

  3D 모델 파일에 텍스쳐가 적용될 경우 텍스쳐 파일의 좌표를 기반으로 메시의 전개도(UV맵)에 따라 텍스쳐의 색상을 메시에 입히는 것이 가능하다. 이때, 텍스쳐를 만드는 작업을 텍스쳐링이라 하고 만들어진 텍스쳐에 따라 3D 모델의 UV맵을 설정하는 작업을 맵핑이라고 하는데 이 맵핑, 즉, UV맵에 관한 정보는 메트리얼이 아닌 메시에 저장된다.

  위의 두 사진을 비교하면 확실하게 알 수 있는데 메트리얼을 Hair에서 Body로 바뀌었지만 맵핑 정보가 전혀 바뀌지 않았음을 확인할 수 있다.

  다시 한 번 말하지만 맵핑 정보는 메트리얼이 아닌 메시에 저장된다!

 

  이것이 의미하는 것은 같은 모델에 서로 다른 텍스쳐를 입히거나 셰이더를 바꾸는 것이 충분히 가능하다는 것이다! 실제로 BOOTH에는 이 특성을 활용한 제품들이 다수 있다.


  -본(Bone)

BOOTH에서 판매중인 Malty의 본

  메시에 할당되는 말 그대로 뼈라고 할 수 있다. 연결되어 있는 점, 변, 면을 편하게 움직일 수 있게 해준다. 후술할 피직스 본도 근본적으로는 3D 모델링 프로그램에서 설정된 본이다.

 

  개념 자체는 어렵지 않지만 구성하는 방법이 상당한 요령을 필요로 하기 때문에 본을 직접 구성하는 것은 3D 모델링을 할 사람이 아니라면 추천하지 않는다. 게다가 이미 구성된 본도 잘못 건드렸다가는 다른 곳과 병합되거나 설정하려하지 않았던 이상한 부위가 움직이거나 하는 경우가 빈번하기 때문에 직접 복잡한 구성의 본을 모델에 심는 것은 초보자의 경우, 권장하지 않는다.


  -본 리깅 & 스키닝(Bone Rigging & Skinning)

  본 리깅은 본을 메시에 연결하는 과정을 말한다. 이 과정을 거치지 않으면 본을 아무리 움직여도 메시는 꿈쩍도 하지 않기 때문에 본을 만들고 메시와 연결하는 리깅 작업은 본을 사용하는 움직임이 필요한 모델에게는 필수적인 작업이다. 위 문단에서 기술한 요령이 필요한 작업 중 하나가 바로 리깅 작업으로 모델이 크고 섬세할 수록 리깅 작업은 오래걸리며 섬세한 작업을 요구한다.

가슴(Chest) 본이 얼마나 영향을 미치는지 보여주고 있다. 붉은색에서 푸른색으로 갈 수록 영향력이 적어진다.

  리깅 작업 중 하나로 가장 시간이 오래 걸리는 작업이 웨이팅이다. 본을 메시에 연결한다고 해서 지정한 면과 변이 정말로 다 똑같이 움직이면 움직임에 부자연스러움이 생긴다. 따라서 본에 연결된 면이 본의 움직임에 어느정도 영향을 받는지 설정해야 하는데 그것이 바로 스키닝 작업이다. 특히나 본이 사람, 동물의 형태를 모방하고 있을 경우 실제 해부학적으로 같이 연동되는 근육을 묘사해야하므로 해부학적 지식을 요구한다.


  -쉐이프 키(ShapeKey) & 블렌드쉐이프(BlendShape)

  혹시 눈치 챘는가? 쉐이프 키와 블랜드 쉐이프의 항목이 완전히 일치하는 것을. 그렇다. 쉐이프 키(Shape Key)와 블렌드쉐이프(BlendShape)는 완전히 같은 기능으로 3D 모델링 프로그램에서는 쉐이프 키, Unity에서는 블렌드 쉐이프라고 부르는 것일 뿐이다.

 

  아바타의 표정은 기본적으로 이 기능을 통해 만들어진다. 쉐이프 키란 쉽게 말하면 점의 위치를 저장하는 기능으로 0~1의 값을 가지는 슬라이더를 통해 원래 위치와 저장한 위치 사이를 쉽게 이동할 수 있다.

무표정
웃는 표정
소소하게 웃는 표정

  예를 들어 아바타의 입을 무표정과 웃는 표정을 만들어 놓고 웃는 표정 쉐이프 키를 만들면 웃는 표정을 만들 수 있는 것은 물론이고 무표정과 웃는 표정 사이에 있는 묘한 표정까지 표현하는 것이 가능하다.

웃는 표정
입벌린 표정
입을 벌리고 웃는 표정

  쉐이프 키는 몇 개든 만들 수 있고 서로 같은 점이나 변, 면을 공유할 경우 그 가산치가 가산되는데 예를 들어 웃는 표정 상태에서 입을 벌린 표정을 중첩시키면 입을 벌리고 웃는 표정을 만들 수 있다.


  이상이 FBX라는 3D 모델 파일이 가지고 있는 대표적인 정보들이다. 이러한 FBX파일을 Unity에 불러오면 여러가지 정보를 확인할 수 있는데.

  Project탭에서 불러온 FBX 파일을 클릭하면 Inspector탭을 확인할 수 있다. 이미 모델에 설정된 메트리얼을 바탕으로 메트리얼 파일을 생성하는 것도 가능하다(Location의 Use Embedded Materials 항목을 Use Embedded Materials(Lagacy)로 바꿔주면 FBX 파일이 있는 폴더에 Materials라는 폴더가 생기며 FBX 파일이 필요한 모든 메트리얼 파일들이 생성된다). 또한 본이 존재할 경우 Hierarchy탭에 오브젝트로서 생성하게 되면 대부분 3D 모델 오브젝트 안에 있는 Amature 오브젝트 안에 설정한 본들이 존재하며 본이 할당되어 있는 오브젝트는 그 본의 움직임 말고는 절대 움직이지 않는다.

자동으로 생겨난 Animator 컴포넌트

  인간형 VRChat 아바타에게 있어 가장 중요한 것은 Humanoid에 대한 설정인데 Project탭에서 FBX 파일을 클릭해 Inspector탭에서 Rig탭에 가면 Animation Type 항목에서 Humanoid 설정을 할 수 있다. 이것은 사람형 모델을 위한 설정으로 VR기기와 아바타를 연결하는데 직접적인 영향을 준다. 또한 Humanoid 설정을 적용한 FBX 파일의 오브젝트는 자동으로 Animator 컴포넌트가 생성된다.

  Humanoid 3D 모델의 기본 구성은 인간의 뼈 구성을 모방하고 있다. FBX파일의 Inspector탭의 Rig탭에서 Avatar Definition 항목의 [Configure...] 버튼을 누르면 3D 모델링 과정에서 구성한 본이 어디 부위에 적용되었는지 알 수 있다(적용은 Animation Type을 Humanoid로 바꾸고 Apply를 누르는 순간 자동으로 분류되어 적용된다.)

해당 창에서 나가고 싶으면 스크롤을 내려서 Done 버튼을 누르면 된다

  인간형 모델이 보통 가지고 있는 본 구성은 다음과 같다.

  • Hips[엉덩이]
    • Spine[등]
      • Chest[가슴]
        • (+Breasts(L,R)[유방])
        • Neck[목]
          • Head[머리]
        • Soulder(L,R)[어깨]
          • Upper Arm(L,R)[팔꿈치를 중심으로 윗 팔]
            • Lower Arm(L,R)[팔꿈치를 중심으로 아랫 팔]
              • Hand(L,R)[손]
                • Thumb 0,1,2(L,R)[엄지 손가락]
                • Index 0,1,2(L,R)[검지 손가락]
                • Middle 0,1,2(L,R)[중지 손가락]
                • Ring 0,1,2(L,R)[약지 손가락]
                • Little 0,1,2(L,R)[새끼 손가락]
    • Upper Leg(L,R)[무릎을 중심으로 윗 다리]
      • Lower Leg(L,R)[무릎을 중심으로 아랫 다리]
        • Foot(L,R)[발]
          • (+Toe(L,R)[발가락이지만 손가락처럼 전부 제어하는 게 아닌 다섯 발가락 전부를 제어한다])

Foot과 Toe의 차이(왼쪽이 Foot, 오른쪽이 Toe)

  위의 요소들이 Humanoid 아바타들이 기본적으로 가지고 있는 신체 구성이다. 다만 본의 위치는 사람이 그렇듯 아바타에 따라서 다를 수 있고 Toe의 경우 안 넣는 경우도 가끔 있다.

 

  Hips는 엉덩이 부위지만 Humanoid 본의 가상 상위 본으로 인간이 그렇듯 엉덩이 부위가 본의 중심이 되고 있다.

 

  이렇듯이 사람형 3D 모델은 사람과 유사하게 제작되기 때문에 사람형 모델을 제작하거나 다루는 사람은 인간의 뼈와 근육이 어떻게 구성되어 있는지를 알면 더욱 정교하게 소스를 제작할 수 있다.


  이렇게 해서 3D 모델에 대한 대부분의 설명을 마쳤다. 다음 강좌에서는 메트리얼에 대해서 조금만 더 알아볼 것이다.

TRY!

  Hierarchy탭에 우클릭을 하면 여러가지 오브젝트를 만들 수 있다. 여러 오브젝트를 만들어 보고 이리저리 만져보자!