Comment configurer / calculate texturebuffer dans glTexCoordPointer lors de l'importation de fichiers OBJ-

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

  •  26-09-2019
  •  | 
  •  

Question

Je l'analyse d'un fichier OBJ dans Android et mon but est de rendre et afficher l'objet. Tout fonctionne bien, sauf le mappage de texture correcte (importer la ressource / image en opengl etc fonctionne très bien).

Je ne sais pas comment remplir la texture des données relatives à partir du obj-fichier dans un texturebuffer objet.

Dans le fichier OBJ-I AVONS lignes vt-:

vt 0.495011 0.389417 
vt 0.500686 0.561346

et en face-lignes:

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

Mon apparence de tirage de routine comme (uniquement les parties pertinentes):

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

Sortie des chefs d'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

Tout conseil est le bienvenu.

Était-ce utile?

La solution

Désolé, pas sûr à quel point cela est condescendant, mais à partir du haut:

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

désigne un triangle entre le sommet de la position 127e données dans le fichier, la position de la texture de la 73ème dans le fichier et le 62ème normal et les deux autres sommets spécifié d'une manière similaire.

OpenGL que vous spécifiez un seul index par sommet (comme tout passe par la transformation en une seule unité), de sorte que vous devez trouver toutes les différentes combinaisons de positions, coordonnées de texture et normale et organiser les tampons vous passer à glVertexPointer, glNormalPointer et glTexCoordPointer en conséquence. Par exemple, le visage ci-dessus pourrait finir par être spécifié par GL_TRIANGLES entre sommets 0, 1 et 2, où vous aviez copié la position 127e au premier dans votre vertex buffer interne, vous aviez copié la 73e coordonnée de texture à la première dans votre texture interne coordonnez tampon et que vous copié le 62e normale à la première dans la liste normale interne.

Très probablement vous voulez un HashMap prenant le sommet touche de combinaison / coordonnée de texture / normale et la cartographie à une position dans vos tableaux internes. Comme vous tombez sur chaque face dans le OBJ entrant, vous pouvez vérifier si vous avez déjà cette combinaison allouée à un endroit dans vos tampons internes et lui donner le prochain disponible sinon.

vt est une coord de texture, de sorte que par exemple, la coordonnée de texture:

vt 0.495011 0.389417

Signifie que, dans l'espace de texture, x = 0.495011, y = 0,389417. De mémoire, le format de fichier OBJ et OpenGL ont les axes y dans des directions opposées. Donc, en termes OpenGL que vous voudriez s = 0,495011, t = 1 -. 0,389417 = 0,610583

Si votre objet est à l'aide d'un atlas de texture appropriée compliquée ou écorcher, j'imagine que ce serait loin d'être évident que les coordonnées y sont retournées; si vous avez juste quelque chose comme un cube avec la même texture répétée dans son intégralité sur chaque face, alors vous auriez probablement voir juste comme étant renversé le long de la verticale.

Est-ce que couvre la source de confusion?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top