Historique des modifications - Message

Message #2698

Sujet: librairies pour gérer ODE


Type Date Auteur Contenu
Dernière modification 17-07-2007 13:29:04 Perceval
J'ai commencé à utiliser OPAL depuis hier, et çà à l'air vraiment très bien. J'arrive à utiliser les primitives de base d'OPAL et à les rendre dans Irrlicht, par contre j'ai du mal à créer des objets "solides" à partir des meshs d'Irrlicht : les solides entrent bien en collision les uns avec les autres, mais ils finissent toujours par se traverser (un peu gênant pour les collisions avec le niveau... hmm ). J'utilise ce code pour charger les meshs (il vient du site d'OPAL) :
//merely a wrapper that will iterate across an IMesh's buffers
bool IRRtoOPAL_AddMeshToSolid( opal::Solid* solid, irr::scene::IMesh * mesh )
{
    bool success = true;
    for ( int mb=0; mb < mesh->getMeshBufferCount() ; mb++ )
    {
        if ( !IRRtoOPAL_AddMeshBufferToSolid( solid, mesh->getMeshBuffer(mb) ) )
        {
            success = false;
            //still loads in more mesh buffers if there is an error
        }
    }
    return success;
}

//adds mesh shapes to an already created OPAL solid from an Irrlicht IMeshBuffer
bool IRRtoOPAL_AddMeshBufferToSolid( opal::Solid* solid, irr::scene::IMeshBuffer * meshBuffer )
{
    opal::MeshShapeData meshData;
    meshData.numVertices = 0;
    meshData.numTriangles = 0;

    meshData.numVertices = meshBuffer->getVertexCount();
    meshData.numTriangles = meshBuffer->getIndexCount()/3;

    meshData.vertexArray = new opal::real[3 * meshData.numVertices];
    meshData.triangleArray = new unsigned int[3 * meshData.numTriangles];

    // Copy vertex data.
    irr::video::S3DVertex*	normVerts = (irr::video::S3DVertex*)(meshBuffer->getVertices());
    irr::video::S3DVertex2TCoords* txrVerts =
        (irr::video::S3DVertex2TCoords*)(meshBuffer->getVertices());
    irr::video::S3DVertexTangents* tangyVerts =
        (irr::video::S3DVertexTangents*)(meshBuffer->getVertices());
    for (unsigned int i = 0; i < meshBuffer->getVertexCount(); ++i)
    {

        switch (meshBuffer->getVertexType())
        {
        case irr::video::EVT_STANDARD:
            {
                meshData.vertexArray[3 * i + 0] = normVerts[i].Pos.X;
                meshData.vertexArray[3 * i + 1] = normVerts[i].Pos.Y;
                meshData.vertexArray[3 * i + 2] = normVerts[i].Pos.Z;
            }
            break;
        case irr::video::EVT_2TCOORDS:
            {
                meshData.vertexArray[3 * i + 0] = txrVerts[i].Pos.X;
                meshData.vertexArray[3 * i + 1] = txrVerts[i].Pos.Y;
                meshData.vertexArray[3 * i + 2] = txrVerts[i].Pos.Z;
            }
            break;
        case irr::video::EVT_TANGENTS:
            {
                meshData.vertexArray[3 * i + 0] = tangyVerts[i].Pos.X;
                meshData.vertexArray[3 * i + 1] = tangyVerts[i].Pos.Y;
                meshData.vertexArray[3 * i + 2] = tangyVerts[i].Pos.Z;
            }
            break;
        default:
        {
            // you will need to handle the vertex type
            assert(false);
        }
        break;
        }
    }

    // Copy triangle data.
    uint16_t* meshIndices = (uint16_t*)meshBuffer->getIndices();
    for (unsigned int i = 0; i < meshData.numTriangles; ++i)
    {
        meshData.triangleArray[i*3 + 0] = meshIndices[i*3 + 0];
        meshData.triangleArray[i*3 + 1] = meshIndices[i*3 + 1];
        meshData.triangleArray[i*3 + 2] = meshIndices[i*3 + 2];
    }
    solid->addShape(meshData);

    return true;
}

void IRRtoOPAL_ReleaseSolidMeshData( opal::Solid* solid )
{
    if (solid)
    {
        //make sure to remove memory allocated for mesh objects
        opal::SolidData solidData = solid->getData();
        for (unsigned int i = 0; i < solidData.getNumShapes(); ++i)
        {
            if (solidData.getShapeData(i)->getType() == opal::MESH_SHAPE)
            {
                opal::MeshShapeData* meshData =
                    (opal::MeshShapeData*)solidData.getShapeData(i);
                delete [] meshData->vertexArray;
                delete [] meshData->triangleArray;
            }
        }
    }
}

