我为android编写了一个简单的模型查看器,它解析.obj波前文件以创建一个3d模型。我正在导出一个简单的icosphere,它已经用来自这种格式的blender的uv地图进行了纹理化
v 0.000000 -1.000000 0.000000
v 0.723600 -0.447215 0.525720
v -0.276385 -0.447215 0.850640
.
.
.
v -0.723600 0.447215 -0.525720
v 0.276385 0.447215 -0.850640
v 0.894425 0.447215 0.000000
vt 0.238062 0.172144
vt 0.314133 0.212645
vt 0.264721 0.263452
.
.
.
vt 0.176955 0.098382
vt 0.327646 0.115775
vt 0.361262 0.040083
f 103/1 15/2 48/3
f 48/3 44/4 103/1
f 13/5 103/1 44/4
.
.
.
f 47/12 105/8 46/10
f 14/9 46/10 105/8
f 105/8 47/12 15/2
“v”表示顶点,“vt”表示纹理坐标,“f”表示面,正斜杠前面的值是对应顶点的索引,斜杠后面的值是对应的顶点纹理坐标。我的问题是我不知道如何将纹理坐标索引输入到opengl es中,所以我的当前模型看起来很奇怪,因为纹理坐标不匹配。
答案 0 :(得分:0)
OBJ将纹理中的原点定义在左上角。 OpenGL将它定义在左下角。您需要反转来自OBJ的y坐标。
编辑:为了回应我在下面对Christian Rau的部分持怀疑态度,对于OpenGL目的并将属性限制为实际使用的属性,顶点是位置和纹理坐标的组合。这是两件事。您可能认为它们在逻辑上是不同的,但OpenGL却没有。您可能会回答“哪个OBJ顶点位于传递给OpenGL的列表中的条目23处?”的问题。回答如“它是顶点46/10”。
通过任何Dictionary子类(例如,Hashtable)加载时实现的一种方法。当遇到需要使用顶点46/10时,您需要创建一个合适的复合键,并检查Hashtable是否有映射到OpenGL数组索引位置。如果找不到,则分配下一个可用的索引位置并在字典中存储记录。
以下是您的问题:
f 103/1 15/2 48/3
f 48/3 44/4 103/1
f 13/5 103/1 44/4
.
.
.
f 47/12 105/8 46/10
f 14/9 46/10 105/8
f 105/8 47/12 15/2
产生十个顶点,即顶点103 / 1,13 / 5,48 / 3,44 / 4,15 / 2,47 / 12,105 / 8,46 / 10,14 / 9和46 / 10。