`

ASSIMP概述

 
阅读更多

在3D渲染的时候,工作量比较大且比较麻烦的一件事就是建模,如果想降低这种麻烦就需要借用网络上已经存在的一些模型素材,至少这是非商用渲染程序常用手段(咱们自己写例子的时候经常这样做)。但是,由于网络中的模型格式众多,如果自己一一去解析代价也挺高的。ASSIMP作为一个开源项目,设计了一套可扩展的架构,为模型的导入导出提供了良好的支持。这里说的导入是把模型文件,解析成ASSIMP自身定义的一套模型,而导出即是把自身建立的模型结构导出为模型文件。

ASSIMP默认提供了网络上比较流行的多种模型文件格式的导入和导出,如果我们仍需要对一下特殊的文件格式做这些操作,可以自己扩展。

 

Importer :

//1.注册模型导入实现类,BaseImporter对应的是一种具体的格式的模型文件
aiReturn RegisterLoader(BaseImporter* pImp);
aiReturn UnregisterLoader(BaseImporter* pImp);

//2.注册处理过程,BaseProcess对应一个加载后的处理过程,例如把所有的非三角形网格变成三角形网格之类的,功能很强大
aiReturn RegisterPPStep(BaseProcess* pImp);
aiReturn UnregisterPPStep(BaseProcess* pImp);

//3.各种属性
void SetPropertyInteger(const char* szName, int iValue, bool*   bWasExisting = NULL);
void SetPropertyBool(const char* szName, bool value, bool* bWasExisting = NULL)	{
		SetPropertyInteger(szName,value,bWasExisting);
	}
void SetPropertyFloat(const char* szName, float fValue, bool* bWasExisting = NULL);
void SetPropertyString(const char* szName, const std::string& sValue, bool* bWasExisting = NULL);
int GetPropertyInteger(const char* szName, int iErrorReturn = 0xffffffff) const;
bool GetPropertyBool(const char* szName, bool bErrorReturn = false) const {
		return GetPropertyInteger(szName,bErrorReturn)!=0;
	}
float GetPropertyFloat(const char* szName, float fErrorReturn = 10e10f) const;
const std::string& GetPropertyString(const char* szName,const std::string& sErrorReturn = "") const;

//4.IOSystem只有一个,这是ASSIMP封住好的读写文件的类,这功能不需要扩展。
void SetIOHandler( IOSystem* pIOHandler);
IOSystem* GetIOHandler() const;
bool IsDefaultIOHandler() const;

//5.这个是意淫中的功能至少我的用的3.0版本里面,它还不是一个功能。
void SetProgressHandler ( ProgressHandler* pHandler );
ProgressHandler* GetProgressHandler() const;
bool IsDefaultProgressHandler() const;
bool ValidateFlags(unsigned int pFlags) const;

//6.读文件最终获得一个aiScene对象
const aiScene* ReadFile(const char* pFile, unsigned int pFlags);
const aiScene* ReadFileFromMemory( const void* pBuffer,size_t pLength,unsigned int pFlags,const char* pHint = "");
const aiScene* ApplyPostProcessing(unsigned int pFlags);
const aiScene* ReadFile(const std::string& pFile, unsigned int pFlags);
void FreeScene( );
const char* GetErrorString() const;
const aiScene* GetScene() const;
aiScene* GetOrphanedScene();

由于导入模型和导出模型是两个不相干的事情,所以在ASSIMP里面它们是没有任何联系的,Importer 作为导入模型的入口类,其管理的角色比较明显。以这种服务注册的模式,使代码的结构更松散。另外,上述对象都保存在ImporterPimpl里面而不是Importer 里面。

 

读取模型的过程:

//把完整的方法的主要内容提取出来
const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags)
{
      // 1. 释放掉旧的内容
      if (pimpl->mScene){
             FreeScene();
       }

      // 2.找出可以读当前文件的插件,这里存在一个隐患,如果列表里面有多个满足此文件,第一个优先采纳。
      BaseImporter* imp = NULL;
      for( unsigned int a = 0; a < pimpl->mImporter.size(); a++){
            if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, false)) {
		imp = pimpl->mImporter[a];
		break;
	    }
       }
      //... 这里略过一堆蛋疼的代码,不知道编程的人怎么想的,我觉得上面就够了。

      // 3.先更新Progress,然后再解析模型
      pimpl->mProgressHandler->Update();
      pimpl->mScene = imp->ReadFile( this, pFile, pimpl->mIOHandler);
      pimpl->mProgressHandler->Update();  // 这里为啥又要调一次?不懂

      // 4. 这个地方还有一个后处理步骤
      if( pimpl->mScene){
		ScenePreprocessor pre(pimpl->mScene);
		pre.ProcessScene();
		pimpl->mProgressHandler->Update();
		ApplyPostProcessing(pFlags & (~aiProcess_ValidateDataStructure));
	}
	pimpl->mPPShared->Clean();
	return pimpl->mScene;
}

浓缩版的ReadFile方法,描述了整个解析过程,细节不再关注,这个插件主要强调的是用而不是修改。

 

支持的数据格式:

Assimp(Open Asset Import Library)是一个支持读取多种模型资源的开源库,当前最新的版本是3.0版,支持读取以下类型的3D模型:

  • Collada ( .dae )
  • Blender 3D ( .blend )
  • 3ds Max 3DS ( .3ds )
  • 3ds Max ASE ( .ase )
  • Wavefront Object ( .obj )
  • Industry Foundation Classes (IFC/Step) ( .ifc )
  • XGL ( .xgl,.zgl )
  • Stanford Polygon Library ( .ply )
  • *AutoCAD DXF ( .dxf )
  • LightWave ( .lwo )
  • LightWave Scene ( .lws )
  • Modo ( .lxo )
  • Stereolithography ( .stl )
  • DirectX X ( .x )
  • AC3D ( .ac )
  • Milkshape 3D ( .ms3d )
  • * TrueSpace ( .cob,.scn )Biovision BVH ( .bvh )
  • * CharacterStudio Motion ( .csm )Ogre XML ( .xml )
  • Irrlicht Mesh ( .irrmesh )
  • * Irrlicht Scene ( .irr )
  • Quake I ( .mdl )
  • Quake II ( .md2 )
  • Quake III Mesh ( .md3 )
  • Quake III Map/BSP ( .pk3 )
  • * Return to Castle Wolfenstein ( .mdc )
  • Doom 3 ( .md5* )
  • *Valve Model ( .smd,.vta )
  • *Starcraft II M3 ( .m3 )
  • *Unreal ( .3d )BlitzBasic 3D ( .b3d )
  • Quick3D ( .q3d,.q3s )
  • Neutral File Format ( .nff )
  • Sense8 WorldToolKit ( .nff )
  • Object File Format ( .off )
  • PovRAY Raw ( .raw )
  • Terragen Terrain ( .ter )
  • 3D GameStudio (3DGS) ( .mdl )
  • 3D GameStudio (3DGS) Terrain ( .hmp )
  • Izware Nendo ( .ndo )

支持以下格式的导出:

  • Collada ( .dae )
  • Wavefront Object ( .obj )
  • Stereolithography ( .stl )
  • Stanford Polygon Library ( .ply )

此外还支持对导入的模型做一些常用的处理,如把四边形转换为三角形、计算切线和副法线、将大模型分割为小模型等。

 

 

 

分享到:
评论

相关推荐

    Qt使用assimp加载fbx动画,assimp 3.3.1、Qt 5.6.1、Mingw4.9.2

    在本文中,我们将深入探讨如何使用Qt结合Assimp库加载并播放FBX格式的3D动画。我们将重点关注在Qt 5.6.1环境中,利用Assimp 3.3.1版本来处理3D模型,特别是针对Win0系统中的Mingw4.9.2编译器的兼容性问题。 首先,...

    assimp-5.0.1.zip

    assimp 5.0.1版本,我用VS2019编译过,可生成assimp-vc142-mtd.dll和assimp-vc142-mtd.lib,并可用。 使用默认配置构建的Assimp是一个动态库(Dynamic Library),所以我们需要包含所生成的assimp.dll文件以及程序的...

    assimp-vc142-mt.dll

    现在市面上有一个很流行的模型加载库,叫做Assimp,全称为Open Asset Import Library。Assimp可以导入几十种不同格式的模型文件(同样也可以导出部分模型格式)。只要Assimp加载完了模型文件,我们就可以从Assimp上...

    assimp-4.0.1.zip

    《assimp库详解及其在3D模型导入中的应用》 assimp,全称为"Assimp",是一个开源的跨平台3D模型导入库,专为游戏开发和图形应用程序设计。这个库提供了强大的功能,能够处理多种3D模型格式,简化了开发者的工作,使...

    Assimp for .net

    Assimp for .NET 是一个专为.NET框架设计的库,它是Open Asset Import Library(简称Assimp)的.NET接口实现。Assimp是一个开源的、跨平台的库,主要用于处理三维模型的导入工作,它支持多种3D模型文件格式,并提供...

    assimp4.1.zip

    《使用ASSIMP库进行3D模型导入:VS2017-2021集成环境下的编译与Boost集成》 在计算机图形学领域,3D模型的导入和处理是至关重要的一步,尤其是在游戏开发、可视化应用以及设计软件中。ASSIMP(ASCII Scene Importer...

    assimp源码vs2008

    《在VS2008下编译通过的Assimp库详解》 Assimp库,全称为"ASCII Scene Importer",是一款开源的跨平台三维模型导入库,它为游戏开发、三维可视化应用等提供了强大的模型加载功能。此库支持多种三维模型格式,包括但...

    assimp_VS2015 编译结果

    只要Assimp加载完了模型文件,我们就可以从Assimp上获取所有我们需要的模型数据。Assimp把不同的模型文件都转换为一个统一的数据结构,所有无论我们导入何种格式的模型文件,都可以用同一个方式去访问我们需要的模型...

    编译好的assimp库

    **编译好的assimp库** 是一个用于3D模型导入和处理的开源库,它为开发者提供了一套方便、高效且跨平台的工具集。在VS(Visual Studio)环境中使用这个库,可以让开发者轻松地在自己的项目中集成3D模型加载功能,无需...

    Visual Studio 2015 Assimp库文件

    《Visual Studio 2015与Assimp库的深度整合》 在计算机图形学和游戏开发领域,导入和处理3D模型是一项基础且关键的任务。Assimp库,全称为"Open Asset Import Library",是一个开源的跨平台库,专门用于加载和转换...

    assimp-4.1.0.zip

    assimp-4.1.0版,因github下载速度慢,可在此处下载,用于配置OpenGL导入复杂的模型

    assimp5.0.1 C++ Tools.zip

    《assimp5.0.1 C++ Tools.zip:掌握模型导入与处理的高效工具》 在游戏开发、3D建模以及虚拟现实等领域,模型数据的导入与处理是至关重要的环节。Assimp库是一个跨平台的开源库,专门用于导入和处理三维模型数据。...

    Assimp.rar

    《使用Assimp库进行模型加载》 在计算机图形学领域,模型加载是将3D模型数据导入应用程序并准备渲染的关键步骤。在这个过程中,Assimp库扮演了重要角色。Assimp是一个开源、跨平台的三维模型导入库,它支持多种3D...

    assimp库文件(lib,dll)

    **assimp库文件详解** Assimp(Asset Import Library)是一个跨平台的开源库,专为游戏开发、3D建模和虚拟现实应用设计,用于导入和处理多种3D模型文件格式。它支持超过40种不同的3D模型格式,如OBJ、FBX、3DS、...

    assimp3.1.1头文件

    《assimp3.1.1头文件:深入理解与应用》 assimp库是一个开源的、跨平台的3D模型导入库,它为游戏开发、3D建模、虚拟现实等领域的开发者提供了便利,能够处理多种3D模型格式。在assimp3.1.1版本中,头文件是理解并...

    assimp 3D模型浏览器

    assimp 3D模型浏览器,可以浏览任何格式的3D文件,包括动画

    assimp.zip

    Assimp库是一个开源的、跨平台的三维模型导入库,旨在简化游戏开发、3D建模和其他相关领域中从各种3D文件格式加载和预处理数据的过程。在本例中,"assimp.zip"文件是一个包含编译好的Assimp库的压缩包,适用于Visual...

    assimp-vc142-mtd.dll

    只要Assimp加载完了模型文件,我们就可以从Assimp上获取所有我们需要的模型数据。Assimp把不同的模型文件都转换为一个统一的数据结构,所有无论我们导入何种格式的模型文件,都可以用同一个方式去访问我们需要的模型...

Global site tag (gtag.js) - Google Analytics