Historique des modifications - Message

Message #9385

Sujet: Système de collisions de type RPG


Type Date Auteur Contenu
Création du message 20-01-2011 10:56:13 tmyke
Bon, voici quelques bouts de codes qui te permettront j'espère d'y voir plus clair. (au fait je pensait que tu cherchais des élément pour les collisions, par pour la physique dynamique).

Creation d'un simple cube body:

Code c++ :


IBodySceneNode* CreateCubeBody(scene::IMeshSceneNode *ent, bool dynamique)
{
	core::vector3df sc= ent->getScale();
	sx = ent->getBoundingBox().getExtent().X * sc.X;
	sy = ent->getBoundingBox().getExtent().Y * sc.Y;
	sz = ent->getBoundingBox().getExtent().Z * sc.Z;
	NewtonCollision* collision = NewtonCreateBox(nWorld, sx,sy,sz, 0, NULL);


	body = NewtonCreateBody (nWorld, collision);

	// set the transformation for this rigid body
	ent->updateAbsolutePosition();
	
	
	core::matrix4 irr_mat = ent->getRelativeTransformation();
	NewtonBodySetMatrix (body, irr_mat.pointer());

	// set a destructor for this rigid body
	if(dynamique)
	{
		// set the transform call back function 
		NewtonBodySetTransformCallback (body, (NewtonSetTransform) bodyPhysicsSetTransform);
		// set the force and torque call back function
		NewtonBodySetForceAndTorqueCallback (body, (NewtonApplyForceAndTorque)bodyPhysicsApplyForceAndTorque);
		NewtonBodySetMassMatrix(body, mass, 1.0f, 1.0f, 1.0f);
	}

	// pour le moment ce code, a oir sinon celui ci-dessus
	NewtonReleaseCollision (nWorld, collision);

	return body;
}


Creation du shape concave

Code c++ :


//---------------------------------------------------------
NewtonCollision* CreateCollideConcave(scene::ISceneNode *ent, int optimized)
{

	NewtonCollision* collision;

	core::vector3df sc= ent->getScale();
	//
	// create the collision tree geometry
	collision = NewtonCreateTreeCollision(nWorld, 0);

	// prepare to create collision geometry
	NewtonTreeCollisionBeginBuild(collision);


	u32 skippedFaceNumber;
	core::array<core::triangle3df> tri;
	
	
	scene::IMeshSceneNode *node = (scene::IMeshSceneNode*) ent;
	tri = getPolys(node->getMesh(), sc, 1.0e-6f, skippedFaceNumber ); 

	int ntri=0;
	for(u32 i=0; i<tri.size(); i++) 
	{	core::vector3df v1[3];
		v1[0] = tri[i].pointA;
		v1[1] = tri[i].pointB;
		v1[2] = tri[i].pointC;
		NewtonTreeCollisionAddFace(collision, 3, &v1[0].X, sizeof (core::vector3df), 1);
		ntri++;
	}

	NewtonTreeCollisionEndBuild(collision, optimized);


	return collision;
}



definition du body static , à partir du collisionShape concave:

Code c++ :


IBodySceneNode* CreateSceneBody(scene::IMeshSceneNode *ent, NewtonCollision* collision)
{
	NewtonCollision* collision = CreateCollideConcave(ent, 0);

	body = NewtonCreateBody (nWorld, collision);

	// set the transformation for this rigid body
	ent->updateAbsolutePosition();
	
	
	core::matrix4 irr_mat = ent->getRelativeTransformation();
	NewtonBodySetMatrix (body, irr_mat.pointer());

	// pour le moment ce code, a oir sinon celui ci-dessus
	NewtonReleaseCollision (nWorld, collision);

	return body;
}


Voilà, le code à quelque manque en terme de définition, c'est pas super propre et fait à l'arrache, mais le principe est là. Cela fonctionne très bien, y compris avec des level complet genre Quake3.
smile

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