#0 

05-05-2008 15:32:46

F-fisher
Membre
Date d'inscription: 25-10-2007
Messages: 30

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


#1 

05-05-2008 17:55:02

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Hum bonne question, pas évident ton truc. C'est pour quel type d'objet que tu veux faire ça exactement ? smile


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#2 

05-05-2008 18:37:44

F-fisher
Membre
Date d'inscription: 25-10-2007
Messages: 30

C'est pour savoir à quel meshBuffer appartien un triangle pické ^^

Hors ligne


#3 

05-05-2008 18:51:39

blm91
Membre
Date d'inscription: 08-01-2008
Messages: 16

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


#4 

05-05-2008 19:04:17

F-fisher
Membre
Date d'inscription: 25-10-2007
Messages: 30

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


#5 

05-05-2008 19:15:56

blm91
Membre
Date d'inscription: 08-01-2008
Messages: 16

Voici un bout de code que j'ai pondu pour récupérer le nombre total de triangles de mon mesh de type IMesh* :

Code:

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


#6 

05-05-2008 19:18:46

blm91
Membre
Date d'inscription: 08-01-2008
Messages: 16

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


#7 

05-05-2008 19:24:31

F-fisher
Membre
Date d'inscription: 25-10-2007
Messages: 30

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


#8 

05-05-2008 19:58:55

blm91
Membre
Date d'inscription: 08-01-2008
Messages: 16

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 :

Code:

// 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


#9 

05-05-2008 20:17:09

F-fisher
Membre
Date d'inscription: 25-10-2007
Messages: 30

Voila, c'est exactement ce que je voulais smile
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 smile
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 smile, on peut même utiliser cette téchnique pour paufiner l'IA, ainsi, les ennemis ne marcheront plus sur n'importe quoi smile
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, smile (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 smile )
Voila, une petite astuce très sympa pour tous ceux qui liront ce poste wink
Encore merci.
Ok, merci beaucoup pour le coup d'main smile

Hors ligne


#10 

05-05-2008 22:32:44

blm91
Membre
Date d'inscription: 08-01-2008
Messages: 16

Ravi de t'avoir rendu service ;-)

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
45 invités en ligne
Aucun membre connecté
RSS Feed