2010-11-20 22 views
4

Je suis l'analyse d'un fichier OBJ dans Android et mon but est de rendre & afficher l'objet. Tout fonctionne bien sauf le mappage de texture correct (l'importation de la ressource/image dans opengl fonctionne correctement).Comment configurer/calculer texturebuffer dans glTexCoordPointer lors de l'importation à partir du fichier OBJ

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

Dans le OBJ fichier que j'ai vt lignes:

vt 0.495011 0.389417 
vt 0.500686 0.561346 

et visage lignes:

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

Mes regards 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 comptes du fichier 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 

Tout conseil est le bienvenu.

Répondre

3

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

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

signifie un triangle entre le sommet avec la position 127e donnée dans le fichier, la position de texture 73e dans le fichier et la 62e normale et les deux autres sommets spécifiés de la même manière. En OpenGL, vous ne spécifiez qu'un seul index par sommet (comme le tout traverse la transformation comme une seule unité), vous devez donc comprendre toutes les différentes combinaisons de position, de coordonnée de texture et de normal et disposer les tampons vous passez à glVertexPointer, glNormalPointer et glTexCoordPointer en conséquence. Par exemple, la face ci-dessus peut être spécifiée via GL_TRIANGLES entre les sommets 0, 1 et 2, où vous avez copié la 127ème position sur la première dans votre vertex interne, vous avez copié la 73ème texture sur la première dans votre tampon de coordonnées de texture interne et vous avez copié la 62e normale à la première de votre liste normale interne. Il est très probable que vous vouliez un HashMap prenant la combinaison vertex/texture coordonnée/normal et le mappage à une position dans vos tableaux internes. Lorsque vous rencontrez chaque face dans l'OBJ entrant, vous pouvez vérifier si vous avez déjà alloué cette combinaison à un emplacement dans vos tampons internes et lui donner le prochain disponible sinon.

vt est une coordonnée de texture, par ex. 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, vous voudriez que s = 0.495011, t = 1 - 0.389417 = 0.610583.

Si votre objet utilise un atlas de texture ou un skinning compliqué, j'imagine qu'il serait loin d'être évident que les coordonnées y soient inversées; si vous avez juste quelque chose comme un cube avec la même texture répété dans son intégralité sur chaque face, alors vous le verrez probablement comme étant retourné le long de la verticale.

Est-ce que cela couvre la source de la confusion?

+0

Salut Tommy, merci pour les explications/conseils. Cependant je ne suis pas éclairé à 100%. Je ne sais toujours pas comment construire la hashmap (ou list, vector ..) à partir des différentes combinaisons de v, vn et vt? Y a-t-il des contraintes que vous devez suivre (cela pourrait m'aider à comprendre le contexte)? Par exemple: Est-ce que la taille/nombre de vertex-, normal- et texture-Hashmap doit toujours être le même? –

+0

Je ne peux pas vraiment faire des spécificités Android, juste des concepts. Un HashMap mappe une clé à une valeur. Vous pouvez donc avoir la chaîne '127/73/62' comme clé et la position du tableau dans la mémoire comme valeur. Cherchez 127/73/62 et si elle renvoie un nombre, mettez-le partout où vous mettez des choses à passer à glDrawElements. Si ce n'est pas le cas, prenez le prochain slot dans votre tableau de mémoire pour vertex/texcoord/normal et écrivez le combo là. Placez ensuite le numéro d'emplacement dans la HashMap comme valeur pour cette clé et utilisez-le dans ce que vous construisez pour glDrawElements. – Tommy

+0

Salut Tommy, finalement trouvé une solution. J'ai dû dupliquer les sommets en fonction du nombre de normales dans la liste obj-face (comme vous l'avez dit). Merci. Je vais marquer la question comme résolue –