【发布时间】: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