Скопировать указатель в aiScene - PullRequest
0 голосов
/ 28 марта 2019

Я делаю скелетную анимацию, используя Assimp. Соответственно мне всегда нужны загруженные им данные. Но по какой-то причине эти данные становятся недоступными и приводят к ошибке сегментации. Ниже приведен код проблемы:

static Mesh processMesh(const aiMesh *aimesh, const aiScene *scene) {
    Mesh mesh;
    mesh.ai_scene = scene;
    std::cout << mesh.ai_scene->mRootNode->mName.data; // OK

    ...
}

Но если вы сделаете это внутри самой сетки, это приведет к ошибке. Например:

void boneTransform(float TimeInSeconds) {
    glm::mat4 identity = glm::mat4();
    std::cout << ai_scene->mRootNode->mName.data; // SEG FAULT
    ...
}

EDIT: ai_scene находится в структуре Mesh:

private:
const aiScene *ai_scene = nullptr;

Сама сцена создается в структуре модели следующим образом:

void init(const std::string &path, const GLuint params) {
    // Create an instance of the Importer class
    Assimp::Importer importer;
    const aiScene *scene = importer.ReadFile(path, params);

    // If the import failed, report it
    if (!scene) {
        std::cout << importer.GetErrorString() << "\n";
        return;
    }

    processNode(scene->mRootNode, scene);
}

processNode код:

void processNode(const aiNode *node, const aiScene *scene) {
    for (size_t i = 0; i < node->mNumMeshes; i++) {
        aiMesh *mesh = scene->mMeshes[node->mMeshes[i]];
        meshes.push_back(Mesh::processMesh(mesh, scene));       
    }

    for(size_t i = 0; i < node->mNumChildren; i++) {
        processNode(node->mChildren[i], scene);
    }
}

В чем эта проблема? И как это решить?

1 Ответ

0 голосов
/ 29 марта 2019

Проблема была решена путем расширения области действия Assimp::Importer importer:

// Create an instance of the Importer class
Assimp::Importer importer;
void init(const std::string &path, const GLuint params) {
    const aiScene *scene = importer.ReadFile(path, params);
    ...
}
...