본문 바로가기

Game/Graphics

Learn OpenGL - Model Loading : Assimp

link : https://learnopengl.com/Model-Loading/Assimp


Assimp


 지금까지 모든 장면에서 우리는 다양한 방법으로 우리의 작은 컨테이너 친구를 광범위하게 학대했지만


시간이 지남에 따라 가장 친한 친구조차도 조금 지루할 수 있다. 실용적인 그래픽 응용 프로그램에는 일반적으로


정적 컨테이너보다 훨씬 더 보기 좋고, 복잡하고, 흥미로운 모델이 많이 있다. 그러나 컨테이너 객체와 달리


주택, 차량 또는 사람과 유사한 복잡한 모양의 모든 정점, 법선 및 텍스처 좌표를 실제로 수동으로 정의할 수는 없다.


우리가 원하는 것은 이 모델들을 어플리케이션으로 임포트하는 것이다.

(Blender, 3DS Max 또는 Maya와 같은 도구에서 3D아티스트가 신중하게 설계한 모델)



 이러한 소위 3D 모델링 도구를 사용하면 아티스트가 복잡한 모양을 만들고 uv-mapping이라는 프로세스를 통해


텍스처를 적용할 수 있다. 그런 다음 도구는 모델 파일 형식으로 내보내는 동안 모든 정점 좌표, 정점 법선 및


텍스처 좌표를 자동으로 생성한다. 이렇게하면 아티스트는 기술적 세부 사항을 너무 신경쓰지 않고도 고품질


모델을 만들 수 있는 광범위한 툴킷을 보유하게된다. 그래픽 프로그래머인 우리는 이러한 기술적 세부 사항에


신경써야한다.



 따라서 우리가 OpenGL에서 이해할 수 있는 형식으로 저장할 수 있도록 이러한 내보낸 모델 파일을 구문 분석하고,


모든 관련 정보를 추출하는 것이 우리의 임무이다. 그러나 공통적인 문제는 각자 고유한 방식으로 모델 데이터를 내보내는


수십 개의 서로 다른 파일 형식이 있다는 것이다. Wavefront.obj와 같은 사소한 재료 정보가 포함된 모델 데이터만 포함되며


XML 기반 Collada 파일 포맷과 같은 모델 포맷은 매우 광범위하며 모델, 조명, 다양한 유형의 재료, 애니메이션 데이터,


카메라, 완벽한 장면 정보 및 훨씬 더 있다. wavefront 객체 형식은 일반적으로 해석하기 쉬운 모델 형식으로 간주된다.


Wavefront의 wiki 페이지를 한 번 방문해 그러한 파일 형식의 데이터가 어떻게 구성되어 있는지 확인해라.


이것은 모델 파일 형식이 일반적으로 어떻게 구조화되는지에 대한 기본적인 인식을 제공한다.



 대체로 공통된 일반적인 구조가 일반적으로 존재하지 않는 다양한 파일 형식이 있다. 따라서 이러한 파일 형식에서 모델을


가져오려면 가져올 파일 형식마다 가져오기 기능을 직접 작성해야한다. 다행히도 이를 위한 library가 있다.






A model loading library


 라이브러리를 가져오는 매우 인기있는 모델은 Open Asset Import Library를 나타내는 Assimp이다.


Assimp는 Assimp의 일반화된 데이터 구조에 모든 모델의 데이터를 로드해 수십개의 서로 다른 모델 파일 형식을


가져올 수 있다. Assimp가 모델을 로드하자마자 우리는 Assimp의 데이터 구조에서 필요한 모든 데이터를 검색할 수 있다.


Assimp의 데이터 구조는 우리가 가져온 파일 형식의 유형에 관계없이 동일하게 유지되기 때문에 다른 모든 파일


형식에서 우리를 추상화한다.



 Assimp를 통해 모델을 임포트할 때, 임포트된 model / scene 의 모든 데이터를 담고 있는 씬 객체에 전체 모델을


로드한다. 그런 다음 Assimp는 각 노드가 장면 개체에 저장된 데이터에 대한 인덱스를 포함하는 노드 모음을 가지며,


각 노드는 자식 수를 가질 수 있다. Assimp 구조의 (단순한) 모델은 아래와 같다:



    - scene / model의 모든 데이터는 모든 재질 및 메쉬와 마찬가지로 scene 개체에 포함된다. 


      또한, 장면의 루트 노드에 대한 참조를 포함한다.


    - 장면의 루트 노드는 다른 노드와 마찬가지로 자식 노드를 포함할 수 있으며 장면 개체의


      mMeshes 배열에 있는 메쉬 데이터를 가리키는 인덱스 집합을 가질 수 있다. 루트 노드의 mmeshes


      배열에는 실제 Mesh 객체가 포함되어 있으며 노드의 mmeshes 배열에 있는 값은 장면의 메쉬 배열에


      대한 인덱스에만 해당된다.


    - Mesh 객체 자체는 렌더링에 필요한 모든 관련 데이터를 포함하며, 정점 위치, 법선 벡터, 텍스처 좌표,


      면 및 객체의 재료를 생각한다.


    - 메쉬에는 여러면이 있다. Face는 객체의 렌더링 primitive (삼각형, 사각형, 점)를 나타낸다. 


       face는 프리미티브를 형성하는 정점의 인덱스를 포함한다. 정점과 인덱스가 분리되어 있으므로 인덱스 버퍼를


      통해 쉽게 렌더링할 수 있다. (Hello Triangle 참조)


    - 마지막으로 메쉬에는 객체의 material 속성을 검색하는 여러 함수를 호스트하는 material 객체가 포함되어 있다.


      색상 및 텍스처 맵 (diffuse / specular 맵과 같음)을 생각해보아라.



 그래서 우리는 먼저 객체를 Scene 객체에 로드하고, 각 노드에서 해당 Mesh 객체를 재귀적으로 검색하고 각 Mesh 객체를


