Bonjour,

J'utilise la lib irrlicht et j'ai quelques soucis pour gérer les collisions de mes meshs. J'ai regardé tous les tutos qu'il y a sur le net et je n'arrive toujours pas a voir les collisions (a croire que je suis vraiment nul ...). Ceci dit, j'y arrive très bien avec les boites et les spheres mais les modeles 3D ....

Je vous post le code que j'ai, qui compile mais qui n'offre pas le résultat escompté :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// On initialise le vecteur de positions
        m_position = position;
 
        // On définit la masse de l'objet
        m_masse = masse;
 
        //matrix4 matrice; // On créé une matrice
        float matrice[4][4];
 
        //On initialise la matrice, qu'on définit comme matrice identité
        for (int x = 0 ; x < 4 ; ++x)
            for (int y = 0 ; y < 4 ; y++)
            {
                if (x == y)
                    matrice [x][y] = 1.0f;
                else
                    matrice [x][y] = 0.0f;
            }
        //matrice.setTranslation(vector3df(0,0,0));
 
        // On définit la matrice de manière à ce que l'objet soit placé aux positions
        // spécifiées en utilisant la dernière colonne de la matrice
        matrice [3][0] = m_position.X;
        matrice [3][1] = m_position.Y;
        matrice [3][2] = m_position.Z;
 
        // On initialise la boîte de collision
        NewtonCollision *collision = NULL;
 
        // On créé la boite de collision aux dimensions de l'objet
        switch(m_Nmodele->getType())
        {
            case ESNT_MESH:
            {
                IMeshSceneNode *msn = (IMeshSceneNode*)m_Nmodele;
                if(msn != NULL)
                    collision = makeCollisionFromMesh(nWorld, msn->getMesh());
                else
                    cout << "msn == NULL" << endl;
                break;
            }
            case ESNT_ANIMATED_MESH:
            {
                IAnimatedMeshSceneNode *amsn = (IAnimatedMeshSceneNode*)m_Nmodele;
                if(amsn != NULL)
                    collision = makeCollisionFromMesh(nWorld, amsn->getMesh()->getMesh(0));
                else
                    cout << "amsn == NULL" << endl;
                break;
            }
            default:
            {
                cout << "TUMLE: passed node has no mesh\n" << endl;
            }
        }//switch node->getType
 
        if(collision == NULL)
            cout << "Collision vaut NULL" << endl;
 
        // On initialise le corps avec la boite de collision
        m_pBody = NewtonCreateBody (nWorld, collision);
 
        if (m_pBody == NULL)
            cout << "Impossible d'initialiser le corps." << endl;
 
        // On détruit la boite de collision, on n'en a plus besoin
        NewtonReleaseCollision (nWorld, collision);
 
        NewtonBodySetContinuousCollisionMode (m_pBody, 1);
 
        // Enfin, on affecte notre matrice (qui représente donc sa position dans l'espace)
        // à notre corps grâce à la fonction NewtonBodySetMatrix
        NewtonBodySetMatrix (m_pBody, &matrice [0][0]);
et la fonction makecollisionfrommesh :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! make a newton collision from an irrlicht mesh
NewtonCollision* makeCollisionFromMesh(NewtonWorld *nWorld, IMesh *irr_mesh )
{
int nMeshBuffer = 0; //Mesh Buffer count
IMeshBuffer *mesh_buffer = NULL;
float *vertices; //Array to store vertices
 
u32 nVertices = 0;
 
//Get number of vertices
for( nMeshBuffer=0 ; nMeshBuffer < irr_mesh->getMeshBufferCount() ; nMeshBuffer++ )
{
nVertices += irr_mesh->getMeshBuffer(nMeshBuffer)->getVertexCount();
}
 
 
//create buffer for vertices
vertices = new float[nVertices * 3];
u32 tmpCounter = 0;
 
//Get (irr_)mesh buffers and copy face vertices
for( nMeshBuffer=0 ; nMeshBuffer < irr_mesh->getMeshBufferCount() ; nMeshBuffer++ )
{
 
mesh_buffer = irr_mesh->getMeshBuffer(nMeshBuffer);
if(mesh_buffer == NULL)
    cout << "Error: mesh_buffer is empty" << endl;
 
//Get pointer to vertices and indices
S3DVertex *S3vertices = (S3DVertex*)mesh_buffer->getVertices();
if(S3vertices == NULL)
    cout << "Error: S3vertices is empty" << endl;
 
//copy vertices from mesh to buffer
for(int i=0; i<mesh_buffer->getVertexCount(); i++)
{
 
vertices[tmpCounter++] = S3vertices[i].Pos.X;
vertices[tmpCounter++] = S3vertices[i].Pos.Y;
vertices[tmpCounter++] = S3vertices[i].Pos.Z;
}
}
 
//Create Newton collision object
NewtonCollision *collision_obj = NewtonCreateConvexHull(nWorld,nVertices,vertices,sizeof(float)*3,NULL);
 
if(collision_obj == NULL)
    cout << "Error: collision_obj in function makeCollisionFromMesh is empty !" << endl;
 
//delete vertices
delete [] vertices;
 
return collision_obj;
}
Merci d'avance ! =)