Détection de collision

General

YQN

5 years ago

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 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 !

Amaubi-wan

NEW 5 years ago

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 !

YQN

5 years ago

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é !

deeph

NEW 5 years ago

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.

YQN

5 years ago

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.

YQN

NEW 5 years ago

Amaubi-wan Amaubi-wan

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é !

Amaubi-wan

5 years ago

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

YQN

NEW 5 years ago

deeph deeph

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.

Amaubi-wan

NEW 5 years ago

YQN YQN

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

clement

NEW 5 years ago

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



jicehel

NEW 5 years ago

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.