2012-03-24 209 views
0

我已经写了一个简单的android模型查看器,解析一个.obj波前文件来创建一个3d模型。我导出一个简单的icosphere已纹理用UV贴图从搅拌机自带这种格式opengl es 2.0纹理坐标

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中,所以我的当前模型看起来很奇怪,因为纹理坐标不匹配。

enter image description here

回答

0

OBJ限定的纹理内的原点是在左上方。 OpenGL将其定义在左下角。您需要反转从OBJ进入的y坐标。

编辑:为了回应我对Christian Rau的下面部分的怀疑,对于OpenGL的目的,并将属性限制为只是实际使用的属性,顶点是位置和纹理坐标的组合。这是两件事情在一起。你可能认为它们逻辑上不同,但OpenGL不是。你可能会回答这个问题:“哪个OBJ顶点在传递给OpenGL的列表中的条目23?”与“这是顶点46/10”的答案。

通过任何字典子类(例如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 

产生十个顶点,它们是顶点1分之103,13/5,48/3,44/4,15/2,47/12号,第105/8号,第46/10号,第14/9号和第46/10号决议。

+0

所以你的意思是在他的问题中的图像显示正确的纹理只是垂直翻转? – 2012-03-24 19:10:42

+0

我很乐观,情况就是如此。每个问题的纹理坐标已经自动解开,所以没有理由认为它看起来应该是倒过来。我会添加一个关于OpenGL顶点的讨论,因为你显然对此持怀疑态度,我已经看到你在其他问题上给出了很好的答案。 – Tommy 2012-03-24 19:42:00