#0 

17-04-2009 17:12:05

mcjo
Petit nouveau
Date d'inscription: 17-04-2009
Messages: 1

Bonjour, j'essaie de faire un petit jeu de course (pas de voiture) mais de course à pied dans un décor 3D dans lequel je voudrai mettre un peu de physique (pour les sauts et des zones d'accélération).
J'ai réussi avec Irrlicht à déplacer mon petit bon homme dans le terrain, et je dirait même que les collisions marches assez bien.
Seulement voilà, j'ai un problème maintenant avec ODE.
Mon petit personnage passe à coté de formes complexes exportées en md2 ou 3ds faites avec Wings3D (on fait comme on peut) et là c'est le drame.
Je ne sais pas trop comment envoyé à ODE la node complexes).
Donc je voulais savoir s'il était possible de laisser Irrlicht géré les collisions mais pas la gravité. Ou si on peut récupérer les TriMesh de la forme pour la passer dans ODE, avec un "wrapper" que quelqu'un aurait codé.
Voici un exemple d'obstacles à franchir.
Il s'agit de formes statiques pas de squelette ni frame.




Merci d'avance

Hors ligne


#1 

20-04-2009 18:00:51

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

Salut,
Si tu veux gérer du trimesh, il te faut passer par une méthode qui lit les indices et vertices de ton SceneNode puis passer ça à Ode, comme tu as dû le faire pour ton terrain.
Je te file les méthodes codées pour mon jeu :
Je déclare une structure trimesh (pour delete le pointeur c'est nickel)

Code:

        struct TriMesh
        {
            dGeomID GeomID;
            dVector3* vertices;
            s32* indices;
        };

Ensuite la méthode du trimesh à proprement parler :

Code:

//Create a TriMesh
OdePhysic::TriMesh OdePhysic::CreateTriMesh(scene::IMesh* mesh,f32 ScaleX,f32 ScaleY,f32 ScaleZ)
{
    TriMesh TriStruct;

    s32 ci=0, cif=0, cv=0;
    s32 indexcount = 0;
    s32 vertexcount = 0;
    scene::IMesh* omesh = mesh;//->getMesh(0);

    for (u32 i=0;i<omesh->getMeshBufferCount();++i)
    {
        scene::IMeshBuffer* mb = omesh->getMeshBuffer(i);
        indexcount += mb->getIndexCount();
        vertexcount += mb->getVertexCount();
    }


    TriStruct.indices = new s32[indexcount];
    TriStruct.vertices = new dVector3[vertexcount];

    for (u32 i=0;i<omesh->getMeshBufferCount();++i)
    {
        scene::IMeshBuffer* mb = omesh->getMeshBuffer(i);

        u16* mb_indices = mb->getIndices();
        for(u32 j=0;j<mb->getIndexCount();++j)
        {
            TriStruct.indices[ci] = cif + mb_indices[j];
            ci++;
        }

        cif += mb->getVertexCount();

        if (mb->getVertexType() == video::EVT_STANDARD)
        {
            irr::video::S3DVertex* mb_vertices=(irr::video::S3DVertex*)mb->getVertices();
            for(u32 j=0;j<mb->getVertexCount();++j)
            {
                TriStruct.vertices[cv][0]=mb_vertices[j].Pos.X*ScaleX;
                TriStruct.vertices[cv][1]=mb_vertices[j].Pos.Y*ScaleY;
                TriStruct.vertices[cv][2]=mb_vertices[j].Pos.Z*ScaleZ;
                cv++;
            }
        }
        else
        {
            if (mb->getVertexType() == video::EVT_2TCOORDS)
            {
                irr::video::S3DVertex2TCoords* mb_vertices=(irr::video::S3DVertex2TCoords*)mb->getVertices();
                for(u32 j=0;j<mb->getVertexCount();j++)
                {
                    TriStruct.vertices[cv][0]=mb_vertices[j].Pos.X*ScaleX;
                    TriStruct.vertices[cv][1]=mb_vertices[j].Pos.Y*ScaleY;
                    TriStruct.vertices[cv][2]=mb_vertices[j].Pos.Z*ScaleZ;
                    cv++;
                }
            }
        }
    }

    dTriMeshDataID data = dGeomTriMeshDataCreate();

    dGeomTriMeshDataBuildSimple(data,(dReal*)TriStruct.vertices, vertexcount,(dTriIndex*) TriStruct.indices, indexcount);

    dGeomID geom=dCreateTriMesh(oSpace,data,0,0,0);


    dGeomTriMeshSetData(geom,data);
    dGeomSetBody(geom,0);

    TriStruct.GeomID = geom;

    return TriStruct;
}

Et la méthode pour delete proprement se trimesh afin d'éviter les memory leaks :

Code:

//Destroy the trimesh from memory
void OdePhysic::DestroyTriMesh(TriMesh TriStruct)
{
    dTriMeshDataID data = dGeomTriMeshGetTriMeshDataID(TriStruct.GeomID);
    dGeomTriMeshClearTCCache(TriStruct.GeomID);
    dGeomTriMeshDataDestroy(data);
    dGeomDestroy(TriStruct.GeomID);
    TriStruct.GeomID = NULL;
    delete [] TriStruct.indices;
    delete [] TriStruct.vertices;
    TriStruct.indices=NULL;
    TriStruct.vertices=NULL;
}

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

Hors ligne


#2 

20-04-2009 18:02:15

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

Pour le format de fichier, peut importe tant qu'irrlicht le lit, te suffit juste de récupérer un IMesh* que tu passes en parram à la fonction.
Ah et j'oublais, pour gérer proprement du trimesh, ton mesh doit etre proprement modélisé, évite les vertexs non soudés avec des faces ouverte ou de mauvaise soudure, ce qui semble être le cas sur ton mesh en image.
@+ et bon courage wink


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

Hors ligne


#3 

22-04-2009 11:58:14

firnafin
Abonné
Date d'inscription: 31-03-2007
Messages: 150

Bonjour;

Je signale au passage qu'un wrapper ODE ( IrrOde ) vient de pointer son nez , tu pourrais t'en inspirer :
http://irrlicht.sourceforge.net/phpBB2/ … 638#192638

Bon codage à tous.

Hors ligne


#4 

22-04-2009 18:43:57

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Oui, en effet, j'ai fait une petite new la dessus wink


Force et sagesse...

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
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
13 invités en ligne
Aucun membre connecté
RSS Feed