Gestion des collisions

cs_DarklordBioopo Messages postés 8 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 février 2006 - 2 févr. 2006 à 21:21
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007 - 5 avril 2006 à 09:22
Bonjour,

Je voudrais savoir comment faire pour avoir une gestion des collisions avec des boites englobantes.
Pour le moment mon jeu ne gere les collisions qu'avec les positions des mesh, et c'est pas terrible.
si quelqu'un a un tutorial ou s'il veut bien me donner les bases.

merci

6 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
3 févr. 2006 à 01:17
Les boites englobantes AABB (axis aligned bounding boxes) ou OBB (oriented bounding boxes) te permettent de dire si 2 meshes ont des chances d'être en collision, mais pas s'ils sont réellement en collision.

Le plus simple est la AABB. C'est une boite dont les axes sont ceux du repere de la scene. A chaque boucle, tu calcules la boite AABB qui englobe le mesh.
Tu boucles sur les x y et z des vertices de ton mesh et du fait grossir petit à petit la AABB.

Tester si des AABB sont en collision est facile, tu compares les sommets d'une AABB avec les sommets de l'autre:
xminA > xmaxB pas de collision
yminA > ymaxB pas de collision
zminA > zmaxB pas de collision
xminB > xmaxA pas de collision
yminB > ymaxA pas de collision
zminB > zmaxA pas de collision

Qu'entends-tu par "gere les collisions qu'avec les positions des mesh" ?
cs_DarklordBioopo Messages postés 8 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 février 2006
3 févr. 2006 à 06:48
C'est a dire que je prend la position des meshs

vPosition.x et vPosition.z

et je test si il est inferieur a la position de l'autre.
ex :

if(vPositionObjetA.z <= vPositionObjetB.z + 10.0f && vPositionObjetA.x <= vPositionObjetB.x + 30.0f && vPositionObjetA.x >= vPositionObjetB.x - 10.0f)
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
3 févr. 2006 à 12:32
Nan, tu approximes les meshes par une unique boite toute simple dont les axes sont colinéaires à ceux du repère du monde.
Ce n'est donc pas forcement la boite la plus petite qui englobe le mesh telle qu'on l'imaginerait.

Dès que ton mesh a bougé, il faut remettre à jour sa boite englobante AABB.

Une boite englobante est formée de 8 points, mais définie avec 6 valeurs: xmin, ymin, zmin, xmax, ymax, zmax, en gros les 2 points extrêmes appartenant à la grande diagonale "montante".

Tu mets les 2 points de la boite englobante sur le premier sommet de ton mesh, puis tu fais une boucle sur chaque sommet du mesh.
Si le x d'un sommet est plus petit que le xmin de la boite, x->xmin.
Si le x d'un sommet est plus grand que le xmax de la boite, x->xmax.
...idem pour y et z.

Voila, tu as ta AABB.

Pour tester les collisions entre 2 AABB nommées A et B, si xminA est la valeur xmin de la boite A, xmaxA la max, etc...

xminA > xmaxB => pas de collision entre les boites => pas de collision entre les meshes
yminA > ymaxB => pas de collision entre les boites => pas de collision entre les meshes
zminA > zmaxB => pas de collision entre les boites => pas de collision entre les meshes
xminB > xmaxA => pas de collision entre les boites => pas de collision entre les meshes
yminB > ymaxA => pas de collision entre les boites => pas de collision entre les meshes
zminB > zmaxA => pas de collision entre les boites => pas de collision entre les meshes

Quelques liens sympas.
http://www.toymaker.info/Games/html/collisions.html
http://www.nofrag.com/2004/oct/23/14529/
cs_DarklordBioopo Messages postés 8 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 février 2006
4 févr. 2006 à 08:18
Merci, mais je ne sais pas comment creer une bounding box, peux tu m'aider stp?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
4 févr. 2006 à 10:53
struct SBoundingBox
{
D3DXVECTOR3 vec3Min;
D3DXVECTOR3 vec3Max;
};

Tu ajoutes un objet aabbBoundingBox de SBoundingBox à chacun de tes objets dont tu veux gérer les collisions.


si tes points sont sous dans un tableau de la forme:
pSommets = new D3DXVECTOR3[nbSommets];

Alors tu construits ta bounding box ainsi:

aabbBoundingBox.vec3Min = pSommets[0];
aabbBoundingBox.vec3Max = pSommets[0];
for (int i=1; i<nbSommets; i++)
{
if (aabbBoundingBox.vec3Min.x > pSommets[i].x) aabbBoundingBox.vec3Min.x = pSommets[i].x;
if (aabbBoundingBox.vec3Min.y > pSommets[i].x) aabbBoundingBox.vec3Min.y = pSommets[i].y;
if (aabbBoundingBox.vec3Min.z > pSommets[i].x) aabbBoundingBox.vec3Min.z = pSommets[i].z;

if (aabbBoundingBox.vec3Max.x < pSommets[i].x) aabbBoundingBox.vec3Max.x = pSommets[i].x;
if (aabbBoundingBox.vec3Max.x < pSommets[i].y) aabbBoundingBox.vec3Max.y = pSommets[i].y;
if (aabbBoundingBox.vec3Max.x < pSommets[i].x) aabbBoundingBox.vec3Max.z = pSommets[i].z;
}



Et apres pour tester approximativement les collisions entre 2 meshes:

bool Collision(CMesh *mesh1, CMesh *mesh2)
{
if (mesh1->aabbBoundingBox.vec3Min.x > mesh2->aabbBoundingBox.vec3Max.x) return false;
if (mesh1->aabbBoundingBox.vec3Min.y > mesh2->aabbBoundingBox.vec3Max.y) return false;
if (mesh1->aabbBoundingBox.vec3Min.z > mesh2->aabbBoundingBox.vec3Max.z) return false;

if (mesh2->aabbBoundingBox.vec3Min.x > mesh1->aabbBoundingBox.vec3Max.x) return false;
if (mesh2->aabbBoundingBox.vec3Min.y > mesh1->aabbBoundingBox.vec3Max.y) return false;
if (mesh2->aabbBoundingBox.vec3Min.z > mesh1->aabbBoundingBox.vec3Max.z) return false;

return true;
}

Je n'ai pas testé mais ça devrait marcher.

Bonne chance !
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
5 avril 2006 à 09:22
Sinon tu peux regarder sur :

http://www.newtondynamics.com
Moi je commence un peux a développer avec Ogre et plusieur wrapper existe comme :

OgreODE, nxOgre, OgreNewt, etc...

sa peux etre interessant de regrder, un jolie code exemple peut etre trouver ici :


http://www.sjbrown.co.uk/?code=buggy

Bon courage pour comprendre par contre, sa prend un peu de temps.

Voila, jespere que sa t'aidera un peux

cheer, barraq
Rejoignez-nous