[DX] 3D 모델, Assimp, ReadFile
🚩 3D 모델
3D 모델을 담고있는 파일은 많은 종류가 있는데, 대표적으로 Fbx, 3DS, Obj, md5, SDKMesh 등등이 있다.
3D 모델링 프로그램은 3DS MAX, Maya, Blender 등이 있다. 3DS Max와 Maya는 Autodesk 회사의 프로그램으로 Fbx 파일을 반환하고, Blender는 OpenSource이다.
3D 모델의 파일 형식은 이처럼 매우 다양한데, 형식에 따라 개발 툴에서의 파일입출력이 가능하거나 불가능하게 나뉘었기 때문에, 프로그래머들은 Assimp 라는 프로그램을 사용하여 어떤 파일 형식이건 동일한 형태로 변환하여 사용할 수 있도록 하였다. (게임을 위해서 만들어진건 아니고, 만들어놓고보니 게임개발에 잘 사용되었다.)
Assimp에 있는 데이터를 그냥 가져다 쓰면 데이터가 커서 느리고 무겁다. 따라서 파일에서 원하는 부분의 데이터만 뽑아서 사용하는 것이 좋다.
이제 DirectX에서 모델을 불러와 사용할 수 있도록 직접 구현해보자.
먼저, ModelEditor 클래스를 제작하여 Assimp에서 모델 형식으로 파일을 불러오고 해당 파일을 변수로 불러올 것이다. 이후 변수안에서 내가 쓰고자하는 데이터를 파일 형식으로 저장할 것이다. Model Editor에서 정제된 파일 형식은 Framework로 전달하고, Framework에서는 모델을 불러오고 렌더링할 것이다.
🚩 Assimp
Assimp의 구조만 제대로 알면 어떤 3D 모델이든 불러와 사용할 수 있다.
첫번째로 Assimp는 Importer 를 통해 Scene을 반환해준다. Scene이라는 객체는 3D 모델에 대해 모든 정보를 담고있는 Root이다.
Scene에는 Materials 라고 하며 배열로 모델들의 색상과 텍스처 정보를 저장하고 있는 데이터가 있다.
또한 Meshes 라고 하며 배열로 그려질 3D 모델의 정보를 저장하는 데이터가 있다.
Scene Root는 Materials와 Meshes의 전체 정보를 담고있다. 모델이 사람이라고 쳤을때 Scene Root 안에 Body가 존재하고, Body 안에 발, 다리, 몸통, 팔, 얼굴과 같은 모델 요소가 각각 저장돼있다. 각 요소에는 Matrix 형태로 저장된 Transformation과, 사용될 Material 인덱스, Mesh 인덱스가 저장되어있다.
또한 Model은 ModelBone과, ModelMesh로 구분되며 ModelMesh를 이용하여 Rendering할 수 있다. 이때 모델의 Material도 사용된다.
실제로 Assimp를 사용하기 위해 Assimp 라이브러리를 다운받았고, 헤더파일로 호출하여 3D 모델 파일을 읽어오기 위한 ReadFile 함수를 작성하였다.