Home [learn-opengl] Model Loading: Assimp
Post
Cancel

[learn-opengl] Model Loading: Assimp

Assimp

  • 이때까지는 단순한 정육면체를 가지고 놀았다.(정적인 컨테이너)

  • 실제는 더 복잡한 모델들이 존재한다.

  • 우리는 이 모델들을 import할 수 있다.

    • 이 모델들은 Blender, 3DS Max, Maya 같은 툴을 사용하여 디자인한 것들이다.
    • 이 툴들은 복잡한 도형을 만들 수 있도록 도와주고 여기에 uv-mapping라고 불리는 처리를 통해 텍스처를 적용시킨다.
    • 이 툴들은 model파일 포멧으로 추출하면 모든 vertex 좌표들법선, 텍스처 좌표들을 자동으로 생성한다.
    • 그래픽 프로그래머로서 이러한 기술적인 상세부분들을 신경써야한다
  • 이러한 모델 파일들을 분석, 모든 관련된 정보들을 추출해야한다.

    • 다양한 포맷들이 존재함.
    • Wavefront와 같은 모델 포멧들: 모델 컬러, diffuse/specular map들과 같은 작은 material정보들과 함께 모델 데이터를 가지고 있다.
    • Collada 파일 포멧과 같은 모델 포멧들: 모델, light, 다양한 종류의 material들, 애니메이션 데이터, 카메라, 완전한 scene 정보등을 아주 광범위하게 가지고 있다.
  • 이런 다양한 포맷을 지원하려면, 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들만 가지고 있다.
    • Mesh객체는 렌더링하는 데에 필요한 모든 관련 데이터들을 포함한다. 오브젝트의 vertex 위치, 법선 벡터, 텍스처 좌표, 면, material 등
    • Mesh는 여러 개의 면들을 가진다.
      • 면(Face)은 렌더링 primitive(삼각형, 사각형, 점)를 나타낸다.
      • 면은 primitive를 형성하기 위한 vertex들의 index를 가지고 있다.
      • vertex들과 index들이 분리되어있기 때문에 index버퍼를 통해 렌더링하는 것을 쉽게 만들어 준다.
    • 마지막으로 meshMaterial객체도 가지고 있다. - 이 객체는 오브젝트의 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는 여기서 다운받을 수 있다.

  • 스스로 라이브러리를 컴파일하는것이 좋다.

  • 미리 컴파일된 라이브러리는 대부분의 시스템에서 제대로 동작하지 않기 때문.

출처

Assimp

This post is licensed under CC BY 4.0 by the author.

[learn-opengl] Lighting: Multiple lights

[learn-opengl] Model Loading: Mesh