Detection de collision - By YQN

Author :  YQN

Bonjour,

Je suis un peu coincé, je cherche une méthode de détection de collision qui ne retourne pas de faux négatif lorsqu'un objet se déplace assez vite pour ne jamais se superposer à un autre objet qu'il n'est pas censé pouvoir traverser.

Par exemple un pixel se dĂ©place Ă  une vitesse de 4 pixels/frame. Sur son chemin se trouve un mur Ă©pais de 1 pixel. A la frame n il se trouve juste avant le mur et Ă  la frame n+1 il se retrouve de l'autre cĂŽtĂ© sans qu'il y ait eu intersection. Comment empĂȘcherle pixel de traverser le mur (qui ne traverse pas tout l'Ă©cran) ?

Merci d'avance pour toute aide !

Author :  Amaubi-wan

Bonjour,

J'avoue que c'est une question que je me pose souvent (puisque j'y ai déjà été confronté plusieurs fois), et une éventuelle solution serait de "tricher" : 

- Vous pouvez par exemple grossir votre pixel 4 fois, comme ça, mĂȘme avec une vitesse de 4 pix/frame, votre objet devra toucher au moins une fois chaque pixel sur son chemin. Seulement, cette solution est hyper contextuelle, avec l'Ă©cran de la Gamebuino, ce n'est peut-ĂȘtre pas trĂšs optimisĂ©. 

- Sinon, vous pouvez placer un "capteur" invisible qui se dĂ©placerait avec votre objet, et qui serait en fait la hitbox du pixel. Ce capteur doit Ă©videmment ĂȘtre assez gros pour, encore une fois, toucher chaque pixel du chemin empruntĂ© par votre objet, et il faut aussi faire attention Ă  bien la dĂ©bugger, parce qu'elle risque de toucher tout et n'importe quoi (d'ailleurs, si vous utilisez cette solution, pour bien vous rendre compte de ce que fait votre hitbox, je vous conseille de la colorer pendant les tests, puis de la rendre invisible lorsque vous avez fini de la coder).

-Enfin, vous pouvez aussi ralentir votre objet Ă  1 pix/frame...

Voilà, en général, j'utilise une de ces solutions. Si ce n'est pas assez clair ou que vous avez trouvé mieux, vous pouvez me le signaler (je suis preneur : ces solutions ont leurs limites, c'est du bricolage ;-) ), j'essaierai d'expliquer un peu mieux !

Author :  deeph

Sans code c'est difficile de pouvoir t'aider, mais à mon avis il faut vraiment dissocier la partie dessin et la partie gestion des déplacements, ce sont deux choses différentes.

Lorsque tu gÚres les déplacements, il suffit de tester toutes les collisions entre les coordonnées initiales et finales de ton point, en tout cas c'est comme ça que je ferais.

Author :  YQN

Merci, je pourrais essayer un mix des 2 premiers cheats, adapter la taille de la hit box à la vitesse (qui est variable), j'y avais pas pensé !

Author :  YQN

Merci, j'ai dissociĂ© les parties dessin et gestion des dĂ©placements (j'essaie d'appliquer ce que j'ai retenu du tuto de steph sur la POO et l'architecture MVC, mĂȘme si plus mon code Ă©volue plus je me rends compte que c'est flou dans ma tĂȘte), hier j'essayais de tester si les segments de droite mur et position d'origine-position aprĂšs dĂ©placement se coupaient, sans succĂšs, ce qui revient un peu Ă  ce que tu as suggĂ©rĂ©, mais je n'avais pas pensĂ© Ă  le faire point par point, Ă©tant donnĂ© le petit nombre de pixels ça devrait pas ĂȘtre trop gourmand. Bon ça me fait 2 pistes Ă  tester merci les gars/filles.

Author :  Amaubi-wan

Si j'ai pu aider ne serait-ce qu'un peu, c'est un plaisir ! (je suis nouveau dans la communauté ^^')

Author :  clement

Hello,

j ai pas la solution mais des piste de recherche.

tu doit trouver l intersection entre deux segment !

ton premier segment est ton mur definit par [M,N]

le deuxieme segment est toon deplacement definit par ton point de depart et ton point d arrive [D,A]

Pour faire ce calcul il faut faire un peux de math ;)  mais mon niveau en math n est pas suffisant pour faire ce genre d'explication.

je te conseil plutot de chercher sur goggle 

si tu trouve le point d intersection entre ces deux segment tu sera capable de savoir quel distance tu a parcouru jusqu'au mur et calculer ton rebond



Author :  jicehel

AB c'est le mur

n c'est sa normale avec |n|=1

OD la trajectoire sans la collision

C la collision

D' le rebond

Maintenant :

il y a collision si dot( O, n ) - dot( A, n ) et dot( D, n ) - dot( A, n ) sont de signe différent.

si c'est le cas, tu peux calculer C puis tu peux alors avoir le vecteur CD'', avec |CD|=|CD''|

Enfin, CD' = 2 * n * dot( CD'', n ) - CD''

Finalement D' = C + CD'


Je ne suis pas spĂ©cialiste mais tu as ce tutos qui explique bien les collisions: https://openclassrooms.com/fr/courses/1374826-theorie-des-collisions/1375352-formes-plus-complexes qui fait suite Ă  https://openclassrooms.com/fr/courses/1374826-theorie-des-collisions/1374988-formes-simples. Une fois dessus tu as Ă©galement une suite mais qui n'a je pense pas d'intĂ©rĂȘt pou ton cas.

J'espĂšre que tu y trouveras ton bonheur.