#0 

17-04-2007 20:10:00

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

salut le Zamis

j'ai trouvés deux lib réalisant une encapsulation haut niveau de ODE, EZPhysics et OPAL

http://ezphysics.org/index.htm

http://ox.slug.louisville.edu/~o0lozi01 … /Main_Page

vous avez déja testé ? vous avez des conseils pour quelqu'un qui veux se lancer dans l'une des deux ?
des conseils pour choisir ?

voila, si personne a testé, je vous ferai un petit rapport avec mon avis quand j'en aurai un wink

Hors ligne


#1 

17-07-2007 15:25:23

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

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) :

Code:

//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

Dernière modification par Perceval (17-07-2007 15:29:04)

Hors ligne


#2 

17-07-2007 20:03:58

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Hello,
Je vais persister à dire que j'aime pas ses libs d'encapsulation ^_^.
Je trouve ça "con" d'utiliser une lib telle que Ode par l'intermédiaire d'une encapsulation qui risque de rajouter des bugs, qui va restreindre l'utilisateur à ce qu'elle propose et qui au final fera pas forcément gagner du temps.
Ca y est là j'ai mis le feu, la réplique de Jerry va être terrible wink.
Enfin ça reste mon avis personnel, je n'ai jamais réellement pris le temps non plus d'en utiliser une, mais pour l'instant ça me donne pas envie.

Donc mes questions sont les suivantes pour ceux qui testent :
Comment on gère le time stepping sous vos libs ?
Si je veux faire un effet de ralentissement à la matrix, ça reste aisé ?
Et enfin donné moi un excellent argument de vente avec se systeme plustôt que Ode en natif qui me permet une liberté totale de mon code ?


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#3 

19-07-2007 11:26:59

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Comment on gère le time stepping sous vos libs ?


J'utilise un timer d'irrlicht pour obtenir le temps écoulé entre 2 pas de boucle, et je passe ce temps à OPAL via la fonction qui va effectuer la simulation :

Code:

sim->simulate(temps écoulé depuis la dernière simulation);

Si je veux faire un effet de ralentissement à la matrix, ça reste aisé ?


Bah, je suppose qu'il suffit de "blouser" OPAL en jouant sur la valeur du timer wink .

Et enfin donné moi un excellent argument de vente avec se systeme plustôt que Ode en natif qui me permet une liberté totale de mon code ?


J'aime bien cette lib car elle permet de faire des trucs avancés sans avoir à trop se casser la tête (en théorie en tout cas, j'ai pas encore eu beaucoup de temps pour tester la lib donc je sais pas si c'est effectivement le cas).
Quelques possibilitées d'OPAL qui me paraissent bien et qui, à moins que je ne me trompes (pas trop regardé les features d'ODE... sad ), ne sont pas réalisables aussi facilement avec ODE :
     - les breakables joints : juste une propriété qui permet de casser automatiquement les joints entre 2 solides quand une force suffisamment importante lui est appliqué.
     - les motors : on les paramètre au début, et après, on a juste à les activer/désactiver quand on veut (OPAL s'occupe tout seul d'ajouter les forces et torques nécessaires)
     - j'aime bien le système de détection des collisions sous forme d'évênements, qui ressemble beaucoup au système de gestion des évênements dans Irrlicht. Dans ODE si je me trompes pas, faut passer par des callbacks : çà marche aussi bien, mais je trouve le code moins clair.
     - la possibilité de sauver et de charger les paramètres des solides, des joints etc dans des fichiers xml
Autre argument : j'ai jamais utilisé d'autres librairies physiques, et je penses que cette lib est un bon moyen de débuter.
Enfin, pour défendre un peu les créateurs d'OPAL, faut savoir que cette lib a été créer non pas pour être utilisé telle quelle dans des jeux (même si c'est bien évidemment possible), mais plutôt pour faire du prototypage ou des outils d'édition physique. Donc je penses pas que c'est "con" de faire une lib comme çà smile

Hors ligne


#4 

19-07-2007 12:55:35

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

Copland :

Hello,
Je vais persister à dire que j'aime pas ses libs d'encapsulation ^_^.
Je trouve ça "con" d'utiliser une lib telle que Ode par l'intermédiaire d'une encapsulation qui risque de rajouter des bugs, qui va restreindre l'utilisateur à ce qu'elle propose et qui au final fera pas forcément gagner du temps.
Ca y est là j'ai mis le feu, la réplique de Jerry va être terrible wink.


MOUAHAH, ma vengeance sera terrible Copland wink

bon en fait quid des perfs, je sais pas, j'ai pas mesuré, par contre ce que je sais, c'est que j'arrive a faire de la physique simplement avec OPAL, et que c'est pas le cas avec les autres

Copland :

Comment on gère le time stepping sous vos libs ?


Tres simplement, suffit d'utiliser une fonction qui définit le time step; perceval l'a donnée dans son post

Copland :

Si je veux faire un effet de ralentissement à la matrix, ça reste aisé ?


idem que perceval

Copland :

Et enfin donné moi un excellent argument de vente avec se systeme plustôt que Ode en natif qui me permet une liberté totale de mon code ?


ben si tu étais vraiment contre les lib d'encapsulation, tu utiliserai pas irrlicht, tu prendrai OpenGL en natif et tu serai heureux ..
franchement le gros avantage de OPAL pour moi ce sont ces moteurs tout fait  :
tu as un moteur rotation qui donne la bonne force pour contraindre un axe a faire une rotation constante
un moteur qui donne toujours la meme force (donc la vitesse varie)
un moteur de gravité (cf Half life)
un moteur "fusée" etc etc

Hors ligne


#5 

19-07-2007 17:17:11

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Bon, pour en revenir à mon problème (si çà intéresse encore quelqu'un smile ), j'ai testé davantage et apparement le problème ne survient que pour les collisions entre 2 solides créés à partir de meshs d'Irrlicht (aucuns soucis pour les collisions entre un solide créé à partir d'un mesh d'Irrlicht et une primitive d'OPAL). Par contre, çà marche absolument pas à partir des heightmaps sad

Conclusion : j'utiliserais les fonctions de mon premier post uniquement pour les éléments statics de mon niveau, et les autres objets seront tous controllés par des primitives d'OPAL.

Hors ligne


#6 

23-07-2007 12:39:08

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

Perceval :

Conclusion : j'utiliserais les fonctions de mon premier post uniquement pour les éléments statics de mon niveau, et les autres objets seront tous controllés par des primitives d'OPAL.


si j'ai bien compris tu as choisi de laisser tomber ODE pur ? yatta !

Hors ligne


#7 

23-07-2007 19:12:54

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Ben moi j'ai jamais voulu utiliser "ODE pur" sinon j'aurais pas télécharger OPAL smile

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
55 invités en ligne
Aucun membre connecté
RSS Feed