Come installare / texturebuffer calcolare in glTexCoordPointer durante l'importazione da OBJ file

StackOverflow https://stackoverflow.com/questions/4233152

  •  26-09-2019
  •  | 
  •  

Domanda

Sto parsing di un OBJ-file in Android e il mio obiettivo è quello di rendere e visualizzare l'oggetto. Tutto funziona bene, tranne la mappatura corretta consistenza (importare la risorsa / immagine in opengl ecc funziona bene).

Non so come popolare i dati relativi alla struttura del obj-file in un texturebuffer-oggetto.

Nel OBJ-file che ho VT-linee:

vt 0.495011 0.389417 
vt 0.500686 0.561346

e faccia linee:

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

I miei draw-routine di assomiglia (solo le parti rilevanti):

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

Output dei conti della OBJ-file:

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

Qualsiasi consiglio è benvenuto.

È stato utile?

Soluzione

Siamo spiacenti, non è sicuro fino a che punto questo è paternalistico, ma dall'alto:

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

Mezzi un triangolo tra il vertice con la posizione 127a data nel file, la posizione 73a texture nel file e il 62 ° normale e gli altri due vertici specificati in modo simile.

In OpenGL si specifica solo un singolo indice per vertice (come il tutto passa attraverso la trasformazione come una singola unità), quindi è necessario capire tutte le diverse combinazioni di posizione, consistenza coordinare e normale e organizzare i buffer si passare glVertexPointer, glNormalPointer e glTexCoordPointer conseguenza. Ad esempio, la faccia sopra potrebbe finire per essere specificato tramite GL_TRIANGLES tra vertici 0, 1 e 2, dove occorre copiati la posizione 127a al primo nel buffer vertice interno, avevi copiato il 73a trama coordinata alla prima nella vostra struttura interna coordinare tampone e che avevi copiato il 62 ° normale al primo nella lista normale interna.

Molto probabilmente si desidera un HashMap prendendo la combinazione di tasti vertex / texture coordinare / normale e la mappatura per una posizione nelle matrici interne. Come ci si imbatte ogni faccia in OBJ arrivo, è possibile verificare se hai già quella combinazione assegnata ad un punto nel vostro buffer interni e dargli quello successivo disponibile se non.

vt è un coord consistenza, così ad esempio coordinata della texture:

vt 0.495011 0.389417

Mezzi che, all'interno spazio struttura, x = 0.495011, y = 0,389,417 mila. Dalla memoria, il formato di file OBJ e OpenGL hanno gli assi y in direzioni opposte. Quindi, in termini di OpenGL che ci si vuole s = 0,495,011 mila, t = 1 -. 0,389,417 mila = 0,610,583 mila

Se l'oggetto è utilizzando un adeguatamente complicate atlante texture o scuoiatura, immagino che sarebbe stato tutt'altro che ovvio che le coordinate y sono capovolte; se avete appena qualcosa di simile a un cubo con la stessa texture ripetuta nella sua interezza su ogni faccia, allora si sarebbe probabilmente basta vedere come viene capovolto lungo la verticale.

fa che coprono la fonte di confusione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top