현대적인 디자인 assimp 3D 모델 OpenGL은 라이브러리를로드

면책 조항 :이 문서는 블로거 원본입니다은 허용 블로거없이 복제 할 수 없다. https://blog.csdn.net/leon_zeng0/article/details/88860645

이 문서에서는 OpenGL은 우리의 복잡한 3D 디스플레이를 준비하는 다운로드 및 컴파일 assimp 라이브러리를 설명합니다. 모델 라이브러리 참조 앞의 설명 섹션  https://learnopengl-cn.github.io/  .

모든 장면은 지금까지, 우리는 우리의 친구 상자를 학대되었지만, 시간이 지남에 따라, 심지어 우리의 가장 친한 친구는 지루합니다. 매일 그래픽 프로그램에서, 그들은 일반적으로 매우 복잡한 모델을 사용하는 재미, 그들은 정적 상자보다 좋은 더보고 싶다. 그러나 다른 개체와 상자, 우리는 수동으로 같은 집, 자동차 또는 인간형 캐릭터의 모든 정점, 법선 및 텍스처 좌표로 복잡한 모양과 같은 쌍을 정의 할 수 없습니다. 우리가 원하는 것은 (모델)이 모델입니다 오기 (가져 오기)를 프로그래밍하는. 3D 모델의 예술가들에 의해 보통 블렌더 , 3DS 맥스마야 같은 도구를 정교.

이 소위 3D 모델링 도구 (3D 모델링 도구) 작가가 복잡한 모양을 만들 수 있습니다 및 사용은 데칼을 적용이라는 UV 맵핑 (UV 매핑)을 의미한다. 이러한 도구는 자동으로 모든 정점 좌표, 정점 법선을 생성하고 모델 파일로 내보낼 때 텍스처 좌표. 심지어 그래픽의 기술적 인 세부 사항을 이해하지 못하는 작가에 따라이 방법은 또한 높은 품질의 모델을 구축 할 수있는 도구의 강력한 세트를 가질 수 있습니다. 모든 기술적 인 세부 사항은 내 보낸 모델 파일에 숨겨져 있습니다. 그러나 그래픽 개발자, 우리는 필요로 이러한 기술의 세부 사항을 이해하기.

그래서, 우리의 작업은 그들이 이해할 수는 OpenGL의 형식으로 저장 한 파일을 수출 이러한 모델을 분석하고 모든 유용한 정보를 추출하는 것입니다. 아주 일반적인 문제는 모델 데이터를 내보낼 수있는 자신의 방법에있을 것입니다 각각의 파일 형식 모델의 다양한 있다는 것입니다. 이러한 파면은 .OBJ 모델은 컬러 모델과 난반사 / 반사 광 맵으로 만 데이터 및 재료 정보를 포함하도록 모델 형식. XML 기반의 콜라다 파일 형식은 모델, 조명, 재료, 애니메이션 데이터, 등등 비디오 카메라, 전체 장면 정보, 그리고 다양한 포함, 매우 풍부하다. 파면 된 .obj 형식은 일반적으로 쉽게 파싱 형식의 모델로 간주됩니다. 적어도 정보가 파일 형식을 포장하는 방법에 파면 위키 페이지의 제안을 볼 수 있습니다. 이것은 당신이 모델 파일의 기본 구조를 실현해야한다.

모든 파일 형식의 모든 다른 종류의 그들이 보통 일반적인 구조가없는 가운데, 많은있다. 우리가 이러한 파일 형식에서 모델을 가져올 경우 그래서, 우리는 각각의 파일 형식을 가져올 수에 대한 가져 오기 필터를 쓰기로 이동해야합니다. 다행히, 단지이 문제에 전념 라이브러리를 가지고있다.

모델로드 라이브러리

매우 인기있는 모델 가져 오기 라이브러리는 Assimp 는이다, 열기 자산 가져 오기 라이브러리 약어가 (개방 자원 수입 은행). Assimp는 일반적인 데이터 구조에로드 Assimp 모든 모델 데이터를 유지하는 다른 파일 포맷의 다양한 모델에 도입 될 수있다 (포맷 부분을 유도 할 수있다). Assimp로드 모델을 완성 할 때, 우리는 우리가 데이터 구조 Assimp에서 필요로하는 모든 데이터를 추출 할 수 있습니다. 데이터 구조 Assimp 가져 오기 파일 형식의 같은 상관없이 어떤 종류의 남아 있기 때문에, 서로 다른 파일이 출력 포맷에서 우리는 추상, 우리가 같은 방식으로 데이터에 액세스하는 데 사용할 필요가 있다고 할 수있다.