처리해 정점 데이터, 인덱스 및 해당 속성을 검색한다. 결과는 단일 Model 객체에 포함하려는 메쉬 데이터의 모음이다.

Mesh
모델링 툴킷에서 객체를 모델링 할 때 아티스트는 일반적으로 단일 모양에서 전체 모델을 만들지 않는다. 일반적으로 각 모델에는 여러 개의 하위 model/shape가 있다. 모델이 구성하는 각각의 단일 모양을 mesh라고 한다. 인간과 같은 인물을 생각해보아라. 예술가는 대개 머리, 팔다리, 옷, 무기를 모두 별도의 구성 요소로 모델링한다. 이 모든 메시의 결합된 결과는 최종 모델을 나타낸다. 하나의 메쉬는 OpenGL에서 객체를 그리는데 필요한 요소를 최소한으로 표현한 것이다. 모델은 여러 개의 메쉬로 구성된다.

 다음 튜토리얼에서는 방금 설명한 구조를 사용해 가져온 모델을 로드하고 저장하는 자체 Model 및 Mesh 클래스를 만든다.


모델을 그리려면 모델을 전체적으로 렌더링하지 않고, 모델이 구성하는 모든 개별 메쉬를 렌더링한다.


그러나 모델을 가져오기 전에 먼저 실제 프로젝트에 Assimp를 포함시켜야한다.






Building Assimp


 다운로드 페이지에서 Assimp를 다운로드하고 해당 버전을 선택할 수 있다. 이 글을 쓰는 시점에서 사용된 최신 버전은 3.1.1이다.


미리 컴파일된 라이브러리는 대부분의 시스템에서 작동하지 않으므로 직접 컴파일하는 것이 좋다.


CMake를 통해 직접 라이브러리를 컴파일하는 방법을 잊어버린 경우 Creating a window tutorial을 검토해라.




 Assimp를 빌드하는 동안 몇 가지 문제가 발생했으므로 다음 중 동일한 오류가 발생할 경우를 대비해 해결책을 제시할 것이다.



- DirectX 라이브러리 누락에 대한 구성 목록을 검색하는 동안 지속적으로 CMake에서 오류를 발생시켰다. 메시지는 다음과 같다:

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를 설치하지 않은 경우에 대비해 DirectX SDK를 설치해라. 여기에서 SDK를 다운로드할 수 있다.


- DirectX SDK를 설치하는 동안 s1023의 오류 코드가 나타날 수 있다. 이 경우 먼저 여기에 설명된대로 SDK를 설치하기 전에


  먼저 C++ 재배포 가능 패키지를 제거해야한다.


- 구성이 완료되면 솔루션 파일을 생성하고 열어 라이브러리를 컴파일 할 수 있다. (릴리스 버전 또는 디버그 버전 중 무엇이든 뜨게)


- 기본 설정은 Assimp를 동적 라이브러리로 빌드하므로 assimp.dll이라는 이름의 결과 DLL을 응용 프로그램의 실행 파일이 있는


  폴더에 DLL을 복사하기만 하면 된다.


- Assimp 컴파일 후 결과 라이브러리 및 DLL 파일은 code / Debug 또는 code / Release 폴더에 있다.


- 그런 다음 lib와 DLL을 적절한 위치로 옮기고 솔루션에서 링크하고 Assimp의 헤더를 include 디렉토리에 복사하는 것을 잊지 말아라.

   (헤더 파일은 Assimp에서 다운로드 한 파일의 include 폴더에 있다)



 아직 보고되지 않은 오류가 발생하는 경우 아래 의견에 도움을 요청해라.

Assimp가 더 빠른 성능을 위해 멀티 스레딩을 사용하게 하려면 Assimp with Boost를 컴파일해라. 전체 설치 지침은 설치 페이지에서 찾을 수 있다.

  Assimp를 컴파일해 어플리케이션에 링크해야한다. 다음 단계 : 멋진 3D 소재 가져오기!





** ** ** ** ** ** ** ** ** **


드디어 3D 모델들을 가져오는건가... 감격이다! 광주 복귀하면 공모전 준비 빡세게 하면서 튜토리얼도 계속 진행해보아야겠다.


빨리 보고싶다 3D 모델들


'Game > Graphics' 카테고리의 다른 글

Learn OpenGL - Model Loading : Model  (0) 2018.08.30
Learn OpenGL - Model Loading : Mesh  (0) 2018.08.27
LearnOpenGL - Glossary  (0) 2018.08.24
Learn OpenGL - Lighting : Multiple lights  (0) 2018.08.24
Learn OpenGL - Lighting : Light casters  (0) 2018.08.21