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é :
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
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]);
Merci d'avance ! =)
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; }
Partager