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::vec3 Tangent;
glm::vec3 Bitangent;
};
struct