我解析Android中的OBJ-文件和我的目标是使显示与该对象。一切正常,除了正确的纹理映射(导入资源/图像转换成OpenGL等正常工作)。

我不知道如何从OBJ-文件到texturebuffer对象填充纹理有关的数据。

在OBJ-文件[我已VT-行:

vt 0.495011 0.389417 
vt 0.500686 0.561346

和面线:

f 127/73/62 98/72/62 125/75/62

我的拉伸程序的样子(仅相关部分):

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glNormalPointer(GL10.GL_FLOAT, 0, normalsBuffer);

gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, t.getvtBuffer());

gl.glDrawElements(GL10.GL_TRIANGLES, t.getFacesCount(), GL10.GL_UNSIGNED_SHORT, t.getFaceBuffer());

的OBJ-文件的计数输出:

Vertex-count: 1023
Vns-count: 1752
Vts-count: 524
/////////////////////////
Part 0
Material name:default
Number of faces:2037
Number of vnPointers:2037
Number of vtPointers:2037

任何建议是受欢迎的。

有帮助吗?

解决方案

对不起,不知道到什么程度,这是光顾,而是从顶部:

f 127/73/62 98/72/62 125/75/62

平均值与该文件中给定的第127位置处的顶点之间的三角形,以类似的方式指定的文件在第73位置的纹理和第62正常和其它两个顶点。

在OpenGL的只指定每个顶点的单个指数(作为整个事情经过变换为单个单元),所以你需要找出所有的位置的不同组合,纹理坐标和正常和安排缓冲器你传递给glVertexPointer,因此glNormalPointerglTexCoordPointer。例如,通过GL_TRIANGLES被指定为顶点0,1和2,其中你复制在内部顶点缓冲器中的第127位置到第一之间的上述脸可能最终,你会复制第73纹理坐标到所述第一在内部纹理坐标缓冲区和你想复制的第62垂直于先在内部正常的名单。

很可能是你想要一个HashMap采取组合键顶点/纹理坐标/正常映射到内部阵列的位置。当您遇到的到来OBJ每个面,您可以检查您是否已经有了该组合在内部缓冲区分配到一个点,如果不给它下一个可用的一个。

VT是纹理坐标,所以例如纹理坐标:

vt 0.495011 0.389417

意味着,纹理空间内,X = 0.495011,Y = 0.389417。从存储器,OBJ文件格式和OpenGL具有在相反方向上y轴。因此,在OpenGL方面你会希望S = 0.495011,T = 1 - 0.389417 = 0.610583

如果您的目的是使用适当复杂纹理地图或剥皮,我想这将是远离显而易见的是,y坐标被翻转;如果你只需要像使用相同的纹理在其上的每个面全部重复立方体,那么你很可能只是把它当沿竖向被翻转。

这是否覆盖混乱的源?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top