gpt4 book ai didi

c++ - 解析 wavefront obj 文件格式

转载 作者:太空狗 更新时间:2023-10-29 23:18:16 28 4
gpt4 key购买 nike

我想将 obj 模型导入到我的 opengl 程序中。我有一个用于将属性数据传递到着色器的类/数据格式:

class CustomVertex : public IVtxFmt
{
public:
float m_Position[3]; // x, y, z offset 0, size = 3*sizeof(float)
float m_Normal[3]; // nx, ny, nz; offset 3
float m_TexCoords[2]; // u, v offset 6
float m_Colour[4]; // r, g, b, a offset 8
float m_Tangent[3]; // r, g, b offset 12
float m_Bitangent[3]; // r, g, b offset 15
};

所以我正在使用从 Internet 下载的小木屋模型。

小木屋有几个顶点、法线和纹理坐标定义,后面是面定义列表。

所以我的第一直觉是解析 obj 文件并以

vector<vertex>
vector<Normal>
vector<TexCoord>

转换成我的 CustomVertex 格式并不简单,因为文件中可能定义了 210 个顶点、100 个纹理坐标和 80 个法线。

在这种格式的约 390 张面孔列表之后:

f 83/42/1 67/46/1 210/42/1 

我在文件中遇到以下内容:

#
# object tile00
#

后面是更多的顶点定义。

因此,据此,我推断出一个模型可能由多个子对象组成,每个子对象由多个面定义;每个面由 3 个顶点/法线/纹理坐标值定义。

因此,为了获得 CustomVertex 的 vector ,我认为我需要执行以下操作:

创建和填充:

vector <vertex>
vector <normal>
vector <texcoord>

vector <indices>

我需要为面定义中的每个唯一 v/vn/vt 三元组创建一个 CustomVertex。

所以我想创建一个 map :

std::vector<CustomVertex> and
std::map< nHashId, CustomVertex_index >

所以我的想法是,对于我遇到的每个 v/vn/vt,我创建一个该字符串的散列,例如nHashId = hash("80/50/1")* 并在 map 中搜索哈希。如果不存在,我创建一个 CustomVertex 并将其添加到 vector 中,然后我将新创建的散列和 CustomVertex_index 添加到 map 中。

*: 通过创建 v/vn/vt 字符串的散列,我创建了一个对应于该字符串的唯一数值,我希望在 map 中搜索/比较它比等效文本。

如果我遇到与散列的匹配,我认为 customvertex 已经存在,而不是创建一个新的 CustomVertex,我只是将 CustomVertex_index 条目添加到索引 vector 并继续。

因为这似乎是一项计算量大的练习,我想我会将我的 CustomVertex 数组(和相应的索引数组)转储到磁盘以供以后检索,而不是每次都解析 obj 文件。

在我问我的问题之前,我可以指出,由于时间限制并且不想重新设计我的 Vbo 类(一项非常重要的任务),我坚持使用 CustomVertex 格式 - 我知道它有可能为我的着色器提供单独数组中的属性,但我读过像使用 CustomVertex 那样交织数据可以提高性能。

所以对于我的问题:1. 我的方法看起来合理还是疯狂?如果疯了,请指出我哪里错了。

  1. 您能发现任何潜在问题吗?

  2. 有没有人以前做过这件事并且可以推荐一种更简单的方法来实现我正在尝试的目标?

最佳答案

Can you spot any potential issues?

你的意思是除了哈希冲突之外?因为我没有看到处理该问题的算法部分。

Has anyone done this before and can recommend a simpler way to achieve what I'm trying to?

有一种更简单的方法:只比较索引而不使用散列。

关于c++ - 解析 wavefront obj 文件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149675/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com