#1 

17-04-2007 18:10:00

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

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/opal_wiki/index.php/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


#2 

17-07-2007 13:25:23

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.19.182
Courriel

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


Hors ligne


#3 

17-07-2007 18:03:58

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 90.38.197.56
Courriel  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


#4 

19-07-2007 09:26:59

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.1.250
Courriel

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


#5 

19-07-2007 10:55:35

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 213.41.232.205
Courriel

Copland Ecris:

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

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

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

idem que perceval

Copland Ecris:

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


#6 

19-07-2007 15:17:11

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.1.250
Courriel

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


#7 

23-07-2007 10:39:08

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 213.41.232.205
Courriel

Perceval Ecris:

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


#8 

23-07-2007 17:12:54

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.152.224
Courriel

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