#1 

17-04-2009 15:12:05

mcjo
Membres
Date d'inscription:
Messages: 1
IP: 90.15.222.153
Courriel

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


#2 

20-04-2009 16:00:51

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

        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;
}


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

Hors ligne


#3 

20-04-2009 16:02:15

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


#4 

22-04-2009 09:58:14

firnafin
Membres
Avatar de firnafin
Date d'inscription:
Messages: 150
IP: 93.9.158.220
Courriel

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/viewtopic.php?p=192638#192638

Bon codage à tous.


Hors ligne


#5 

22-04-2009 16:43:57

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 81.51.26.250
Courriel

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


Force et sagesse...

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