#1 

18-06-2008 14:00:27

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.113.116
Courriel

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


Hors ligne


#2 

19-06-2008 07:40:32

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.113.116
Courriel

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


Hors ligne


#3 

19-06-2008 08:57:23

wizad
Membres
Avatar de wizad
Date d'inscription:
Messages: 106
IP: 90.62.231.252
Courriel

OUUHOUUUHHHOUUUHHH

pardon wink
Sinon merci pour ce tuto ^^


Hors ligne


#4 

24-06-2008 09:28:31

BooBs
Membres
Date d'inscription:
Messages: 8
IP: 41.201.215.104
Courriel

Un grand thnX !!


Hors ligne


#5 

13-11-2008 15:28:36

Pitu
Membres
Date d'inscription:
Messages: 2
IP: 84.96.34.158
Courriel

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 !


Hors ligne


#6 

13-11-2008 15:32:18

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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


#7 

13-11-2008 15:40:14

Pitu
Membres
Date d'inscription:
Messages: 2
IP: 84.96.34.158
Courriel

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


#8 

13-11-2008 15:46:19

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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