加載函數(shù)
調(diào)用loadModel函數(shù)加載模型文件腐宋,此函數(shù)有兩個參數(shù):
- 文件路徑
- 后期處理選項
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
常用的后期處理選項:
- aiProcess_Triangulate:如果模型不是(全部)由三角形組成,它需要將模型所有的圖元形狀變換為三角形;
- aiProcess_FlipUVs : 在處理的時候翻轉(zhuǎn)y軸的紋理坐標
- aiProcess_GenNormals : 如果模型不包含法向量的話枕荞,就為每個頂點創(chuàng)建法線
- aiProcess_SplitLargeMeshes : 將比較大的網(wǎng)格分割成更小的子網(wǎng)格
- aiProcess_OptimizeMeshes : 將多個小網(wǎng)格拼接為一個大的網(wǎng)格嗅绰,減少繪制調(diào)用從而進行優(yōu)化
完整的loadModel函數(shù)時這樣的:
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);
}
在正確加載模型文件后挣跋,我們得到:
- 根節(jié)點
- 場景
在***processNode****函數(shù)中玛痊,我們將以遞歸的形式處理節(jié)點中的各個網(wǎng)格烘贴,將處理后的網(wǎng)格放入到meshes變量中:
void processNode(aiNode *node, const aiScene *scene)
{
// 處理節(jié)點所有的網(wǎng)格(如果有的話)
for(unsigned int i = 0; i < node->mNumMeshes; i++)
{
aiMesh *mesh = scene->mMeshes[node->mMeshes[i]];
meshes.push_back(processMesh(mesh, scene));
}
// 接下來對它的子節(jié)點重復(fù)這一過程
for(unsigned int i = 0; i < node->mNumChildren; i++)
{
processNode(node->mChildren[i], scene);
}
}