Language: CPP
Graphics/Game Development
Assimp was created to address the lack of a standardized way to import 3D assets in graphics and game engines. Instead of writing custom loaders for every file format, developers can rely on Assimp’s robust and extensible API. Today, Assimp supports over 40 3D formats and is widely used in engines, visualization tools, and AR/VR applications.
Assimp (Open Asset Import Library) is a portable and extensible library that imports and processes 3D models in various formats. It provides a unified API for loading meshes, materials, animations, and scene data from files like OBJ, FBX, COLLADA, and many more.
sudo apt install assimp-devbrew install assimpDownload precompiled binaries or build from source at https://github.com/assimp/assimpAssimp simplifies importing 3D models by converting them into a unified in-memory representation. It handles geometry, textures, materials, bones, and animations, making it easy to integrate assets into graphics pipelines or game engines.
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#include <iostream>
int main() {
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile("model.obj",
aiProcess_Triangulate | aiProcess_FlipUVs);
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
std::cerr << "Error: " << importer.GetErrorString() << std::endl;
return -1;
}
std::cout << "Model loaded with " << scene->mNumMeshes << " meshes." << std::endl;
return 0;
}Imports a model from OBJ format, triangulates faces, flips UVs, and prints the number of meshes loaded.
for (unsigned int i = 0; i < scene->mNumMeshes; i++) {
aiMesh* mesh = scene->mMeshes[i];
std::cout << "Mesh has " << mesh->mNumVertices << " vertices." << std::endl;
}Loops through all meshes in the scene and prints vertex counts.
for (unsigned int i = 0; i < scene->mNumMaterials; i++) {
aiMaterial* material = scene->mMaterials[i];
aiString name;
if (material->Get(AI_MATKEY_NAME, name) == AI_SUCCESS)
std::cout << "Material name: " << name.C_Str() << std::endl;
}Retrieves material names from the imported model.
if (scene->mAnimations != nullptr) {
std::cout << "Model contains " << scene->mNumAnimations << " animations." << std::endl;
}Checks and logs if the imported model contains animations.
void processNode(aiNode* node, const aiScene* scene) {
for (unsigned int i = 0; i < node->mNumMeshes; i++) {
aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
std::cout << "Processing mesh with " << mesh->mNumVertices << " vertices" << std::endl;
}
for (unsigned int i = 0; i < node->mNumChildren; i++) {
processNode(node->mChildren[i], scene);
}
}
processNode(scene->mRootNode, scene);Traverses the scene graph recursively to process meshes in a hierarchy (useful for game engines).
Always check the return value of `ReadFile` for errors before accessing the scene.
Use post-processing flags like `aiProcess_Triangulate` and `aiProcess_GenNormals` to simplify mesh data.
Free resources properly by relying on `Assimp::Importer` object lifetime.
Handle missing textures and materials gracefully to avoid crashes.
Cache model data if reusing assets to avoid repeated parsing costs.