#1 

25-11-2007 16:01:31

tekilla
Membres
Date d'inscription:
Messages: 14
IP: 82.233.244.93
Courriel

Bonjours voila je travail sur un petit projet perso et j'ai choisi Irrlicht et la physique de newton mais je block a un endroit :
Les collision

enfaite pour faire une collision avec un objet pas de probleme mais quand c'est pour la camera ... le je suis sur le c*** ^^

donc je vien vous demandez de l'aide pour gerée les collision de ma camera avec newton
voice mon code :

	//Geré les touche
	SKeyMap keyMap[4] = {
		{EKA_MOVE_FORWARD,	KEY_KEY_Z},
		{EKA_MOVE_BACKWARD,	KEY_KEY_S},
		{EKA_STRAFE_LEFT,	KEY_KEY_Q},
		{EKA_STRAFE_RIGHT,	KEY_KEY_D},
	};
	// On crée la cam et on la place
	cam = smgr->addCameraSceneNodeFPS(0, 200.0f, 250.0f, -1, keyMap, 4);

et pour charger la carte :
	// add skybox
	smgr->addSkyBoxSceneNode(driver->getTexture("data/irrlicht2_up.bmp"),driver->getTexture("data/irrlicht2_dn.bmp"),driver->getTexture("data/irrlicht2_lf.bmp"),driver->getTexture("data/irrlicht2_rt.bmp"),driver->getTexture("data/irrlicht2_ft.bmp"),driver->getTexture("data/irrlicht2_bk.bmp"));

	// Load level in Quake3 format
	device->getFileSystem()->addZipFileArchive("./data/chiropteraDM.pk3");
	scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("maps/chiropteradm.bsp");
	scene::ISceneNode* q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0));

	//LevelNewtonCollision
	NewtonCollision* nmapcollision = NewtonCreateTreeCollision(nWorld, NULL);
	NewtonTreeCollisionBeginBuild(nmapcollision);
	u32 cMeshBuffer, j;
	int v1i, v2i, v3i;
	IMeshBuffer *mb;
	float vArray[9]; // vertex array (3*3 floats)
	int tmpCount = 0;

	scene::IMesh *mesh = q3levelmesh->getMesh(0);
	for (cMeshBuffer=0; cMeshBuffer<mesh->getMeshBufferCount(); cMeshBuffer++)
	{
		mb = q3levelmesh->getMesh(0)->getMeshBuffer(cMeshBuffer);
		S3DVertex2TCoords* mb_vertices = (S3DVertex2TCoords*)mb->getVertices();
		u16* mb_indices  = mb->getIndices();
		// add each triangle from the mesh
		for (j=0; j<mb->getIndexCount(); j+=3)
		{
			v1i = mb_indices[j];
			v2i = mb_indices[j+1];
			v3i = mb_indices[j+2];
			vArray[0] = mb_vertices[v1i].Pos.X;
			vArray[1] = mb_vertices[v1i].Pos.Y;
			vArray[2] = mb_vertices[v1i].Pos.Z;
			vArray[3] = mb_vertices[v2i].Pos.X;
			vArray[4] = mb_vertices[v2i].Pos.Y;
			vArray[5] = mb_vertices[v2i].Pos.Z;
			vArray[6] = mb_vertices[v3i].Pos.X;
			vArray[7] = mb_vertices[v3i].Pos.Y;
			vArray[8] = mb_vertices[v3i].Pos.Z;
			box.addInternalPoint(mb_vertices[v1i].Pos.X, mb_vertices[v1i].Pos.Y, mb_vertices[v1i].Pos.Z);
			box.addInternalPoint(mb_vertices[v2i].Pos.X, mb_vertices[v2i].Pos.Y, mb_vertices[v2i].Pos.Z);
			box.addInternalPoint(mb_vertices[v3i].Pos.X, mb_vertices[v3i].Pos.Y, mb_vertices[v3i].Pos.Z);
			NewtonTreeCollisionAddFace(nmapcollision, 3, &vArray[0], 12, 1);
		}
	}
	NewtonTreeCollisionEndBuild(nmapcollision, 0);
	NewtonBody* nmapbody = NewtonCreateBody(nWorld, nmapcollision);
	box = q3node->getTransformedBoundingBox();
	NewtonSetWorldSize (nWorld, (float*)&(box.MinEdge.X), (float*)&(box.MaxEdge.X));
	NewtonReleaseCollision(nWorld, nmapcollision);

le code pour la map se trouve dans une fonction "Prepare()" et celui de la cam dans "Init"

Voila merci de bien vouloir aider un newbie comme moi big_smile


Hors ligne


#2 

26-11-2007 17:59:57

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 90.5.159.214
Courriel  Site web

