1

我正在开发一个 3D OpenGL (C++) 应用程序,其中我有自己的基于半边数据结构的网格结构。我想构建一种简单的方法来将 Wavefront obj 文件加载到我的网格结构中。当然,我可以逐行天真地这样做,但必须有一些更有效的方法(我知道专业应用程序不会天真地逐行加载文件,对于数百万个顶点来说太慢了)。

谁能指点我一个教程或一个非常快速的 OBJ 加载器的例子?如果它与半边数据结构有关,那将是更可取的。

编辑:

我希望解决两个基本问题

1) 避免从文件中读取浮点数的一般缓慢

2)我如何智能地动态确定每个边缘的“相邻”半边。我正在想象某种散列函数来确定正在创建的边的对称边或下一条边是否已经存在,如果存在,则使用该指针。

4

2 回答 2

2

读取和解码 ascii 文件很慢,尤其是当文件有一百万个浮点数要转换时。

我的想法:用你想要的任何语言编写一个程序,将 .obj 文件翻译成二进制格式,你的程序可以或多或少地直接读入内存。然后在您要加载的 .obj 文件上运行该程序,并让您的程序加载翻译后的文件。

对于额外的点,您可以让您的 opengl 程序即时执行此翻译并缓存结果,检查文件修改时间并根据需要更新缓存。

于 2012-04-10T01:33:47.833 回答
2

不久前我在加载 OBJ 文件时遇到了类似的问题,尽管我正在搜索共享顶点而不是边。由于文件格式本身不包含连接信息,因此最好的方法是使用std::set. 每次您想向数据结构添加边时,您都可以搜索该集合以查看它是否已经存在。集合搜索在复杂性上是对数的,因此它可以很好地随着数据结构的大小而扩展。我能想到的避免这种情况的唯一方法是选择包含所需连接信息的文件格式,或者按照 Michael Slade 的建议创建自己的格式和转换工具。

于 2012-04-13T02:56:22.507 回答