导入 .obj 时出现未经处理的异常



在过去的两周里,我一直在努力让 Assimp 正常工作,但无济于事,所以我决定在这里询问是最好的办法。我遵循了thecplusplusguy关于导入静态网格体的教程,并逐字复制了它,以使其工作。

当我尝试导入一个 .obj(一个多维数据集,如果这很重要)时,它说我有一个"OpenGL.exe 中0x00EF061B未处理的异常:0xC0000005:访问违规读取位置0xABABAFFB",它会停止程序并告诉我它在我的代码的第 30 行("for(int i=0;imNumMeshes;i++)")。

#include "sceneloader.h"
sceneLoader::sceneLoader(){
    std::cout<<"New scene created."<<std::endl;
}
sceneLoader::sceneLoader(const char* filename){
    std::cout<<"Scene loading hath begun."<<std::endl;
    Assimp::Importer importer;
    const aiScene* scene = importer.ReadFile(filename,aiProcess_GenSmoothNormals | aiProcess_Triangulate |
        aiProcess_CalcTangentSpace | aiProcess_FlipUVs |
        aiProcess_JoinIdenticalVertices);
    if(scene->mFlags == AI_SCENE_FLAGS_INCOMPLETE){
        std::cout<<"MFLAGS - Scene '"<<filename<<"' could not be loaded."<<std::endl;
        return;
    }
    if(!scene->mRootNode){
        std::cout<<"MROOTNODE - Scene '"<<filename<<"' could not be loaded."<<std::endl;
        return;
    }
    std::cout<<"Recursive processing about to begin."<<std::endl;
    recursiveProcess(scene->mRootNode,scene);
    std::cout<<"Recursive processing finished."<<std::endl;
}
void sceneLoader::recursiveProcess(aiNode* node, const aiScene* scene){
    //process
    for(int i = 0; i<node->mNumMeshes;i++){         //HERE IS THE PROBLEM
        aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
            processMesh(mesh,scene);
        }
        //recursion
        for(int i = 0; 0<node->mNumChildren;i++){
            recursiveProcess(node->mChildren[i],scene);
        }
}

当我添加 cout 来调试它时,"scene->mNumMeshes"返回 1(它应该返回,因为它是一个立方体),但"node->mNumMeshes"返回 0。

我知道当有一个空指针时会发生未经处理的异常,并且这里的空指针是"node->mNumMeshes",但为什么它是空的?我将如何解决这个问题?

我的错。有一个错别字:

void sceneLoader::recursiveProcess(aiNode* node, const aiScene* scene){
    //process
    for(int i = 0; i<node->mNumMeshes;i++){         
        aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
            processMesh(mesh,scene);
        }
        //recursion
        for(int i = 0; 0<node->mNumChildren;i++){ //IT SHOULD BE AN i INSTEAD OF A ZERO
            recursiveProcess(node->mChildren[i],scene);
        }
}

完成的代码如下所示:

void sceneLoader::recursiveProcess(aiNode* node, const aiScene* scene){
    //process
    for(unsigned int i = 0; i<node->mNumMeshes;i++){    
        aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
        processMesh(mesh,scene);
        }
        //recursion
    if(node->mNumChildren > 0){
            for(unsigned int i = 0; i<node->mNumChildren;i++){
                recursiveProcess(node->mChildren[i],scene);
            }
    }
}

不好意思。不会再发生。

最新更新