A mon avis, il te faut gérer une collision en forme d'élipse pour ta camera, perso j'utiliserai une Sphere invisible.
Du coup le déplacement de ta caméra s'effecturai directement sur la Sphere et non plus sur la cam car là c'est newton qui gerera le déplacement camera.


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

Hors ligne


#3 

26-11-2007 21:39:11

tekilla
Membres
Date d'inscription:
Messages: 14
IP: 82.233.244.93
Courriel

Slt

dabord merci a toi pour ta réponse c'est aussi se que j'ai penser pour faire un test j'ai dabord essayer de faire sa avec une box (enfaite je crée une box j'applique la collision etc... sauf que je détourne le boundingbox pour lui donner les coordonée de la camera) pour sa j'ai essayer de faire sa :

box->node->setPosition(vector3df(cam->getPosition));

mais sa marche pas est actuellement mon niveau ne me permet pas de résoudre se probleme ^^ esque tu pourais m'aider encore un peu stp sad ?


Hors ligne


#4 

27-11-2007 12:20:40

tekilla
Membres
Date d'inscription:
Messages: 14
IP: 82.233.244.93
Courriel

slt

voila c'est bon j'ai reussi en "fusionnant" la methode de map loading de irrlicht et newton afin dutiliser le triangleselctor de irrlicht puisque je pouvais pas utiliser celui de newton

voila je partage mon code pour ceux qui on le meme prob wink (PS c'est bourrin)

void CGame::Prepare()
{
	// add skybox
	smgr->addSkyBoxSceneNode(driver->getTexture("data/irrlicht2_up.bmp"),driver->getTexture("data/irrlicht2_dn.bmp"),driver->getTexture("data/irrlicht2_lf.bmp"),driver->getTexture("data/irrlicht2_rt.bmp"),driver->getTexture("data/irrlicht2_ft.bmp"),driver->getTexture("data/irrlicht2_bk.bmp"));

	// Load level in Quake3 format
	device->getFileSystem()->addZipFileArchive("./data/chiropteraDM.pk3");
	scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("maps/chiropteradm.bsp");
	scene::ISceneNode* q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0));
	scene::ITriangleSelector* selector = 0;
	selector = smgr->createOctTreeTriangleSelector(q3levelmesh->getMesh(0), q3node, 128);
	q3node->setTriangleSelector(selector);
	selector->drop();

	//LevelNewtonCollision
	NewtonCollision* nmapcollision = NewtonCreateTreeCollision(nWorld, NULL);
	NewtonTreeCollisionBeginBuild(nmapcollision);
	u32 cMeshBuffer, j;
	int v1i, v2i, v3i;
	IMeshBuffer *mb;
	float vArray[9]; // vertex array (3*3 floats)
	int tmpCount = 0;

	scene::ICameraSceneNode* camera = 
		smgr->addCameraSceneNodeFPS(0, 100.0f, 300.0f, -1, 0, 0, true);
	camera->setPosition(core::vector3df(-100,-100,-150));

	scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
		selector, camera, core::vector3df(30,50,30),
		core::vector3df(0,-3,0), 
		core::vector3df(0,50,0));
	camera->addAnimator(anim);
	anim->drop();

	scene::IMesh *mesh = q3levelmesh->getMesh(0);
	for (cMeshBuffer=0; cMeshBuffer<mesh->getMeshBufferCount(); cMeshBuffer++)
	{
		mb = q3levelmesh->getMesh(0)->getMeshBuffer(cMeshBuffer);
		S3DVertex2TCoords* mb_vertices = (S3DVertex2TCoords*)mb->getVertices();
		u16* mb_indices  = mb->getIndices();
		// add each triangle from the mesh
		for (j=0; j<mb->getIndexCount(); j+=3)
		{
			v1i = mb_indices[j];
			v2i = mb_indices[j+1];
			v3i = mb_indices[j+2];
			vArray[0] = mb_vertices[v1i].Pos.X;
			vArray[1] = mb_vertices[v1i].Pos.Y;
			vArray[2] = mb_vertices[v1i].Pos.Z;
			vArray[3] = mb_vertices[v2i].Pos.X;
			vArray[4] = mb_vertices[v2i].Pos.Y;
			vArray[5] = mb_vertices[v2i].Pos.Z;
			vArray[6] = mb_vertices[v3i].Pos.X;
			vArray[7] = mb_vertices[v3i].Pos.Y;
			vArray[8] = mb_vertices[v3i].Pos.Z;
			box.addInternalPoint(mb_vertices[v1i].Pos.X, mb_vertices[v1i].Pos.Y, mb_vertices[v1i].Pos.Z);
			box.addInternalPoint(mb_vertices[v2i].Pos.X, mb_vertices[v2i].Pos.Y, mb_vertices[v2i].Pos.Z);
			box.addInternalPoint(mb_vertices[v3i].Pos.X, mb_vertices[v3i].Pos.Y, mb_vertices[v3i].Pos.Z);
			NewtonTreeCollisionAddFace(nmapcollision, 3, &vArray[0], 12, 1);
		}
	}
	NewtonTreeCollisionEndBuild(nmapcollision, 0);
	NewtonBody* nmapbody = NewtonCreateBody(nWorld, nmapcollision);
	box = q3node->getTransformedBoundingBox();
	NewtonSetWorldSize (nWorld, (float*)&(box.MinEdge.X), (float*)&(box.MaxEdge.X));
	NewtonReleaseCollision(nWorld, nmapcollision);
	
	// hide cursor
	device->getCursorControl()->setVisible(false);

	MakeCube(vector3df((float)(2*100)-2, 800.0f, (float)(2*100)-2));
}

