Pergunta

Estou analisando um arquivo Obj no Android e meu objetivo é renderizar e exibir o objeto. Tudo funciona bem, exceto o mapeamento de textura correto (importando o recurso/imagem para o OpenGL etc funciona bem).

Não sei como preencher os dados relacionados à textura do arquivo Obj em um objeto texturebuffer.

No arquivo OBJ, eu tenho linhas de TV:

vt 0.495011 0.389417 
vt 0.500686 0.561346

e linhas de rosto:

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

My Draw-Routine parece (apenas peças relevantes):

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());

Saída das contagens do arquivo 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

Qualquer conselho é bem -vindo.

Foi útil?

Solução

Desculpe, não tenho certeza até que ponto isso é condescendente, mas do topo:

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

Significa um triângulo entre o vértice com a 127ª posição apresentada no arquivo, a 73ª posição de textura no arquivo e o 62º normal e os outros dois vértices especificados de maneira semelhante.

No OpenGL, você especifica apenas um único índice por vértice (à medida que a coisa toda passa pela transformação como uma única unidade), então você precisa descobrir todas as diferentes combinações de posição, coordenada de textura e normal e organizar os buffers para os quais você passa glVertexPointer, glNormalPointer e glTexCoordPointer adequadamente. Por exemplo, a face acima pode acabar sendo especificada via gl_triangles entre os vértices 0, 1 e 2, onde você copiou a 127ª posição para a primeira em seu buffer de vértice interno, você copiou a 73ª coordenada de textura ao primeiro em seu buffer de coordenada de textura interna e você copiou o 62º normal para o primeiro da sua lista normal interna.

Provavelmente, você deseja um hashmap que pegue a combinação de coordenadas/normais de vértice/textura da tecla e mapeamento para uma posição em suas matrizes internas. À medida que você se depara com cada rosto no OBJ de entrada, você pode verificar se já obteve essa combinação alocada a um ponto em seus buffers internos e fornecer o próximo disponível, se não.

VT é um coordenado de textura, por exemplo, a coordenada de textura:

vt 0.495011 0.389417

Significa que, dentro do espaço de textura, x = 0,495011, y = 0,389417. Da memória, o formato do arquivo OBJ e o OpenGL têm os eixos y em direções opostas. Portanto, em termos do OpenGL, você deseja s = 0,495011, t = 1 - 0,389417 = 0,610583.

Se o seu objeto estiver usando um atlas de textura ou pele adequadamente complicada, imagino que estaria longe de ser óbvio que as coordenadas Y são invertidas; Se você apenas tem algo como um cubo com a mesma textura repetida em sua totalidade em cada face, provavelmente a veria como sendo invertida ao longo da vertical.

Isso cobre a fonte de confusão?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top