我试图理解的代码表示使用此结构的网格:
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。它只有v
,vn
,vt
,f
元素。此样本网格最重要的部分是它具有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图形和网格方面的经验大约是一天半)