Assimp
모든 씬에서, 이제까지 우리는 광범위하게 여러가지 방법으로 우리의 작은 container friend를 남용해왔지만, 시간이 흘러 심지어 우리의 가장 베프도 지루해질 수 있다. 실제 그래픽스 프로그램에서, 보통 static container보다 보기에 더 좋은 많은 복잡하고 흥미로운 모델들이 있다. 그러나, container object와 다르게, 우리는 정말로 수동으로 집, 탈 것 또는 사람과 같은 캐릭터 같은 복잡한 모형의 모든 정점, normals 그리고 texture 좌표를 정의할 수 없다. 우리가 대신에 원하는 것은 이러한 모델들을 프로그램으로 불러들이는 것이다; Blender, 3DS Max 또는 Maya같은 툴에서 3D 아티스트들에 의해 신중하계 디자인된 모델들.
이러한, 이른 바, 3D modeling tools들은 아티스트들이 복잡한 모형을 만들고 uv-mapping이라고 불려지는 프로세스를 통해 그것들에 텍스쳐를 적용할 수 있도록 한다. 그 툴들은 그러고나서 자동적으로 모든 정점 좌표, vertex normals 그리고 texture 좌표를 만ㄷ르어낸다. 그것들을 model file format으로 export하면서. 이렇게, 아티스트들은 기술적인 세부사항에 대해 걱정할 필요 없이, 높은 퀄리티의 모델들을 만드는 extensive toolkit을 가진다. 모든 기술적인 측면은 exported model file에 숨겨져 있따. 그래픽스 프로그래머로서, 우리는 이러한 기술적 세부사항에 신경써야만 한다.
그것은 따라서 이러한 exported model files들을 파싱하고, 모든 관련된 정보들을 추출하는 것이 우리의 일이다. 그래서 우리는 그것들을 OpenGL이 이해하는 방식으로 저장할 수 있다. 흔한 문제는 그러나, 수십 개의 다른 file format들이 있다는 것이다. 그리고 거기에서, 각각은 그것 자신의 고유한 방식으로 model data를 exports한다. Wavefront .obj같은 모델 formats들은 오직 model colors 그리고 diffuse/specular maps같은 사소한 material 정보를 가진 model data를 포함하지만, XML 기반의 Collada file foramt같은 모델 formats들은 매우 extensive하고 모델, 조명, materials의 여러 타입, animation data, cameras, 완전한 scene information 그리고 더 많은 것을 포함한다. wavefront object format은 일반적으로 파싱하기 쉬운 모델 format으로 고려된다. 그러한 파일 포맷의 데이터가 어떻게 구조화 되었는지 보기 위해 적어도 한 번 Wavefront의 위키페이지를 방문하는 것이 추천된다. 이것은 너에게 어떻게 model file format들이 일반적으로 구조를 가지는지에 대해 기본적인 인식을 줄 것이다.
많은 다른 파일 포맷들 사이에 공통된 일반적 구조가 존재하지 않는다. 그래서 만약 우리가 이러한 파일 포맷으로부터 한 모델을 불러오고 싶다면, 우리는 우리가 import하고 싶은 file format 각각에 대해 우리 스스로 importer를 작성해야만 한다. 우리에게 운 좋게도, 이것에 대한 한 라이브러리가 있다.
A model loading library
매우 인기있는 model importing library는 Assimp라고 불려진다. 그것은 Open Asset Import Library를 말한다. Assimp는 수십개의 다른 모델 파일 포맷을 불러올 수 있다. (또한 export할 수 있다.). 이것은 모든 모델 데이터를 Assimp의 일반화된 데이터 구조로 로드하여 된다. Assimp가 model을 불러오자마자, 우리는 Assimp 데이터 구조로부터 필요한 모든 데이터를 가져올 수 있다. ssimp의 데이터구조는 항상 같기 때문에, 우리가 import한 file format의 유형에 상관없이, 그것은 모든 다른 파일 포맷으로부터 우리에게 추상화를 시켜준다.
Assimp를 통해 한 모델을 import할 때, 그것은 전체 모델을 imported된 모델/scene의 모든 데이터를 포함하는 scene object로 불러온다. Assimp는 그러고나서, nodes들의 모음을 갖는다. 거기에서 각 노드는 scene object에 저장된 데이터에 대한 인덱스들을 포함한다. scene object에서 각 노드는 많은 수의 children을 가질 수 있따. Assimp의 구조의 간단한 모델은 아래에서 보여진다:
- scene/model의 모든 데이터는 모든 materials 그리고 meshes같은 Scene object에 포함된다. 그것은 또한 scene의 root node에 대한 참조를 포함한다.
- scene의 Root node는 자식 노드들을 포함할지도 모른다. (모든 다른 노드들 처럼) 그리고 scene object의 mMeshes array에서 mesh data를 가리키는 인덱스 집합을 가질 수 있다. 그 root node의 mMeshes array는 실제 Mesh objects를 포함하고, 한 노드의 mMeshes array에 있는 값들은 scene의 meshes array에 대한 인덱스만을 포함한다.
- 한 Mesh 오브젝트 그 자체는 렌더링에 요구되는 관련된 데이터만을 포함한다. vertex positions, normal vectors, texture coordinates, faces and the material of the object를 생각해라.
- 한 mesh는 몇 가지 faces를 포함한다. A Face는 그 오브젝트의 render primitive를 나타낸다. (삼각형, 사각형, 점). 한 face는 primitive를 만드는 정점들의 인덱스를 포함한다. 정점과 인덱스들이 분리되어 있기 때문에, 이것은 우리가 index buffer를 통해 렌더링하기 쉽게 해준다. (Hello Triangle를 보아라).
- 마지막으로 한 mesh는 또한 한 오브젝트의 material properties를 얻어내는 몇 가지 함수를 가지는 Material object를 포함한다. colors 그리고/또는 texture maps를 생각해라. (diffuse and specular maps같은)
그래서 우리가 하기 원하는 것은 처음에 한 오브젝트를 Scene object를 load하고, 반복적으로 각 노드로부터 (우리는 반복적으로 각 노드의 자식들을 찾는다) 일치하는 Mesh objects를 얻고, vertex data, indices and its material properties를 얻기위해 각 Mesh object를 처리한다. 그 결과는 그러고나서 우리가 하나의 Model object에 포함시키고 싶은 mesh data의 모음이다.
Green Box!
Mesh
모델링 toolkits에서 오브젝트를 모델링할 때, 아티스트들은 일반적으로 단일의 shape에서 전체 모델을 만들지 않는다. 보통 각 모델은 그 모델이 구성되는 몇 가지 하위-모델들/shapes를 가진다. 한 모델이 구성되는 그러한 단일의 shapes 각각은 mesh라고 불려진다. 사람같은 캐릭터를 생각해 보아라 : 아티스트들은 보통 머리, 팔다리, 옷들, 무기들을 모두 별개의 컴포넌트로서 모델링하고, 모든 이러한 메쉬들의 결합된 결과는 최종 모델을 나타낸다. 단일의 mesh는 OpenGL에서 한 오브젝트를 그리는데 필요한 것의 최소한의 표혀단위 이다. (vertex data, indices, and material properties). 한 모델은 (보통) 몇 가지 메쉬들로 구성된다.
다음 튜토리얼에서 우리는 우리가 방금 묘사한 구조를 사용하여 imported 모델들을 불러오고 저장하는 우리 자신의 Model과 Mesh class를 만들것이다. 그러고나서 만약 우리가 한 모델을 그리기 원한다면, 우리는 그 모델 전체를 렌더링하는게 아니라, 우리는 그 모델이 구성되는 모든 각각의 메쉬들을 렌더링한다. 그러나, 우리가 models를 importing하기 시작하기 전에, 우리는 처음에 Assimp를 우리의 프로젝트에 include할 필요가 있다.
Building Assimp
너는 다운로드 페이지에서 Assimp를 다운받을 수 있고 일치하는 버전을 선택할 수 있다. 이 글서, 사용된 최신 Assimp 버전은 version 3.1.1 이다. 라이브러리를 너 스스로 컴파일하는 것이 충고된다. 그것들의 pre-compiled 라이브러리는 대부분의 시스템에서 작동하지 않기 때문이다. 만약 너가 CMake를 통해 라이브러리를 컴파일하는 것을 잊었다면 Creating a window tutorial을 다시 보아라.
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(s)를 없애길 원한다.
- 설정이 완료된다면, 너는 solution file을 만들고, 그것을 열어서 라이브러리를 컴파일 할 수 있다. (release version 또는 debug version으로 너가 어떤 것을 하든)
- 기본 설정은 동적 라이브러리로서 Assimp를 구성한다. 그래서 프로그램의 binaries에 우리는 assimp.dll이라는 최종 DLL을 포함시킬 필요가 있다. 너는 간단히 너의 실행 프로그램이 위치한 같은 폴더에 DLL을 복사할 수 있따.
- Assimp 컴파일 후에, 최종 라이브러리와 DLL 파일은 code/Debug or code/Release 폴더에 위치한다.
- 그러고나서 lib과 DLL을 간단히 적절한 위치에 옮기고, 그것들을 너의 솔루션으로부터 링크시키고, Assimp 헤더를 너의 include directory에 또한 포함하는 것을 잊지마라 (헤더파일은 Assimp파일 다운로드에서 include folder에 있다).
만약 너가 여전히 보고되지 않은 에러를 받았다면, 아래 커멘트에서 도움을 요청해라.
Green Box
만약 너가 더욱 빠른 성능을 위해 멀티 쓰레딩을 사용하는 Assimp를 원한다면, 너는 Boost가 있는 Assimp를 컴파일 할 수 있다. 너는 그것들의 installation page에서 full installation instructions을 볼 수 있다.
이제, 너는 Assimp를 컴파일 했고, 그것을 너의 프로그램에 링크시켰다. 다음 단계: 멋진 3D stuff를 import하자.
댓글 없음:
댓글 쓰기