Je sais pas si tu as testé cette lib, mais si c'est le cas, tu as certainement rencontré le même problème, donc je voudrais juste savoir si tu as trouvé une solution pour çà smile
Création du message 17-07-2007 13:25:23 Perceval
J'ai commencé à utiliser OPAL depuis hier, et çà à l'air vraiment très bien. J'arrive à utiliser les primitives de base d'OPAL et à les rendre dans Irrlicht, par contre j'ai du mal à créer des objets "solides" à partir des meshs d'Irrlicht : les solides entrent bien en collision les uns avec les autres, mais ils finissent toujours par se traverser (un peu gênant pour les collisions avec le niveau... hmm ). J'utilise ce code pour charger les meshs (il vient du site d'OPAL) :
//merely a wrapper that will iterate across an IMesh's buffers
bool IRRtoOPAL_AddMeshToSolid( opal::Solid* solid, irr::scene::IMesh * mesh )
{
    bool success = true;
    for ( int mb=0; mb < mesh->getMeshBufferCount() ; mb++ )
    {
        if ( !IRRtoOPAL_AddMeshBufferToSolid( solid, mesh->getMeshBuffer(mb) ) )
        {
            success = false;
            //still loads in more mesh buffers if there is an error
        }
    }
    return success;
}

//adds mesh shapes to an already created OPAL solid from an Irrlicht IMeshBuffer
bool IRRtoOPAL_AddMeshBufferToSolid( opal::Solid* solid, irr::scene::IMeshBuffer * meshBuffer )
{
    opal::MeshShapeData meshData;
    meshData.numVertices = 0;
    meshData.numTriangles = 0;

    meshData.numVertices = meshBuffer->getVertexCount();
    meshData.numTriangles = meshBuffer->getIndexCount()/3;

    meshData.vertexArray = new opal::real[3 * meshData.numVertices];
    meshData.triangleArray = new unsigned int[3 * meshData.numTriangles];

    // Copy vertex data.
    irr::video::S3DVertex*	normVerts = (irr::video::S3DVertex*)(meshBuffer->getVertices());
    irr::video::S3DVertex2TCoords* txrVerts =
        (irr::video::S3DVertex2TCoords*)(meshBuffer->getVertices());
    irr::video::S3DVertexTangents* tangyVerts =
        (irr::video::S3DVertexTangents*)(meshBuffer->getVertices());
    for (unsigned int i = 0; i < meshBuffer->getVertexCount(); ++i)
    {

        switch (meshBuffer->getVertexType())
        {
        case irr::video::EVT_STANDARD:
            {
                meshData.vertexArray[3 * i + 0] = normVerts[i].Pos.X;
                meshData.vertexArray[3 * i + 1] = normVerts[i].Pos.Y;
                meshData.vertexArray[3 * i + 2] = normVerts[i].Pos.Z;
            }
            break;
        case irr::video::EVT_2TCOORDS:
            {
                meshData.vertexArray[3 * i + 0] = txrVerts[i].Pos.X;
                meshData.vertexArray[3 * i + 1] = txrVerts[i].Pos.Y;
                meshData.vertexArray[3 * i + 2] = txrVerts[i].Pos.Z;
            }
            break;
        case irr::video::EVT_TANGENTS:
            {
                meshData.vertexArray[3 * i + 0] = tangyVerts[i].Pos.X;
                meshData.vertexArray[3 * i + 1] = tangyVerts[i].Pos.Y;
                meshData.vertexArray[3 * i + 2] = tangyVerts[i].Pos.Z;
            }
            break;
        default:
        {
            // you will need to handle the vertex type
            assert(false);
        }
        break;
        }
    }

    // Copy triangle data.
    uint16_t* meshIndices = (uint16_t*)meshBuffer->getIndices();
    for (unsigned int i = 0; i < meshData.numTriangles; ++i)
    {
        meshData.triangleArray[i*3 + 0] = meshIndices[i*3 + 0];
        meshData.triangleArray[i*3 + 1] = meshIndices[i*3 + 1];
        meshData.triangleArray[i*3 + 2] = meshIndices[i*3 + 2];
    }
    solid->addShape(meshData);

    return true;
}

void IRRtoOPAL_ReleaseSolidMeshData( opal::Solid* solid )
{
    if (solid)
    {
        //make sure to remove memory allocated for mesh objects
        opal::SolidData solidData = solid->getData();
        for (unsigned int i = 0; i < solidData.getNumShapes(); ++i)
        {
            if (solidData.getShapeData(i)->getType() == opal::MESH_SHAPE)
            {
                opal::MeshShapeData* meshData =
                    (opal::MeshShapeData*)solidData.getShapeData(i);
                delete [] meshData->vertexArray;
                delete [] meshData->triangleArray;
            }
        }
    }
}

Je sais pas si tu as testé cette lib, mais si c'est le cas, tu as certainement rencontré le même problème, donc je voudrais juste savoir si tu as trouvé une solution pour çà smile

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
158 invités en ligne
membre en ligne: -
RSS Feed