Assimp
이때까지는 단순한 정육면체를 가지고 놀았다.(정적인 컨테이너)
실제는 더 복잡한 모델들이 존재한다.
우리는 이 모델들을 import할 수 있다.
- 이 모델들은 Blender, 3DS Max, Maya 같은 툴을 사용하여 디자인한 것들이다.
- 이 툴들은 복잡한 도형을 만들 수 있도록 도와주고 여기에
uv-mapping
라고 불리는 처리를 통해 텍스처를 적용시킨다. - 이 툴들은 model파일 포멧으로 추출하면 모든
vertex 좌표들
과법선
,텍스처 좌표들
을 자동으로 생성한다. - 그래픽 프로그래머로서 이러한 기술적인 상세부분들을 신경써야한다
이러한 모델 파일들을 분석, 모든 관련된 정보들을 추출해야한다.
이런 다양한 포맷을 지원하려면, importer를 작성해야한다.
- 이는 라이브러리를 사용할 수 있다.
A model loading library
가장 많이 사용하는 모델 importing 라이브러리는 Assimp라고 불리며
- Open Asset Import Library를 의미한다.
Assimp
는 모든 모델의 데이터들을 Assimp가 생성한 데이터 구조로 불러옴- 많은 종류의 모델 파일 포멧을 import(그리고 추출하는 것 또한 가능)할 수 있다.
- Assimp가 모델을 로드하기만 하면
Assimp의 데이터구조에서 우리가 원하는 모든 데이터
를 얻을 수 있다 Assimp의 데이터구조가 import된 파일 포멧의 유형과 관계없이 동일하게 유지
되기 때문에모든 다른 파일 포멧들을 추상화
해준다.
Assimp
를 통해 모델을 Import할 때 전체적인 모델을 import된 모든 모델/scene을 포함하고 있는 scene 객체에 불러온다.- Assimp는 노드의 모듬을 가지게 되는데 각 노드는 자신의 자식 모드들을 인덱싱할 index들을 가지고 있다.
- (간단하게) Assimp의 구조 모델은 다음과 같다.
Scene/model
의 모든 데이터는 모든material
,mesh
들과 마찬가지로Scene
객체에 포함된다. 또한 이는scene
의 루트 노드에 대한 참조를 가지고 있다.Scene
의루트 노드
는 자식 노드들을 포함(다른 모든 노드들과 마찬가지로)할 수 있고, Scene 객체의 mMeshes 배열 안의 데이터를 가리키는 인덱스들의 모음을 가지고 있다.- 이 루트 노드의 mMeshes 배열은 실제
Mesh
객체들을 가지고 있고, 일반노드의 mMeshesM 배열에 들어있는 값은 오직 scene의 mesh 배열에 대한 index들만 가지고 있다.
- 이 루트 노드의 mMeshes 배열은 실제
Mesh
객체는 렌더링하는 데에 필요한 모든 관련 데이터들을 포함한다. 오브젝트의 vertex 위치, 법선 벡터, 텍스처 좌표, 면, material 등Mesh
는 여러 개의 면들을 가진다.- 면(Face)은 렌더링 primitive(삼각형, 사각형, 점)를 나타낸다.
- 면은 primitive를 형성하기 위한 vertex들의 index를 가지고 있다.
- vertex들과 index들이 분리되어있기 때문에 index버퍼를 통해 렌더링하는 것을 쉽게 만들어 준다.
- 마지막으로
mesh
는Material
객체도 가지고 있다. - 이 객체는 오브젝트의material
속성들을 얻기위한 여러 함수들을 관리한다. - texture map(diffuse map, specular map)과 컬러같은 것
먼저 해야할 일은
Scene
객체에 오브젝트를 불러오는 것이다.- 각 노드들의 해당
Mesh
객체들을 재귀적(각 노드의 자식들을 재귀적으로 검색)으로 얻고, vertex 데이터와 index, material 속성들을 얻기 위해 각Mesh
객체를 처리한다. - 그 결과는 하나의
Model
객체에 포함시킬 mesh 데이터의 모음이된다.
- 각 노드들의 해당
Mesh: 모델링 툴에서 오브젝트를 모델링할 때 일반적으로 각 모델은 여러개의 서브 모델/도형을 가지고 있다. 하나의 모델을 이루는 각각의 서브 모델/도형들은 mesh라고 불린다. 이러한 mesh들을 결합하여 결과물을 만든다. 하나의 mesh는 OpenGL에서 오브젝트를 그리기위해 필요힌 최소한의 것을 나타낸다.(vertex 데이터, index, material 속성들), 모델은 일반적으로 여러 mesh들로 이루어짐.
- 앞에서는 Model 과 Mesh 클래스를 생성할 것이다.
- 이 클래스들은 import된 모델들을 우리가 설명한 구조를 사용하여 불러오고 저장한다.
- 그런 다음 이 모델을 그리기 원한다면, 이 모델 전체를 렌더링하지 않고 이 모델을 이루고 있는 각각의 모든
mesh
들을 렌더링한다. - 하지만 모델들을 import하기 전에 먼저 프로젝트에 Assimp를 추가해야한다.
Building Assimp
Assimp는 여기서 다운받을 수 있다.
스스로 라이브러리를 컴파일하는것이 좋다.
미리 컴파일된 라이브러리는 대부분의 시스템에서 제대로 동작하지 않기 때문.