Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

게임공장

[Learn OpenGL 번역] 4-1. 모델 불러오기 - Assimp 본문

OpenGL

[Learn OpenGL 번역] 4-1. 모델 불러오기 - Assimp

짱승_ 2018. 7. 18. 21:17

Assimp

모델 불러오기/Assimp

  지금까지의 모든 scene들에서 우리는 컨테이너 친구들을 많은 방법으로 광범위하게 가지고 놀았습니다. 하지만 시간이 지남에 따라 이 친구들이 약간 지루해졌습니다. 실제 그래픽 응용 프로그램에서는 일반적으로 많은 복잡하고 흥미로운 모델들이 존재합니다. 이 모델들은 정적인 컨테이너보다 보기 좋을 것입니다. 하지만 컨테이너 오브젝트와 다르게 집, 차량, 사람과 같은 복잡한 도형의 모든 vertex, 법선, 텍스처 좌표를 일일히 정의할 수는 없습니다. 대신 우리가 할 일은 이 모델들을 응용 프로그램에 import하는 것입니다. 이 모델들은 3D 아티스트가 Blender, 3DS Max, Maya 같은 툴을 사용하여 디자인한 것들입니다.


  3D modeling tools라고도 불리는 이 도구들은 아티스트가 복잡한 도형을 만들 수 있도록 도와주고 여기에 uv-mapping라고 불리는 처리를 통해 텍스처를 적용시킵니다. 이 툴들은 model 파일 포멧으로 추출하면 모든 vertex 좌표들과 법선, 텍스처 좌표들을 자동으로 생성합니다. 이런식으로 아티스트들은 많은 기술적인 부분들을 신경쓰지 않고 높은 퀄리티의 모델을 만들 수 있는 다양한 툴들을 가지고 있습니다. 추출된 모델 파일에는 모든 기술적인 관점들이 숨겨져 있습니다. 그래픽 프로그래머로서 우리는 이러한 기술적힌 상세 부분들을 신경써야합니다.


  따라서 이러한 추출된 모델 파일들을 분석하여 모든 관련된 정보들을 추출하는 것이 우리의 일입니다. 그래서 우리는 이 정보들을 OpenGL이 이해할 수 있는 형식으로 저장해야합니다. 하지만 모델 데이터를 추출할 때 가질 수 있는 파일 포멧은 아주 많이 존재합니다. Wavefront .obj 와 같은 모델 포멧들은 모델 컬러, diffuse/specular map들과 같은 작은 material 정보들과 함께 모델 데이터를 가지고 있습니다. 반면에 XML 기반의 Collada 파일 포멧 과 같은 모델 포멧들은 모델, light, 다양한 종류의 material들, 애니메이션 데이터, 카메라, 완전한 scene 정보 등을 아주 광범위하게 가지고 있습니다. Wavefront 오브젝트 포멧은 일반적으로 분석하기 쉬운 모델 포멧으로 여겨집니다. Wavefront wiki 페이지에 최소한 한 번 방문하여 이 파일 포멧의 구조를 확인하는 것을 권장합니다. 모델 파일 포멧들이 일반적으로 어떤 구조를 가지고있는지에 대해 기본적인 개념을 이해할 수 있을 것입니다.


  일반적이지 않은 파일 포멧도 많이 존재합니다. 그래서 이러한 포멧의 모델을 추가하려면 우리는 우리 스스로 importer를 작성해야 합니다. 운좋게도 이 일을 해주는 라이브러리가 있습니다.

Model loading 라이브러리

  가장 많이 쓰이는 모델 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를 형성하기 위한 vertex들의 index를 가지고 있습니다. vertex들과 index들이 분리되어있기 때문에 index 버퍼를 통해 렌더링하는 것을 쉽게 만들어 줍니다(Hello Triangle 강좌를 보세요).
  • 마지막으로 mesh는 Material 객체도 가지고 있습니다. 이 객체는 오브젝트의 material 속성들을 얻기위한 여러가지 함수들을 관리합니다. 텍스처 map(diffuse, specular map)과 컬러를 생각하시면 됩니다.

  그래서 우리가 먼저 해야할 일은 Scene 객체에 오브젝트를 불러오는 것입니다. 각 노드들의 해당 Mesh 객체들을 재귀적(우리는 각 노드의 자식들을 재귀적으로 검색합니다)으로 얻고 vertex 데이터와 index, material 속성들을 얻기 위해 각 Mesh 객체를 처리합니다. 그러면 그 결과는 하나의 Model 객체에 포함시킬 mesh 데이터의 모음이 됩니다.

