il y a 5 ans
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 !
NEW il y a 5 ans
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 !
NEW il y a 5 ans
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
il y a 5 ans
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.
NEW il y a 5 ans
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.
NEW il y a 5 ans
Si j'ai pu aider ne serait-ce qu'un peu, c'est un plaisir ! (je suis nouveau dans la communauté ^^')
NEW il y a 5 ans
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
NEW il y a 5 ans
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.