Assimp(Open Asset Import Library)
3D模型加载核心流程
1. Assimp集成
安装与包含:
# Linux安装
sudo apt-get install libassimp-dev# Windows:下载预编译库
https://github.com/assimp/assimp/releases
CMake配置:
find_package(assimp REQUIRED)
target_link_libraries(YourProject assimp::assimp)
代码包含:
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
2. 模型加载基础
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile("models/backpack.obj",aiProcess_Triangulate | aiProcess_FlipUVs |aiProcess_CalcTangentSpace |aiProcess_GenNormals
);if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {std::cerr << "Assimp error: " << importer.GetErrorString() << std::endl;return;
}
常用处理标志:
标志 | 描述 |
---|---|
aiProcess_Triangulate | 将多边形转换为三角形 |
aiProcess_FlipUVs | 翻转纹理坐标Y轴 |
aiProcess_GenNormals | 自动生成法线 |
aiProcess_CalcTangentSpace | 计算切线空间 |
aiProcess_OptimizeMeshes | 合并网格减少绘制调用 |
aiProcess_JoinIdenticalVertices | 合并重复顶点 |
3. 网格类设计
头文件 Mesh.h:
class Mesh {
public:// 网格数据std::vector<Vertex> vertices;std::vector<unsigned int> indices;std::vector<Texture> textures;Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, std::vector<Texture> textures);void Draw(Shader &shader);private:// 渲染状态unsigned int VAO, VBO, EBO;void setupMesh();
};struct Vertex {glm::vec3 Position;glm::vec3 Normal;glm::vec2 TexCoords;glm