[Newton] Collision mesh 3D
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:
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:
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 ! =)