遵循本教程的说明 https://www.youtube.com/watch?v=yc0b5GcYl3U (如何在搅拌机中展开UV球体)我成功地在搅拌机程序中生成纹理球体。
现在我想在我的openGL C ++程序中使用它。为此我遵循教程http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Load_OBJexported以将球体保存为.obj文件(使用所述教程中所述的三角测量导出选项),并愉快地找到了很多' v', ' vt'和' f'结果中的行。
然而,解析文件我找到了642个顶点(v),561'纹理顶点' (vt)预期结构的[和1216个元素行(f)&f; / b / bt c / ct']。
令我感到困惑的是:我对openGL的天真理解告诉我,纹理对象上的每个点都有一个空间位置(顶点)和纹理上的一个位置(UV点)。因此我真的希望vs和vts的数量匹配。但他们没有:642!= 561。怎么会这样?
答案 0 :(得分:3)
因为OBJ和OpenGL使用" vertex"的不同定义,并以不同方式处理索引。
在下面的解释中,我将调用顶点的坐标,它们是OBJ格式的v
记录中的值,"位置"。
OBJ顶点/索引模型的主要特征是它对不同的顶点属性(位置,法线,纹理坐标)使用单独的索引。
这意味着您可以拥有不同大小的位置和纹理坐标的独立列表。该文件只需要列出一次唯一的位置,每个唯一的纹理坐标对一次。
然后通过指定 3 索引来定义顶点:位置,纹理坐标和法线各一个。
另一方面,OpenGL使用一组索引,它们引用完整的顶点。
顶点由其位置,纹理坐标和法线定义。因此,位置,纹理坐标和法线的每个唯一组合都需要一个顶点。
当您读取用于OpenGL渲染的OBJ文件时,您需要为位置,纹理坐标和法线的每个唯一组合创建顶点。由于它们是由f
记录中的索引引用的,因此您需要为在f
条记录中找到的每个唯一索引三元组创建一个OpenGL顶点。对于每个顶点,使用从OBJ文件中读取的给定索引处的位置,纹理坐标和法线。
我在这里的旧答案包含用于说明此过程的伪代码:OpenGL - Index buffers difficulties。
答案 1 :(得分:2)
wavefront obj 文件通过向纹理坐标(vt),顶点(v)和法线(vn)提供索引来构建面(f)。如果多个人脸共享数据,他们只使用相同的索引,而不是复制vt,v或vn数据。