Collision avec map irrEdit

Proposé par hardcpp

le 18 June 2008 à 16h 00mn 27s

8601 visualisations



Vous avez fait une map avec irrEdit et vous voulez les collision(seulement avec les mesh)?

il suffit de faire sa:

declaration:

Code:

IAnimatedMesh *Scene1Mesh[20];
ISceneNode* Scene1Node[20];
IMeshCache *MeshEnMemoire;
ITriangleSelector *Colision[20];
int NbrColision;
IMetaTriangleSelector *MetaColisionTriangle;
ISceneNodeAnimatorCollisionResponse  *CameraAnimCollision;

après avoir charger la map:

Code:

MeshEnMemoire = smgr->getMeshCache();    //recuperation des mesh en memoire est celle charger dans le .irr
NbrColision = 3;    
Scene1Mesh[1] = MeshEnMemoire->getMeshByIndex(0);

ATTENTION
métez NbrColision au nombre de collision que vous voulez + 1

les scene node:

Code:

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:

Code:

         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:

Code:

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


#1 

19-06-2008 09:40:32

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

ji croie pas ya encore des fantôme peut sociable?

Hors ligne


#2 

19-06-2008 10:57:23

wizad
Abonné
Lieu: Caen
Date d'inscription: 30-09-2006
Messages: 106

OUUHOUUUHHHOUUUHHH

pardon wink
Sinon merci pour ce tuto ^^

Hors ligne


#3 

24-06-2008 11:28:31

BooBs
Petit nouveau
Date d'inscription: 24-06-2008
Messages: 8

Un grand thnX !!

Hors ligne


#4 

13-11-2008 16:28:36

Pitu
Petit nouveau
Date d'inscription: 13-11-2008
Messages: 2

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

Code:

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


#5 

13-11-2008 16:32:18

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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


#6 

13-11-2008 16:40:14

Pitu
Petit nouveau
Date d'inscription: 13-11-2008
Messages: 2

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


#7 

13-11-2008 16:46:19

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
80 invités en ligne
Aucun membre connecté
RSS Feed