首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.obj解析Wavefront C++文件

使用.obj解析Wavefront C++文件
EN

Stack Overflow用户
提问于 2011-10-17 15:28:01
回答 5查看 11.9K关注 0票数 7

在尝试解析wavefront .obj文件时,我想到了两种方法:

  1. 创建一个与顶点数目大小相同的2D数组。当人脸使用顶点时,从数组中获取它的坐标。
  2. 获取顶点列表的起始位置,然后当人脸使用顶点时,扫描这些线直到到达顶点为止。

海事组织,选项1将是非常内存密集型,但要快得多。因为选项2涉及到广泛的文件读取(而且大多数对象中的顶点数量变得非常大),这会慢得多,但内存密集型要小得多。

问题是:比较内存和速度之间的权衡,哪种选择更适合于普通计算机?还有另一种方法吗?

我计划使用OpenGL和GLFW来呈现对象。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-17 15:57:11

海事组织,选项1将是非常内存密集型,但要快得多。

无论如何,你必须把这些顶点记在记忆里。但是没有必要使用2D数组,BTW会导致两个指针的不方向,因此性能受到很大的影响。只需为您的数据使用一个简单的std::vector<Vertex>,矢量索引就是所附人脸列表的索引。

由于注释而进行编辑

代码语言:javascript
复制
class Vertex
{
    union { struct { float x, y, z }; float pos[3] };
    union { struct { float nx, ny, nz }; float normal[3] };
    union { struct { float s, t }; float pos[2] };
    Vertex &operator=();
}

std::vector<Vertex>;
票数 6
EN

Stack Overflow用户

发布于 2011-10-17 15:41:21

通常,您会将顶点列表读入数组。解析ASCII文本非常慢;加载文件时只解析一次,然后将所有内容存储在内存中。

三角形/面孔也是如此。每个三角形通常由三个顶点索引组成。也应该存储在数组中。

您可能会发现VTK开源库中的OBJ阅读器是有用的:http://www.vtk.org/doc/nightly/html/classvtkOBJReader.html。我们用它而没有理由写我们自己的..。直接使用VTK,否则您可能会发现学习源代码有助于进一步启发您自己的读者。

在我看来,OBJ文件的主要缺点之一是ASCII的使用。3D ASCII文件(无论是STL、PLY、OBJ等)由于字符串解析,如果它们是ASCII,则加载非常慢。二进制格式文件的速度要快得多,如果性能有问题,应该始终使用:良好二进制格式的加载时间是瞬时的。

票数 4
EN

Stack Overflow用户

发布于 2011-10-17 16:42:56

只是将它们加载到数组中。记忆不应该是一个问题。你的系统(通常)比你的GPU有更多的内存。如果您遇到内存问题,您可能正在加载一个过于详细的模型。(我半假设你要在OpenGL上做游戏。)如果您对这样大的模型文件有特定的需求,您仍然需要想出一种方法来加载适当的块。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7795995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档