Historique des modifications - Message

Message #9842

Sujet: charger une map et gerer les colision (newton? ou made in irrlicht?)


Type Date Auteur Contenu
Dernière modification 28-02-2011 23:14:17 Gehogor
Salut, en ce qui concerne Newton j'utilise cette fonction qui est connue sur le net pour convertir un IMesh d'Irrlicht en NewtonCollision pour Newton, sans doute que tu la connais déjà. Je peux te dire que ça fonctionne très bien, par contre je ne l'ai jamais essayée sur un maillage non fermé de terrain, j'espère que tu pourras me le dire. Merci d'avance.

La fonction:

NewtonCollision* GrNewton::p_createCollisionFromMesh(NewtonWorld *nWorld,irr::scene::IMesh *irr_mesh,float tolerance,float scaleX,float scaleY,float scaleZ,int shapeID,const float* offsetMatrix)
{
    int nMeshBuffer = 0;    //Mesh Buffer count
    irr::scene::IMeshBuffer *mesh_buffer = NULL;
    float *vertices;        //Array to store vertices

    irr::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];
    irr::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
        irr::video::S3DVertex *S3vertices = (irr::video::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 * scaleX / IRR_SCALE;
            vertices[tmpCounter++] = S3vertices[i].Pos.Y * scaleZ / IRR_SCALE;
            vertices[tmpCounter++] = S3vertices[i].Pos.Z * scaleY / IRR_SCALE;
        }
    }
    //Create Newton collision object
    NewtonCollision *collision_obj = NewtonCreateConvexHull(nWorld,nVertices,vertices,sizeof(float)*3,tolerance,shapeID,offsetMatrix);

    //delete vertices
    delete [] vertices;

    return collision_obj;
}
Création du message 28-02-2011 23:13:22 Gehogor
Salut, en ce qui concerne Newton j'utilise cette fonction qui est connue sur le net pour convertir un IMesh d'Irrlicht en NewtonCollision pour Newton, sans doute que tu la connais déjà. Je peux te dire que ça fonctionne très bien, par contre je ne l'ai jamais essayée sur un maillage non fermé de terrain, j'espère que tu pourras me le dire. Merci d'avance.

La fonction:

NewtonCollision* GrNewton::p_createCollisionFromMesh(NewtonWorld *nWorld,irr::scene::IMesh *irr_mesh,float tolerance,float scaleX,float scaleY,float scaleZ,int shapeID,const float* offsetMatrix)
{
    int nMeshBuffer = 0;    //Mesh Buffer count
    irr::scene::IMeshBuffer *mesh_buffer = NULL;
    float *vertices;        //Array to store vertices

    irr::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];
    irr::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
        irr::video::S3DVertex *S3vertices = (irr::video::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 * scaleX / IRR_SCALE;
            vertices[tmpCounter++] = S3vertices[i].Pos.Y * scaleZ / IRR_SCALE;
            vertices[tmpCounter++] = S3vertices[i].Pos.Z * scaleY / IRR_SCALE;
        }
    }
    //Create Newton collision object
    NewtonCollision *collision_obj = NewtonCreateConvexHull(nWorld,nVertices,vertices,sizeof(float)*3,tolerance,shapeID,offsetMatrix);

    //delete vertices
    delete [] vertices;

    return collision_obj;
}

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
117 invités en ligne
membre en ligne: -
RSS Feed