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
Hors ligne
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.
Hors ligne
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 ?
Hors ligne
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 (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
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 .
Bon courage !
Hors ligne
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
merci je my met de suite
Hors ligne
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
bonne nuit XD
Hors ligne