Bonjour,
Je dois récupérer les sommets et faces d'un objet chargé avec irrlicht pour déterminer les sommets adjacents à un sommet donné et les faces adjacentes à une face donnée.
J'ai déjà réussi à récupérer les coordonnées des sommets de mon fichier en me basant sur l'algorithme a* donné par neo:
Avec la fonction d'affichage des coordonnées des sommets:
Je récupère donc les informations contenues dans les lignes de mon fichier de la forme suivante:
v 41.183029 839.117737 51.900291
Je souhaiterais faire la même chose pour parcourir et récupérer les faces. C'est à dire les lignes de la forme:
f 9316/9409 9226/9319 9306/9399 9175/9268
Je pense que pour récupérer le nombre de faces et le tableau des faces, il faut utiliser les méthodes
et
mais je ne sais pas comment les utiliser de manière a afficher les valeurs.
Quelqu'un aurait-il une idée d'implémentation pour récupérer les faces de la même manière que j'ai récupéré les sommets?
Hors ligne
Bon eh bien j'ai fini par trouver tout seul.
Il suffisait de faire ainsi:
Avec, pour récupérer les coordonnées d'un sommet:
Et pour récupérer le tableau des faces et celui des sommets:
Hors ligne
Bravo joli code qui aurait bien sa place dans la rubrique routines
Hors ligne
Bonsoir,
Je viens de me rendre compte d'un problème dans mon code.
Le nombre de sommets récupéré par getVertexCount() n'est pas le même que celui dans le fichier .obj.
Par exemple, pour un cube de 12 triangles (faces) et de 8 sommets (dans le .obj), ma fonction me récupère bien 12 faces, mais 15 sommets.
En effet, 7 des huit sommets apparaissent deux fois mais avec des indices différents.
Dans mon fichier par exemple, les sommets 1 et 9 ont les mêmes coordonnées (x=1; y=1; z=0).
Quelqu'un aurait-il une idée pour supprimer les doublons?
Est-ce que, comme pour obtenir le nombre de faces, il faut effectuer un calcul pour obtenir le nombre de sommets ou existe-il une autre fonction que getVertexCount()?
Toutes les idées sont les bienvenues, du moment qu'elles me permettent de résoudre mon problème.
Hors ligne
Tu pourrait stocker tout tes sommets dans un std::vector et utiliser un algorithme de suppression de doublon
Hors ligne
Merci de ta réponse!
Je vais tester ca et mettrai le code si ca marche!
Par contre, je ne sais pas si en supprimant les doublons, ca ne risque pas de poser problème au niveau des faces (sommets supprimés inconnus).
Dernière modification par shiratori (25-01-2010 13:42:46)
Hors ligne
Il faut faire attention au fait que des sommets apparaissant plusieurs fois n'est pas forcement un erreur :
Sur un cube par exemple, une texture est en générale appliquée sur chaque face du cube or si il y a que 8 sommets c'est pas possible a cause des coordonnées uv (qui sont unique pour chaque sommet ) donc on rajoute des sommets au meme endroit avec des coordonnées uv differentes ; et on construit les triangles de tel sorte que chaque qu'elle ressemble a ca:
(0,0)___________(1,0)
| |
| |
| |
| |
| |
|____________ |
(0,1) (1,1)
Hors ligne
Bonsoir,
Non, mon cube est un obj simple avec juste des sommets (vertex) et des faces.
Il n'y a pas de textures.
Et il faut que je récupère toutes mes faces et tous mes sommets sans avoir aucun doublon.
En fait, je dois créer des demie-arêtes à partir des faces et des sommets, donc je dois déjà bien récupérer mes faces et mes sommets pour m'en sortir.
Hors ligne
Comment on fait pour récupérer le nombre de face d'un meshBuffer ? (pour le donner comme premier argument de ta fonction)
EDIT : j'ai trouvé : getIndexCount()
Dernière modification par Ilovechocolat (26-01-2010 21:52:38)
Hors ligne
Exactement, pour récupérer le nombre de faces, il suffit de mettre cette ligne de code
int nbFaces = IMeshBuf->getIndexCount(); // Nombre de faces
Par exemple, pour un cube, ca te donnera 36 comme résultat, soient 12 triangles (on divise par 3) ou 6 quads (on divise par 6 car un rectangle c'est deux triangles).
Mais je ne vois pas où tu veux en venir?
Le nombre de faces je l'ai bien récupéré, c'est le nombre de sommets qui n'est pas bon.
Dernière modification par shiratori (26-01-2010 22:57:01)
Hors ligne