sinon maintenant le probleme c'est comment faire pour crée la collision entre la camera
et les objet qui sont gerée avec newton :s ? parsque la camera elle passe a travers mon ti cube mais mon cube réagit bien sur la carte

(au faite je suis toujours preneur pour celui qui me file un code permetant de gerée la collision de la camera uniquement avec newton ^^)

ciaooo


Hors ligne


#5 

27-11-2007 18:10:06

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 90.5.156.159
Courriel  Site web

Je pense que t'a pas bien compris ce que je t'expliquais brevement plus haut.
Je me sers d'ode donc Newton je ne connais pas ses méthodes spécifique, mais pour te filer un exemple de théorie :
Tu créais une Sphere sous irrlicht un SphereSceneNode par exemple.
Tu lui appliques un Objet Newton Sphere pour que ta sphere collisionne avec tout les objets du monde.
Tu Lis la camera à ta sphere par Irrlicht avec un setParent ou addChild ou un truc comme ça je sais plus.
Ensuite pour déplacer ta camera, tu déplaces l'objet Newton (body ?) et non pas l'objet Irrlicht !
Si tu débutes, je te conseille de lire les tutos fourni avec le SDK de newton, tu finiras bien par trouver ce que tu cherches, le tout est de persévérer wink.
Bon courage !


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

Hors ligne


#6 

27-11-2007 20:19:23

tekilla
Membres
Date d'inscription:
Messages: 14
IP: 82.233.244.93
Courriel

ah ok c'est bon je vois en gros je crée une sphere sous irrlicht que je "surperpose"(je cest pas si le terme est juste ^^) avec un objet newton (sphere) et japplique les collision a la sphere puis je lis la cam a la sphere irrlicht qui est elle meme lié a la sphere newton smile

merci je my met de suite big_smile


Hors ligne


#7 

27-11-2007 22:23:03

tekilla
Membres
Date d'inscription:
Messages: 14
IP: 82.233.244.93
Courriel

resalut voila je poste la ou je me suis arreter avant daller me coucher ^^

NewtonSphere *CGame::MakeSphere(vector3df loc)
{
	NewtonSphere *tmp1 = new NewtonSphere;

	tmp1->mesh = smgr->getMesh("data/sphere.3ds");
	tmp1->node = smgr->addAnimatedMeshSceneNode(tmp1->mesh);
	tmp1->node->setMaterialFlag(video::EMF_LIGHTING, false);
	tmp1->node->setMaterialTexture(0, driver->getTexture("data/wood.jpg"));
	
	// Create a box primitive. 38 is just an estimated value of the size of the model,
	tmp1->collision = NewtonCreateBox(nWorld, 38, 100, 38, NULL);
	tmp1->body = NewtonCreateBody(nWorld, tmp1->collision);

	// Set user data pointer to the scene node
	NewtonBodySetUserData(tmp1->body, tmp1->node);

	// Set body mass & inertia matrix
	NewtonBodySetMassMatrix (tmp1->body, 10.0f, 150.0f, 150.0f, 150.0f);

	// Set the freeze threshhold to 1 unit (default is 0.01 but irrlight uses a large unit scale)
	NewtonBodySetFreezeTreshold(tmp1->body, 1.0, 1.0, 1.0); 

	// Set callback functions for the body
	NewtonBodySetTransformCallback(tmp1->body, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(tmp1->body, ApplyForceAndTorqueEvent);

	// Set the position of the body
	matrix4 mat;
	mat.setTranslation(loc);
	NewtonBodySetMatrix(tmp1->body, &mat.M[0]);
	
	if (currentCube == 512)
	{
		printf("* Too many cubes!");
		return NULL;
	}

	Sphere[currentSphere] = tmp1;
	currentSphere ++;

	return tmp1;
}

je reprend demain et je des que je trouve je poste le tout ici smile

bonne nuit XD


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