Vous avez fait une map avec irrEdit et vous voulez les collision(seulement avec les mesh)?
il suffit de faire sa:
declaration:
IAnimatedMesh *Scene1Mesh[20]; ISceneNode* Scene1Node[20]; IMeshCache *MeshEnMemoire; ITriangleSelector *Colision[20]; int NbrColision; IMetaTriangleSelector *MetaColisionTriangle; ISceneNodeAnimatorCollisionResponse *CameraAnimCollision;
après avoir charger la map:
MeshEnMemoire = smgr->getMeshCache(); //recuperation des mesh en memoire est celle charger dans le .irr
NbrColision = 3;
Scene1Mesh[1] = MeshEnMemoire->getMeshByIndex(0);
métez NbrColision au nombre de collision que vous voulez + 1
les scene node:
Scene1Node[1] = smgr->addEmptySceneNode(); // pour la premiere collision Scene1Node[2] = smgr->addEmptySceneNode(); // pour la deuxieme collision //....
Déclarer autan de scene node que te collision voulu
ajout d'une collision:
if (Scene1Node[1]) { Scene1Node[1]->setPosition(core::vector3df(-241.368347,146.190399,252.690628)); Scene1Node[1]->setScale(vector3df(1,1,1)); Colision[1] = smgr->createTriangleSelector( Scene1Mesh[1]->getMesh(0), Scene1Node[1]); Scene1Node[1]->setTriangleSelector(Colision[1]); Colision[1]->drop(); } if (Scene1Node[2]) { Scene1Node[2]->setPosition(core::vector3df(557.968445,146.190399,252.690628)); Scene1Node[2]->setScale(vector3df(1,1,1)); Colision[2] = smgr->createTriangleSelector( Scene1Mesh[1]->getMesh(0), Scene1Node[2]); Scene1Node[2]->setTriangleSelector(Colision[2]); Colision[2]->drop(); }
n'oublier pas d'indiquer la position de la collision et le scale de l'objet
le morceau final:
MetaColisionTriangle = smgr->createMetaTriangleSelector(); for (int i = 1; i!=NbrColision; i++) { MetaColisionTriangle->addTriangleSelector(Colision[i]); } CameraAnimCollision = smgr->createCollisionResponseAnimator( MetaColisionTriangle, camera, core::vector3df(2,2,2), core::vector3df(0,0,0), core::vector3df(0,0,0)); camera->addAnimator(CameraAnimCollision); CameraAnimCollision->drop();
Voila si certain truc vous semble flout vous nesitez pas a demander
ji croie pas ya encore des fantôme peut sociable?
Hors ligne
OUUHOUUUHHHOUUUHHH
pardon
Sinon merci pour ce tuto ^^
Hors ligne
Salut !
Je ne comprend pas un truc... Qu'est-ce que tu entends réellement par UNE collision (quand tu dis le nombre de collisions que l'on veut) ? Ne devrait-on pas définir un espace à l'intérieur duquel les collisions sont activées avec tous les éléments de la map chargée ?
Deuxième truc : quand tu fait
Scene1Node[1]->setPosition(core::vector3df(-241.368347,146.190399,252.690628));
a quoi correspond ce "node" et quel valeurs choisir pour sa position ?
Merci !
Dernière modification par Pitu (13-11-2008 16:29:24)
Hors ligne
avec Scene1Mesh[1] = MeshEnMemoire->getMeshByIndex(0) on récupère le mesh du node
après on dit sa position et son "scale" de l'objet
et irrlicht va crée les bouding box de collision par rapport au information qu'on lui a fournit san avoir a reloader le mesh en question
Hors ligne
Merci pour la réponse ultra rapide!
Mais alors à quoi correspond chaque node ? Enfin, qu'est ce que ça veut dire en terme de collisions d'avoir un node en (x=3,y=1,z=654) par exemple ?
Hors ligne
un node est "un objet"
un node sous irrlicht(ISceneNode) et la classe de base, Toute les classe d'objet 3D sous irrlicht (ICubeSceneNode, ImeshSceneNode, ...) dérive et hérite de ISceneNode qui contient les membre de base (setPosition ,setScale, remove, ...)
avoir un node en x=3,y=1,z=654 veut dire qu'on a placez un cube, un mesh, ....
sous irrlicht on le recupere avec Scene1Mesh[1] = MeshEnMemoire->getMeshByIndex(0)
et irrlicht calcule la collison a partir de la boudin box du node qui est égal a = taille du node * scale du node
Hors ligne
Pages: 1