【问题标题】:Assimp C++ NULL mesh face dataAssimp C++ NULL 网格面数据
【发布时间】:2022-01-06 16:45:21
【问题描述】:

我遇到这个问题已经有一段时间了,我确定我有一些根本性的错误。 Assimp 是从 github 上最近提交的源代码构建的,但我也在 v5.0.0/1/2 上尝试过。

我可以在 Assimp 中几乎完成导入 fbx 文件(转换后所有网格都由三角形组成),但是当从网格访问面数据时,面为空(或指向无效内存)。

整个代码:

void recursive_explorer(aiNode *n, const aiScene *s) {
    if (n) {
        if (n->mNumChildren != 0) {
            for (unsigned i = 0; i < n->mNumChildren; i++) {
                recursive_explorer(n->mChildren[i], s);
            }
        } else {
            printf("%d\n", n->mNumMeshes);

            for (unsigned j = 0; j < n->mNumMeshes; j++) {
                const struct aiMesh *m = s->mMeshes[n->mMeshes[j]];
                printf("\t%d\n", m->mNumFaces);
                if (m->HasFaces()) {
                    for (unsigned k = 0; k < m->mNumFaces; k++) {
                        printf("\t\t%p\n", &m->mFaces[k]);
                    }
                }
            }
        }
    }
}

int main() {
    Assimp::Importer importer;
    std::fstream f("../maps/de_dust2.fbx");
    const aiScene *s = importer.ReadFile("../maps/de_dust2.fbx",
                                         aiProcess_SortByPType | aiProcess_JoinIdenticalVertices |
                                         aiProcess_Triangulate);

    printf("Root has %d children\n", s->mRootNode->mNumChildren);
    for (unsigned i = 0; i < s->mRootNode->mNumChildren; i++) {
        printf("[%u] %s\n", i, s->mRootNode->mChildren[i]->mName.C_Str());
        recursive_explorer(s->mRootNode->mChildren[i], s);
    }

    return 0;
}

结果:

Root has 3 children
[0] CINEMA_4D_Editor
0
[1] Sky
0
0
0
0
0
[2] de_dust2
2
    4
        0x1b1b1b1b1b1b1b1b
        0x1b1b1b1b1b1b1b2b
        0x1b1b1b1b1b1b1b3b
        ...

如果我尝试访问人脸(以获取 mNumIndices 或 mIndices),我会遇到段错误。

我尝试了不同的预处理选项,但还没有找到合适的组合。

我知道这个可以工作,因为我之前已经设法让这个特定的地图工作,但我确信我错过了一些非常明显的东西。提前致谢!

【问题讨论】:

  • 你试过调试(除了printf debugging)你的代码吗?
  • 我的调试器告诉我面是无效的,如果我尝试访问它们,就会抛出 EXC_BAD_ACCESS 错误,不管 fbx 或目标文件。
  • 在加载时听起来像是一个问题。面孔是否曾经正确加载/读取?
  • 我不确定我是否理解,但唯一一次访问它们是在该打印语句中。我不认为我有办法知道它们是否在此之前加载过,因为打印它们的过程是找到它们的资源管理器。
  • 是的,你有办法。启动调试会话并逐步完成加载过程。然后检查模型字段,看看它们是否被正确加载/处理。

标签: c++ geometry assets libraries assimp


【解决方案1】:

在我当前的环境下,我发现 assimp build v5.1.0.rc1 可以工作

  • MacOS Monterey 12.1
  • cmake V3.16
  • clang 13.0.0

我为尝试使 v5.1.5 正常工作而进行的测试:

  • 一些不同的 .fbx 和 .obj 文件
  • 大多数 assimp 导入器预处理器选项
  • 所有(甚至轻微)相关的 cmake 构建标志

也许这特别是一个 MacOS 问题,尽管我在网上看到了一些其他类似问题的帖子,希望这会有所帮助。谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2021-12-27
    • 2022-11-28
    • 2015-12-27
    • 2017-04-19
    • 2020-09-11
    • 2018-05-24
    相关资源
    最近更新 更多