Salut,
J'ai posé la questiion sur mon précédent post, mais, je suppose qu'elle soit passée inaperçus !
Donc, voila, j'ai un triangle appartenant à un mesh particulier, je cherche à savoir de quel meshBuffer celui-ci fait partie?
Merci.
Hors ligne
Hum bonne question, pas évident ton truc. C'est pour quel type d'objet que tu veux faire ça exactement ?
Hors ligne
C'est pour savoir à quel meshBuffer appartien un triangle pické ^^
Hors ligne
Salut F-fisher,
Pour ma part, j'ai aussi cherché ce type d'information mais en vain. Du coup, j'ai opté pour une comparaison pure et simple du triangle "pické" avec chaque triangle de chaque meshBuffer. Lorsque les sommets correspondent (prendre en compte de l'ordre), je considère que le triangle identifié est mon triangle "pické". C'est bourrin mais ça fonctionne. J'étais pris par le temps et il fallait que je trouve une solution alors....
Petit détail, pour comparer deux sommets, il faut tenir compte d'une erreur de précision +/-delta sans laquelle deux sommets pourtant identiques seront considérés différents.
Voilà.
@+
Hors ligne
Merci pour la reponse,
Mais, comment obtenir les triangles du meshBuffer ??
Merci.
edit:
je me suis trompé de question ^^
comment obtenir les sommets du meshBuffer ??
voila,
merci
Dernière modification par F-fisher (05-05-2008 19:16:21)
Hors ligne
Voici un bout de code que j'ai pondu pour récupérer le nombre total de triangles de mon mesh de type IMesh* :
if(!mesh)
return 0;
IMeshBuffer* mesh_buffer;
u32 nb_mesh_buffers = mesh->getMeshBufferCount();
u32 nb_triangles = 0;
// get the total number of mesh triangles
for(u32 buffer = 0 ; buffer < nb_mesh_buffers ; buffer++)
{
mesh_buffer = mesh->getMeshBuffer(buffer);
nb_triangles += mesh_buffer->getIndexCount();
}
nb_triangles /= 3;
Hors ligne
Par la même occasion, tu trouveras un code semblable dans un voire plusieurs des tutoriels IrrLicht. Je ne me souviens plus trop lesquels...
Hors ligne
Attends,
pour avoir les sommets, il faut d'abord mettre la main sur le pointeur vers le tableau de ces sommet, sauf que la méthode qui retourne ce pointeur que je traque depuis une semaine est du type void* !!! et la, je coince, comment utiliser un pointeur du type void* ?????
Merci encore une fois.
Hors ligne
Effectivement, elle est de type void pour la simple et bonne raison qu'il y a trois formats de sortie possibles :
EVT_STANDARD, EVT_2TCOORDS et EVT_TANGENTS. Du coup, lorsque tu charges un modèle, ton mesh sera d'un type ou d'un autre suivant les informations qui sont accessibles. Pour utiliser la fonction getMeshBuffer, tu dois donc savoir de quel type sont tes données et pour y parvenir, il te suffit d'utiliser la fonction getVertexType. A partir de là, tu pourras convertir les données de void* en un des trois types S3DVertex (pour le type EVT_STANDARD), S3DVertex2TCoords (pour le type EVT_2TCOORDS) et S3DVertexTangents (pour le type EVT_TANGENTS). Pour mieux illustrer mes propos, voici le bout de code dans lequel j'utilise cette fonction :
// build the tab of mesh triangles int cNode::buildMeshTriangles(IMesh* mesh) { // Since there is no obvious way to get the triangles // of a mesh with all their properties, we simply build // our own triangle tab in which all the parameters // of all the triangles of a mesh are stored. This triangle // tab is useful for collision detection, haptic texture // rendering and all sorts of manipulations where triangle // parameters are needed. if(!mesh) return 0; IMeshBuffer* mesh_buffer; u32 nb_mesh_buffers = mesh->getMeshBufferCount(); u32 nb_triangles = 0; // get the total number of mesh triangles for(u32 buffer = 0 ; buffer < nb_mesh_buffers ; buffer++) { mesh_buffer = mesh->getMeshBuffer(buffer); nb_triangles += mesh_buffer->getIndexCount(); } nb_triangles /= 3; // build and fill the tab of triangles // getVertices return the vertices of the mesh // getIndices return the indices of the mesh // To build all the mesh triangles, we must first gather // the mesh vertices by groups of three (given by the // tab of indices). meshVertexType = mesh->getMeshBuffer(0)->getVertexType(); switch(meshVertexType) { // for S3DVertex data case EVT_STANDARD : { // build the tab of triangles with S3DVertex summits c3DVertexTriangle * triangles = new c3DVertexTriangle [nb_triangles]; u32 count; u32 nb_indices; u16 * indices; S3DVertex * pointer; S3DVertex s1, s2, s3; int i1, i2, i3; if(!triangles) return 0; u16 tri = 0; count = 0; // for each mesh buffer for(u32 buffer = 0 ; buffer < nb_mesh_buffers ; buffer++) { mesh_buffer = mesh->getMeshBuffer(buffer); nb_indices = mesh_buffer->getIndexCount(); indices = mesh_buffer->getIndices(); pointer = (S3DVertex *)(mesh_buffer->getVertices()); //for each group of three indices for(u32 index = 0 ; index < nb_indices ; index += 3) { i1 = indices[index + 0]; s1 = pointer[i1]; i2 = indices[index + 1]; s2 = pointer[i2]; i3 = indices[index + 2]; s3 = pointer[i3]; triangles[tri++] = c3DVertexTriangle(count, s1, s2, s3); count++; } } // return the pointer to the mesh triangles nbMeshTriangles = nb_triangles; meshTriangles = (c3DVertexTriangle *) triangles; } break; // for S3DVertex2TCoords data case EVT_2TCOORDS : { // TODO: adapt the previous technique } break; // for S3DVertexTangents data case EVT_TANGENTS : { // TODO: adapt the previous technique } break; } printf("Succeeded in building tab of mesh triangles : %d triangles\n", (int)nb_triangles); return 1; }
Voilà voilà...
Hors ligne
Voila, c'est exactement ce que je voulais
Puisque t'as été assez sympa en me filant le code, je ferais de même en te disant exactement ce que je veux faire
Je vais piquer le triangle se trouvant sous les persos (principal ou ennemi) et en suite, aller chercher à quel meshBuffer il appartient, pour ensuite, récupérer le nom de la texture mappée sur ce triangle, et ensuite, dépendant de la texture (vu que l'on récupère le nom du fichier) on peut savoir ce qui se trouve sous les pieds des persos (terre, eau, béton ...) et par conséquent, jouer le son de pas adéquat , on peut même utiliser cette téchnique pour paufiner l'IA, ainsi, les ennemis ne marcheront plus sur n'importe quoi
Et pour aller encore plus loin, on peut même savoir ce qui se trouve en face, derrière et sur les coté de n'importe quel perso, il suffit de piquer les triangle se trouvant en face, et derrière eux (ainsi que sur les côtés) et comme sa, on peut savoir s'ils foncent droit dans un mur, (on peut même coder un truc qui ressemble à la combinaison de snake dans mgs 4, en piquant la texture se trouvant devant ou derrière lui )
Voila, une petite astuce très sympa pour tous ceux qui liront ce poste
Encore merci.
Ok, merci beaucoup pour le coup d'main
Hors ligne
Ravi de t'avoir rendu service ;-)
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 51 invités en ligne Aucun membre connecté RSS Feed |