Assimp 도입 모델을 사용하는 경우, 그것은 일반적으로 전체의 모델로로드됩니다 장면 가져온 모든 데이터 모델 / 장면을 포함 (장면) 객체입니다. Assimp 장면은 일련의 노드 (노드), 각 노드는 객체 현장에 저장된 인덱스 데이터를 포함하는로드됩니다, 각 노드는 자식 노드의 수에는 제한이 없습니다. 간체 모델 데이터 구조는 다음 Assimp

 

  • 그리고 재료와 그리드 (메쉬)에 포함 된 장면 / 모델 데이터의 모든 같은 장면 객체입니다. 장면 객체는 장면 루트 노드에 대한 참조를 포함합니다.
  • 장면 루트 노드 (루트), 그것은 mMeshes는 저장된 데이터를 메쉬 배열을 가리키는 장면 객체의 인덱스 번호를해야합니다 (다른 노드처럼, 등) 자식 노드를 포함 할 수있다. 장면 mMeshes 배열은 실제 저장 메쉬 노드에만 mMeshes 장면 인덱스 그리드 어레이의 배열에 저장된 객체를.
  • 메쉬 객체 자체는 그러한 모든 정점 위치, 법선, 텍스처 좌표,면 (면)과 물체의 재료로서 렌더링에 필요한 관련 데이터를 포함한다.
  • 복수의 표면을 포함하는 표. 얼굴 대물 요소 (프리미티브) (삼각형, 사각형, 도트)의 렌더링을 나타낸다. 프리미티브 조성물의 정점의 인덱스를 포함하는 비행기. 버텍스 인덱스는 인덱스가 매우 간단 렌더링하는 버퍼를 사용하여 분리되어 있기 때문에 (참조 , 헬로 삼각형 ).
  • 마지막으로, 격자도 포함하는 소재 다수의 기능은 우리가 (이러한 확산 및 반사 광지도 등) 등의 컬러 및 텍스처 맵으로 대상물의 물성을 얻을 수 있도록 객체를 포함.

따라서, 첫번째로 할일이에로드 목적 장면 노드를 통과하는 물체가 해당 취득 메쉬 오브젝트 (우리는 재귀 노드의 모든 서브 - 노드를 검색), 및 각 공정 메쉬 정점을 얻기 위해 개체 데이터, 인덱스 및 물성. 최종 결과는 그리드 데이터의 일련의, 우리는 하나에 포함 것이다 Model객체입니다.

Assimp의 건설

1 : 소스 코드 assimp 다운로드

에 갈 수   http://assimp.org/index.php/downloads  다운로드 할 버전을 선택, 내가 최신 선택에 나를 인도   https://github.com/assimp/assimp/releases/tag/v4.1.0 /

2 : 설치 부스트

기능을 강화하지 않는 라이브러리가 제한된 버전을 컴파일 할 수있는 경우 assimp는 종속 부스트 라이브러리입니다.

공식 링크를 밀어 : www.boost.org

내가 부스트를 사용한다 다음 버전 내 시스템 비주얼 스튜디오 2010,2017,에, 지금은 1.69의 최신 버전을 다운로드 할 수 있습니다.

assimp는 그것은 단지 압축 해제를 다운로드 할 필요가 향상하고, 부품을 컴파일하는 데 필요한 부스트를 사용하지 않았다.

3 : assimp보기 의존의 DirectX SDK

당신이 assimp보기를 컴파일해야하는 경우 다이렉트 SDK를 설치해야합니다.

당신은에서 얻을 수있는 여기 SDK를 다운로드합니다.

로그 오프 할 필요가 없습니다 적어도 경우, 설치 후. 설치 다시 시작 exe 파일을 클릭 다이렉트 SDK 환경 구성이 작동합니다.

4 : cmake 설치

cmake 공식 링크 : www.cmake.org

