我正在开发一个3D OpenGl(C ++)应用程序,其中我有自己的基于Half-Edge数据结构的Mesh结构。我想构建一种将Wavefront obj文件加载到我的网状结构中的简单方法。当然,我可以逐行地做到这一点,但必须有一些更有效的方法(我知道专业应用程序不是逐行加载文件,对于数百万个顶点来说太慢了)。
有人能指点我的教程或一个非常快的OBJ加载器的例子吗?如果它与Half Edge数据结构有关,那将更为可取。
编辑:
我希望解决两个基本问题
1)避免从文件中读取浮点数的总体缓慢
2)如何智能地确定每个边缘的“相邻”半边缘。我想象某种散列函数来确定正在创建的边的对称边或下边是否已经存在,如果是,则使用该指针。
答案 0 :(得分:2)
读取和解码ascii文件很慢,特别是如果文件有一百万个要转换的浮点数。
我的想法:用您想要的任何语言编写程序,将.obj文件转换为二进制格式,程序可以或多或少直接读入内存。然后在要加载的.obj文件上运行该程序,并让程序加载已翻译的文件。
对于额外的积分,您可以让您的opengl程序即时执行此转换并缓存结果,检查文件修改时间并根据需要更新缓存。
答案 1 :(得分:2)
我之前有一个类似的问题加载OBJ文件,虽然我正在搜索共享顶点而不是边缘。由于文件格式本身不包含连接信息,因此最好的方法是使用std::set
。每次要为数据结构添加边时,都可以搜索该集以查看它是否已存在。集搜索的复杂性是对数的,因此它可以很好地适应数据结构的大小。我能想到的唯一避免这种情况的方法是选择包含所需连接信息的文件格式,或者Michael Slade建议您创建自己的格式和转换工具。