来自OBJ文件的纹理坐标,用于Android

时间:2011-03-08 17:11:52

标签: opengl-es

我有一个带有纹理的立方体的OBJ文件:

# Max2Obj Version 4.0 Mar 10th, 2001
#
mtllib cube2.mtl
g
# object Cube_1 to come ...
#
v  -5.500000 0.000000 -1.000000
v  -5.500000 0.000000 1.000000
v  -7.500000 0.000000 1.000000
v  -7.500000 0.000000 -1.000000
v  -5.500000 2.000000 -1.000000
v  -5.500000 2.000000 1.000001
v  -7.500000 2.000000 1.000000
v  -7.500000 2.000000 -1.000000
v  -5.500000 0.000000 -1.000000
v  -5.500000 2.000000 -1.000000
v  -5.500000 2.000000 1.000001
v  -5.500000 0.000000 -1.000000
v  -5.500000 2.000000 1.000001
v  -5.500000 0.000000 1.000000
v  -5.500000 0.000000 1.000000
v  -5.500000 2.000000 1.000001
v  -7.500000 2.000000 1.000000
v  -5.500000 0.000000 1.000000
v  -7.500000 2.000000 1.000000
v  -7.500000 0.000000 1.000000
v  -7.500000 0.000000 1.000000
v  -7.500000 2.000000 1.000000
v  -7.500000 2.000000 -1.000000
v  -7.500000 0.000000 1.000000
v  -7.500000 2.000000 -1.000000
v  -7.500000 0.000000 -1.000000
v  -5.500000 2.000000 -1.000000
v  -5.500000 0.000000 -1.000000
v  -7.500000 0.000000 -1.000000
v  -5.500000 2.000000 -1.000000
v  -7.500000 0.000000 -1.000000
v  -7.500000 2.000000 -1.000000
# 32 vertices

vt  0.000500 0.999500 0.000500
vt  0.000500 0.000500 0.000500
vt  0.999501 0.000500 0.000500
vt  0.999501 0.999500 0.000500
vt  0.999500 0.999500 0.999501
vt  0.999500 0.000500 0.999501
vt  0.000499 0.000500 0.999501
vt  0.000499 0.999500 0.999501
vt  0.999500 0.000500 0.999500
vt  0.999500 0.999501 0.999500
vt  0.000500 0.999501 0.999500
vt  0.999500 0.000500 0.999500
vt  0.000500 0.999501 0.999500
vt  0.000500 0.000500 0.999500
vt  0.999500 0.000500 0.000500
vt  0.999500 0.999501 0.000500
vt  0.000499 0.999501 0.000500
vt  0.999500 0.000500 0.000500
vt  0.000499 0.999501 0.000500
vt  0.000499 0.000500 0.000500
vt  0.999500 0.000500 0.000499
vt  0.999500 0.999501 0.000499
vt  0.000500 0.999501 0.000499
vt  0.999500 0.000500 0.000499
vt  0.000500 0.999501 0.000499
vt  0.000500 0.000500 0.000499
vt  0.000500 0.999501 0.999500
vt  0.000500 0.000500 0.999500
vt  0.999501 0.000500 0.999500
vt  0.000500 0.999501 0.999500
vt  0.999501 0.000500 0.999500
vt  0.999501 0.999501 0.999500
vt  0.000500 0.999500 0.000500
vt  0.999501 0.000500 0.000500
vt  0.999500 0.999500 0.999501
vt  0.000499 0.000500 0.999501
# 36 texture vertices

vn  0.000000 -1.000000 -0.000000
vn  0.000000 -1.000000 -0.000000
vn  0.000000 -1.000000 -0.000000
vn  0.000000 -1.000000 -0.000000
vn  0.000000 1.000000 -0.000000
vn  0.000000 1.000000 -0.000000
vn  0.000000 1.000000 -0.000000
vn  0.000000 1.000000 -0.000000
vn  1.000000 0.000000 -0.000000
vn  1.000000 0.000000 -0.000000
vn  1.000000 0.000000 -0.000000
vn  1.000000 0.000000 -0.000000
vn  1.000000 0.000000 -0.000000
vn  1.000000 0.000000 -0.000000
vn  -0.000000 -0.000000 1.000000
vn  -0.000000 -0.000000 1.000000
vn  -0.000000 -0.000000 1.000000
vn  0.000000 0.000000 1.000000
vn  0.000000 0.000000 1.000000
vn  0.000000 0.000000 1.000000
vn  -1.000000 0.000000 -0.000000
vn  -1.000000 0.000000 -0.000000
vn  -1.000000 0.000000 -0.000000
vn  -1.000000 0.000000 -0.000000
vn  -1.000000 0.000000 -0.000000
vn  -1.000000 0.000000 -0.000000
vn  0.000000 0.000000 -1.000000
vn  0.000000 0.000000 -1.000000
vn  0.000000 0.000000 -1.000000
vn  0.000000 0.000000 -1.000000
vn  0.000000 0.000000 -1.000000
vn  0.000000 0.000000 -1.000000
# 32 vertex normals

g Cube_1
usemtl 01_-_Default_1
s 0
f 1/33/1 2/2/2 3/34/3
f 1/1/1 3/3/3 4/4/4
f 5/35/5 8/8/8 7/36/7
f 5/5/5 7/7/7 6/6/6
f 9/9/9 10/10/10 11/11/11
f 12/12/12 13/13/13 14/14/14
f 15/15/15 16/16/16 17/17/17
f 18/18/18 19/19/19 20/20/20
f 21/21/21 22/22/22 23/23/23
f 24/24/24 25/25/25 26/26/26
f 27/27/27 28/28/28 29/29/29
f 30/30/30 31/31/31 32/32/32
# 12 faces

g

正如您所见,vt每行有3个条目。这是不是3d纹理而不是2d? Android仅支持2d纹理。那么这意味着上面的OBJ文件在Android中不起作用吗? 我可以解析OBJ并得到浮点数[] textcoordinates = [0.000500,0.999500,0.000500,0.000500,0.000500,0.000500,.....]这些是需要输入OpenGL-ES的正确的前2个tex坐标吗?或者我是否需要根据OBJ文件中的f数来计算纹理坐标,其中AFAIK是索引到纹理坐标以计算正确的tex坐标。所以我不确定哪种方式正确。有OpenGL-ES和OBJ文件格式经验的人可以清除这一切。

1 个答案:

答案 0 :(得分:1)

这个模型实际上是使用3d纹理。 obj文件格式的详细信息在http://paulbourke.net/dataformats/obj/中描述,这是关于纹理坐标的部分:

  

vt u v w

     

多边形和自由形状几何体的顶点语句。

     

指定纹理顶点及其坐标。一维纹理   只需要u纹理坐标,2D纹理需要u   和v纹理坐标,3D纹理需要全部三个   坐标。

来自obj文件的顶点数据无法直接传递给opengl。您必须设置数组,以便每个数组中的相应索引属于同一个顶点。例如,模型中第一个面的第一个顶点(1/33/1)由

组成
  • 第一个“v”行的顶点坐标。
  • 33.“vt”行的纹理坐标。
  • 来自第一个“vn”行的法线向量。

为opengl设置这个的最简单方法是迭代所有面,获取顶点,纹理和法线的值,并将它们附加到新数组。