美文网首页OpenGL学习笔记
【六十,模型加载-7 加载模型】

【六十,模型加载-7 加载模型】

作者: Woodlouse | 来源:发表于2020-01-07 22:04 被阅读0次

加载函数

调用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);
}

在正确加载模型文件后,我们得到:

  1. 根节点
  2. 场景

在***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);
    }
}

相关文章

网友评论

    本文标题:【六十,模型加载-7 加载模型】

    本文链接:https://www.haomeiwen.com/subject/yzwdactx.html