Pages: 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
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)
struct TriMesh { dGeomID GeomID; dVector3* vertices; s32* indices; };
Ensuite la méthode du trimesh à proprement parler :
//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 :
//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; }
Hors ligne
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
Hors ligne
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
Oui, en effet, j'ai fait une petite new la dessus
Hors ligne
Pages: 1
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 80 invités en ligne Aucun membre connecté RSS Feed |