将wavefront obj网格转换为自定义网格表示

时间:2017-08-06 19:47:25

标签: graphics 3d mesh wavefront

我试图理解的代码表示使用此结构的网格:

struct vertex
{
    float v[3]; // vertex coords
    float t[3]; // texture coords
    float n[3]; // normals
};
typedef unsigned face[3];
struct mesh
{
    vector<vertex> vn;
    vector<face> fn;
};

然后,我为wavefront obj mesh format编写了一个快速解析器。这是我正在加载的sample mesh。它只有vvnvtf元素。此样本网格最重要的部分是它具有v / vt / vn匹配索引的所有面,我可以轻松地将其加载到上面指定的struct mesh中:

f 2/2/2 2/2/2 1/1/1
f 1/1/1 2/2/2 3/3/3
...

现在,我正在试图弄清楚如何加载没有这些v / vt / vn匹配的obj网格。据推测,第二个sample mesh应该代表与上面指定的形状相同的形状。正如你所看到的那样,面孔并不总是具有匹配的v / vt / vn三元组,如下所示:

f 3/3/3 1/1/1 2/2/2
f 2/2/2 1/1/1 6/12/6
...
f 3/15/3 10/13/10 9/14/9
...

如果三元组是唯一的(例如总是3/15/3),那就没问题了,但v = 3还有不同的三元组:3/3/3

如果我现在忽略/ vt / vn部分我仍然可以加载形状但是我松开法线/纹理坐标并且我没有得到形状的正确视觉表示(从形状中丢失纹理和光反射)。 我该怎么做才能将网格正确加载到我的内部表示中?我应该创建两个具有相同坐标的顶点,其中一个顶点将具有vn = 3,vt = 3而另一个顶点将具有vn = 15,vt = 3?..

(免责声明:我在3D图形和网格方面的经验大约是一天半)

0 个答案:

没有答案