加载函数
调用loadModel函数加载模型文件,此函数有两个参数:
- 文件路径
- 后期处理选项
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
常用的后期处理选项:
- aiProcess_Triangulate:如果模型不是(全部)由三角形组成,它需要将模型所有的图元形状变换为三角形;
- aiProcess_FlipUVs : 在处理的时候翻转y轴的纹理坐标
- aiProcess_GenNormals : 如果模型不包含法向量的话,就为每个顶点创建法线
- aiProcess_SplitLargeMeshes : 将比较大的网格分割成更小的子网格
- aiProcess_OptimizeMeshes : 将多个小网格拼接为一个大的网格,减少绘制调用从而进行优化
完整的loadModel函数时这样的:
void loadModel(string path)
{
Assimp::Importer import;
const aiScene *scene = import.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
if(!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
{
cout << "ERROR::ASSIMP::" << import.GetErrorString() << endl;
return;
}
directory = path.substr(0, path.find_last_of('/'));
processNode(scene->mRootNode, scene);
}
在正确加载模型文件后,我们得到:
- 根节点
- 场景
在***processNode****函数中,我们将以递归的形式处理节点中的各个网格,将处理后的网格放入到meshes变量中:
void processNode(aiNode *node, const aiScene *scene)
{
// 处理节点所有的网格(如果有的话)
for(unsigned int i = 0; i < node->mNumMeshes; i++)
{
aiMesh *mesh = scene->mMeshes[node->mMeshes[i]];
meshes.push_back(processMesh(mesh, scene));
}
// 接下来对它的子节点重复这一过程
for(unsigned int i = 0; i < node->mNumChildren; i++)
{
processNode(node->mChildren[i], scene);
}
}