Historique des modifications - Message

Message #9842

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


TypeDateAuteurContenu
Dernière modification28-02-2011 23:14:17Gehogor
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 message28-02-2011 23:13:22Gehogor
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

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
118 invités en ligne
membre en ligne: -
RSS Feed