Vous programmez un jeu vidéo, et vous vous intéressez aux collisions d'objets.
Est-ce-que mon personnage touche un ennemi ? Est-ce-qu'il touche le sol ? Est-ce-que mon curseur de souris, un viseur, touche un ennemi ? Tout ceci, ce sont des tests de collision. Les collisions sont un aspect fondamental de tout jeu d'action ou d'animation en général.
Nous considèrerons une ou plusieurs fonctions Collision qui prendront en paramètre 2 objets, ou un objet et un monde fait de sols et de murs. Et ces fonctions renverront simplement un booléen, ayant donc pour valeur oui ou non, selon si ça touche ou non.
Toute la gestion des collisions s'appuiera sur ces fonctions.
Selon votre jeu, selon vos besoins, les fonctions de collisions seront différentes, mais renverront toujours "oui" ou "non".
Comment implémenter ces fonctions de collision en fonction de vos besoins ? C'est la raison d'être de ce tutoriel, qui vous présentera plusieurs méthodes.
Les quelques fonctions d'exemple qui illustreront les différents cas seront codées en C, cependant facilement transcodables en d'autres langages.
Voici donc quelques techniques pour la gestion des collisions.
Plus tard, je rajouterai des chapitres pour parler d'autres techniques, comme les collisions par masque, le pixel perfect, le quadtree, l'octree, le BSP...
Si vous connaissez d'autres techniques de collisions auxquelles je n'ai pas pensé, envoyez moi un message privé (ne postez pas cela dans les commentaires du tuto).
Pas d'autres mots : génial! C'est clair, élégant, rapide et fonctionnel... que demander d'autre? En plus ca sert pour une foultitude de choses autre que les collisions : je m'en sert actuellement dans un petit moteur à raycasting (comme Doom), et ca marche parfaitement!
Super tuto qui ma fait avancer dans mon projet.
Pour ceux qui sa intéresse, une méthode de collision 3D pour pouvoir retourner la coordonnée qui à provoqué la collision et la restaurer.
// Appelle de la fonction, je passe les coordonnées déplacé + les coordonnées avant le déplacement.switch(ListeDesForme.GetSpec(i)->CollisionDirection(x,y,z,last_x,last_y,last_z)){caseCOLLISION_X:x=last_x;break;caseCOLLISION_Z:z=last_z;break;caseCOLLISION_Y:y=last_y;break;caseCOLLISION_XYZ:x=last_x;y=last_y;z=last_z;break;}// La méthodeintCube::CollisionDirection(doubleX,doubleY,doubleZ,doublelast_X,doublelast_Y,doublelast_Z){doublecoff=_size+0.2;if(((_x+coff)>X&&(_x-coff)<X)&&((_z+coff)>Z&&(_z-coff)<Z)&&((_y+coff)>Y&&(_y-coff)<Y)){if(!((_x+coff)>last_X&&(_x-coff)<last_X))// vérifie si en restaurant X on est toujours en collisionreturnCOLLISION_X;if(!((_y+coff)>last_Y&&(_y-coff)<last_Y))returnCOLLISION_Y;if(!((_z+coff)>last_Z&&(_z-coff)<last_Z))returnCOLLISION_Z;returnCOLLISION_XYZ;// si il y a insertion par un sommet (quasi impossible)}}
Nb: COLLISION_X,... sont de simple #define COLLISION_X 5
Les maths c'est chaud.Il y a des subtilités qui m'échappent dans certaines formules qui sortent brusquement du bois.Mais ce n'est pas un cours de maths malheureusement (ou heureusement).
Merci c'est de l'excellent travail.