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 )
此外還支持對導入的模型做一些常用的處理,如把四邊形轉換爲三角形、計算切線和副法線、將大模型分割爲小模型等。
Assimp的主頁:http://assimp.sourceforge.net/index.html
讀取模型文件的一個例子:
#include <assimp/Importer.hpp> // 導入器在該頭文件中定義 #include <assimp/scene.h> // 讀取到的模型數據都放在scene中 #include <assimp/postprocess.h> // 該頭文件中包含後處理的標誌位定義 bool Import( const std::string& pFile) { // 定義一個導入器 Assimp::Importer importer; // 使用導入器導入選定的模型文件 const aiScene* scene = importer.ReadFile( pFile, aiProcess_CalcTangentSpace| //後處理標誌,自動計算切線和副法線 aiProcess_Triangulate| //後處理標誌,自動將四邊形面轉換爲三角面 aiProcess_JoinIdenticalVertices| //後處理標誌,自動合併相同的頂點 aiProcess_SortByPType); //後處理標誌,將不同圖元放置到不同的模型中去,圖片類型可能是點、直線、三角形等 //更多後處理標誌可以參考Assimp的文檔 if( !scene) { //導入錯誤,獲取錯誤信息並進行相應的處理 //DoTheErrorLogging( importer.GetErrorString()); return false; } // 根據需要獲取scene中的模型數據,各種數據的獲取方式可以參考Assimp的文檔 //DoTheSceneProcessing( scene); return true; }