Mesh
  모델링 툴에서 오브젝트를 모델링할 때 아티스트들은 일반적으로 하나의 도형을 벗어나서 전체 모델을 생성하지 않습니다. 일반적으로 각 모델은 여러개의 서브 모델/도형을 가지고 있습니다. 하나의 모델을 이루는 각각의 서브 모델/도형들은 mesh라고 불립니다. 인간과 같은 캐릭터를 생각해 보세요. 아티스트들은 일반적으로 머리, 팔다리, 옷, 무기와 같은 분리되어 있는 요소들을 먼저 모델링하고 이러한 mesh들을 결합하여 결과물을 만듭니다. 하나의 mesh는 OpenGL에서 오브젝트를 그리기위해 필요한 최소한의 것을 나타냅니다(vertex 데이터, index, material 속성들). 모델은 (일반적으로) 여러 mesh들로 이루어져 있습니다.

  다음 강좌에서는 우리만의 ModelMesh 클래스를 생성할 것입니다. 이 클래스들은 import된 모델들을 우리가 설명한 구조를 사용하여 불러오고 저장합니다. 그런 다음 이 모델을 그리기 원한다면 이 모델 전체를 렌더링하지 않고 이 모델을 이루고 있는 각각의 모든 mesh들을 렌더링합니다. 하지만 모델들을 import하기 전에 우리는 먼저 프로젝트에 Assimp를 추가해야합니다.

Assimp 빌드

  Assimp는 그들의 download 페이지에서 다운받을 수 있습니다. 이 강좌를 작성했을 때 사용된 가장 최신버전은 3.1.1 버전입니다. 여러분 스스로 라이브러리를 컴파일 하는 것을 권장합니다. 미리 컴파일된 라이브러리는 대부분의 시스템에서 제대로 동작하지 않기 때문입니다.라이브러리를 컴파일하는 것은 스스로 해보세요. CMake를 통해 라이브러리를 컴파일하는 방법을 잊어버렸다면 Window 생성 강좌를 다시 보세요.

  Assimp 빌드 중에 몇가지 문제가 발생할수 있으므로 그들에 대한 해결법을 밑에 작성하였습니다.


  • CMake는 계속해서 DirectX 라이브러리 잃어버린 것에 대한 설정을 얻는 중에 다음과 같은 에러 메세지를 출력하는 경우
    
    Could not locate DirectX
    CMake Error at cmake-modules/FindPkgMacros.cmake:110 (message):
    Required library DirectX not found! Install the library (including dev packages) 
    and try again. If the library is already installed, set the missing variables 
    manually in cmake.
    
      이 경우에 해결법은 DirectX SDK를 설치하지 않았다면 설치하는 것입니다. 여러분은 여기에서 SDK를 다운로드 받을 수 있습니다.
  • DirectX SDK 설치 중에 s1023 코드의 에러가 발생할 수 있습니다. 이 경우에 여러분은 SDK를 설치하기 전에 C++ Redistributable package들을 삭제해야합니다. 여기를 참고하세요.
  • 설정이 완료되면 여러분은 솔루션 파일을 생성할 수 있습니다. 이 파일을 열고 라이브러리들을 컴파일하세요.
  • 기본 설정은 Assimp를 동적 라이브러리로 빌드하므로 응용 프로그램의 바이너리들의 옆에 assimp.dll 이름을 가진 DLL 파일을 추가해야 합니다. 여러분은 응용 프로그램의 실행파일이 있는 폴더에 DLL 파일을 복사하기만 하면 됩니다.
  • Assimp 컴파일 후에 최종 라이브러리와 DLL 파일은 code/Debugcode/Release 폴더에 위치됩니다.
  • 그런 다음 간단히 라이브러리와 DLL을 적절한 위치에 이동시켜주세요. 그리고 여러분의 솔루션과 연결시켜주고 여러분의 include 디렉터리에 Assimp의 헤더파일을 복사해주는 것도 잊지 마세요(이 헤더파일든은 Assimp에서 다운로드 받은 include폴더 안에서 찾을 수 있습니다).

  빠른 성능을위해 멀티 쓰레딩을 사용하여 Assimp를 사용하기 원한다면 Boost를 사용하여 Assimp를 컴파일할 수 있습니다. 전체 설치 설명서는 설치 페이지에서 볼 수 있습니다.

  이제 여러분은 컴파일된 Assimp를 가지고 여러분의 응용 프로그램에 연결시켜야 합니다. 다음 단계는 3D 모델을 import하는 것입니다!



출처 : https://learnopengl.com, Joey de Vries

반응형