【问题标题】:assimp segfault when accesing mesh dataassimp segfault 访问网格数据时
【发布时间】:2020-11-30 21:28:19
【问题描述】:

我正在尝试使用 Assimp 加载我的模型 (from this tutorial)。没有报告加载错误,但尝试从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 & 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
    }
    //...
}

【问题讨论】:

  • 这个问题解决了吗?

标签: c++ assimp


【解决方案1】:

总和中的代码看起来是正确的,但数据结构中可能存在一些故障。

您必须检查存储在节点中的索引是否有效并且在 0 ... mNumMeshes-1 范围内。如果您在网格数组中获得越界访问,则可能会发生崩溃,

【讨论】:

  • mMeshes 数组好像填错了数据。我尝试使用 aiProcess_PreTransformVertices 标志来“展平”树结构。在这种情况下,您可以忽略树结构并直接处理网格,而无需来自节点的索引(assimp doc)。但是结果是一样的。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2013-02-20
  • 2017-01-11
  • 1970-01-01
  • 2015-03-17
  • 2015-10-01
  • 1970-01-01
相关资源
最近更新 更多