ошибка assimp segfault при доступе к данным сетки

#c #assimp

#c #assimp

Вопрос:

Я пытаюсь загрузить свою модель (из этого руководства) с помощью Assimp. Ошибка загрузки не сообщается, но я получаю ошибку сегментации при попытке получить доступ к сетке scene->mMeshes . Что может быть причиной этого?

Вот пример кода:

 void resource_manager::load_model(std::string path)
{
    model new_model;
    const aiScene *scene = load_file(path);
    new_model.meshes = load_meshes(scene, scene->mRootNode);
    //...
}

const aiScene *resource_manager::load_file(std::string path)
{
    Assimp::Importer import;
    constexpr auto assimp_flags = 0 | aiProcess_JoinIdenticalVertices | aiProcess_Triangulate |
                                      aiProcess_FlipUVs | aiProcess_ValidateDataStructure;
    const aiScene *scene = import.ReadFile(path, assimp_flags);
    if (scene == nullptr || scene->mFlags amp; AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
    {
        //error handling is not called
    }
    return scene;
}
std::vector<mesh> resource_manager::load_meshes(const aiScene *scene, const aiNode *node)
{
    std::vector<mesh> meshes;
    for (int i = 0; i < node->mNumMeshes; i  )
    {
        mesh new_mesh;
        auto current_aiMesh = scene->mMeshes[node->mMeshes[i]];
        new_mesh.vertices = load_vertices(current_aiMesh);
        //...
    }
    //...
}
std::vector<vertex> resource_manager::load_vertices(aiMesh *mesh)
{
    std::vector<vertex> vertices;
    for (unsigned int i = 0; i < mesh->mNumVertices; i  )//segfault occurs here
    {
        //vertex processing
    }
    //...
}
 

Комментарии:

1. Это уже решено?

Ответ №1:

Код в сумме выглядит корректно, но, возможно, в структурах данных есть некоторые сбои.

Вы должны проверить, являются ли индексы, которые хранятся в узле, действительными и в пределах 0… mNumMeshes-1. Если вы получаете доступ за пределы массива сеток, может произойти сбой,

Комментарии:

1. Кажется, что массив mMeshes заполнен неверными данными. Я попытался использовать флаг aiProcess_PreTransformVertices, чтобы «сгладить» древовидную структуру. В этом случае вы можете игнорировать древовидную структуру и работать с сетками напрямую, без индексов из узлов ( assimp doc ). Однако результаты те же.