Я пытался заставить Assimp правильно работать в течение последних двух недель, но безуспешно, поэтому я решил спросить, что это было лучше всего. Я следил за учебником по сборке ccplusplusguy по импорту статических сеток, и я скопировал его слово в слово, пытаясь заставить его работать.
Когда я пытаюсь импортировать.obj (куб, если это имеет значение), это говорит о том, что у меня есть "Необработанное исключение в 0x00EF061B в OpenGL.exe: 0xC0000005: место чтения нарушения доступа 0xABABAFFB", оно останавливает программу и сообщает мне об этом 30 моего кода ("for (int я = 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);
}
}
Когда я добавил кутры для его отладки, "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);
}
}
}
Сожалею. Больше не повторится.