Historique des modifications - Message

Message #6348

Sujet: Irrlicht ODE collision, objet complexe md2, 3ds, md3? Quel format ?


Type Date Auteur Contenu
Création du message 20-04-2009 16:00:51 Copland
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;
}

Retour

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