실행 cmake

 assimp 소스 디렉토리를 선택 디렉토리 컴파일 된 바이너리 파일을 먼저 난 뒤에 빈 또는 bin7를 추가, 소스 디렉토리를 복사 한 다음 입력 할 수 설정할 수 있습니다. 그런 다음, BOOST_ROOT 변수를 추가, 항목 추가 디렉토리의 선거 STRING, 부가가치 향상을 (또한 assimp를 컴파일 할 수있는이 단계는 기능이 제한 될 수있다)을 입력합니다. 다음과 같이 첨가 효과 이후 :

포인트 구성은, 처음 지점은 컴파일러의 버전을 선택하도록 요청합니다.

다시 한번 생성 시점 후 구성을 지적하고, 좋은 작품을 생산하고 있습니다. 그런 다음 열기 프로젝트는 컴파일 및 링크 (빌드).

그것은 나를 위해 약간의 시간이 소요됩니다, 비주얼 스튜디오 2010 컴파일러는 항상 결과 :

========== 모두 다시 빌드 : 5 (4), 실패 (6)는 생략 성공 ==========

즉 실패합니다.

그러나 비주얼 스튜디오 2017은 성공이다. 사용에 성공이 있기 때문에 말을.

5 : assimp 사용

  • Assimp 동적 라이브러리 (동적 라이브러리)는 내장 된 기본 구성을 사용하여, 우리는 생성 포함 할 필요가 assimp.dll 바이너리 파일과 프로그램. 당신은 단순히 우리의 프로그램의 실행 파일과 같은 디렉토리에 DLL을 복사 할 수 있습니다.
  • Assimp 컴파일 한 후, 생성 및 DLL 파일은 LIB 라이브러리 위치 코드 / 디버그 또는 코드 / 릴리스 폴더에 있습니다.
  • 그런 다음 해당 디렉토리 프로젝트에 컴파일 된 LIB과 DLL 파일을 복사하고 솔루션을 연결합니다. 귀하가 그리고 헤더 파일도 복사됩니다 Assimp 기억 포함 디렉토리 (헤더 파일이 Assimp에서 다운로드 할 수 있습니다를 포함하는 디렉토리를 찾을 수 있습니다). 나는 원래 아래 디렉토리 내에서 압축을 해제 한 후 디렉토리를 포함 config.h의에서 include 디렉토리에 컴파일 된 바이너리에서 assimp 디렉토리도 복사하는 동안, 디렉토리를 포함 assimp 복사됩니다.

그런데 이러한 준비, 당신은 assimp 라이브러리 3D 다양한 파일을 가져올 수 있습니다.

6 : C ++ 응용 예 간단한

구축  Assimp :: 가져 오기  클래스의 인스턴스를, 또는 설정하는 다음 L 호출  :: 수입 :: Assimp에서 ReadFile () . 파일을 읽고에 처리 된 데이터, 처리 된 데이터 될 수  aiScene  객체의 클래스 포인터를. 당신은 필요한 데이터를 추출 할 수 있습니다. 모든 자원 관리 자체의 수입. 그것의 실종, 또한 자신의 모든 리소스를 발표했다. 그래서 가장 쉬운 방법은 당신이 결과를 사용 후, 자연스럽게 그 범위 범위를 벗어나, 현지 예를 구축하는 것입니다.

++ C 다음의 예이다 :

#include <assimp/Importer.hpp>      // C++ importer interface
#include <assimp/scene.h>           // Output data structure
#include <assimp/postprocess.h>     // Post processing flags
bool DoTheImportThing( const std::string& pFile)
{
  // Create an instance of the Importer class
  Assimp::Importer importer;
  // And have it read the given file with some example postprocessing
  // Usually - if speed is not the most important aspect for you - you'll 
  // propably to request more postprocessing than we do in this example.
  const aiScene* scene = importer.ReadFile( pFile, 
        aiProcess_CalcTangentSpace       | 
        aiProcess_Triangulate            |
        aiProcess_JoinIdenticalVertices  |
        aiProcess_SortByPType);
  
  // If the import failed, report it
  if( !scene)
  {
    DoTheErrorLogging( importer.GetErrorString());
    return false;
  }
  // Now we can access the file's contents. 
  DoTheSceneProcessing( scene);
  // We're done. Everything will be cleaned up by the importer destructor
  return true;
}

 

추천

출처blog.csdn.net/leon_zeng0/article/details/88860645