Bonjour,
J'éssaye depuis quelques jours déjà de réaliser un algo de collision entre deux mesh. J'utilise donc Newton et Irrlicht. J'ai d'abord commencer par faire celui entre les formes de bases (boite et cylindre) mais je désire maintenant m'attaquer aux meshs. Cependant mon code compile mais les collisions ne sont pas détectées entre mes meshs. J'utilise pour cela une classe dont voici les méthodes qui touche a la collision. (l'organisation du code et des méthodes n'est que très provisoires, j'éssaie d'abord de faire marcher la collision et je réorganise apres :p)
la méthode qui init la physique de mon mesh :
(je précise que le mesh ne doit pas être déplacer lors d'une collision, il est déplacé a l'aide des touches fléchées uniquement pour l'instant)
voilà la fonction qui créer une collision depuis un mesh :
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 switch(m_Nmodele->getType()) { case ESNT_MESH: { IMeshSceneNode *msn = (IMeshSceneNode*)m_Nmodele; m_collision = makeCollisionFromMesh(nWorld, msn->getMesh()); break; } case ESNT_ANIMATED_MESH: { IAnimatedMeshSceneNode *amsn = (IAnimatedMeshSceneNode*)m_Nmodele; m_collision = makeCollisionFromMesh(nWorld, amsn->getMesh()->getMesh(0)); break; } default: { printf("TUMLE: passed node has no mesh\n"); } }//switch node->getType /* //make a newton body NewtonBody *body = makeNewtonBody(collision, masse, m_Nmodele->getPosition(), m_Nmodele->getRotation(), m_Nmodele->getBoundingBox().getCenter()); */ // On initialise le corps avec la boite de collision m_pBody = NewtonCreateBody (nWorld, m_collision); if (m_pBody == NULL) cerr << "Impossible d'initialiser le corps."; // On détruit la boite de collision, on n'en a plus besoin NewtonReleaseCollision (nWorld, m_collision); //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 [3][0] = m_Nmodele->getPosition().X; matrice [3][1] = m_Nmodele->getPosition().Y; matrice [3][2] = m_Nmodele->getPosition().Z; // 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 a ceux qui essaieront de m'aider
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 //! 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); //Get pointer to vertices and indices S3DVertex *S3vertices = (S3DVertex*)mesh_buffer->getVertices(); //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); //delete vertices delete [] vertices; return collision_obj; }
ps: Ne faites pas attention aux commentaires multilangues, j'ai pompé ces codes sur des tutos et j'ai mélangé suivant mes besoins mais ca ne fonctionne jamais :X
Partager