Quelle est la façon la plus efficace de trouver le point d'intersection d'un missile et d'un terrain bitmap?


10

Suite à ma question précédente sur la recherche de la pente d'un terrain bitmap 2D, je dois maintenant connaître la meilleure façon de trouver le point sur le terrain 2D que le missile a touché. Évidemment, je peux voir si des pixels sous le missile croisent le terrain, mais disons qu'il s'est déplacé assez profondément dans le terrain.

Quelle est la meilleure façon de prendre du recul pour trouver où elle est d'abord entrée en collision? Je pourrais reculer de X pixels à la fois vers la position précédente du missile, mais quelle serait une bonne valeur de X? Et existe-t-il un moyen plus intelligent? Peut-être bouger la moitié de la distance, puis un quart, etc.?


Le phénomène que vous décrivez est communément appelé "tunneling", et la meilleure façon de le gérer est d'introduire un test de balayage - comme TetraD et JasonD l'ont mentionné ci-dessous.
jpaver

dire simplement "test de balayage" ne m'aide pas vraiment. Comment faire avec un terrain bitmap?
Iain

La suggestion de Jason me semble la meilleure: un pixel à la fois.
jpaver

Réponses:


3

Pour les tests de collision, vous ne devriez pas faire de tests statiques tick-by-tick, vous devriez faire des tests de traces / balayage.

Il existe une liste exhaustive de différentes formules pour différents types de primitives ici: http://www.realtimerendering.com/intersections.html

C'est, bien sûr, en supposant que vous pouvez décomposer votre terrain en une sorte d'ensemble de primitives que vous pouvez tester (c'est-à-dire des segments de ligne). Il existe différentes façons de procéder.

Voir aussi cette question (seulement légèrement liée): Qu'est-ce qu'un bon algorithme pour détecter une collision entre des sphères en mouvement?


Je pensais à un terrain bitmap destructible comme dans Worms. Pourriez-vous générer dynamiquement des primitives à partir d'une image bitmap ou serait-ce trop fou?
Iain

1
Je suis sûr que vous le pourriez, mais il pourrait être plus facile / plus rapide de faire des tests pixel par pixel pour un bitmap arbitraire.
Tetrad

AVEC UN QUADTREE !! (donc ça ne prend pas éternellement)
bobobobo

3

La recherche binaire n'aidera pas si vous avez de minces décors et des projectiles se déplaçant rapidement - vous pourriez les manquer.

Je pense que votre meilleure option est de balayer une ligne à travers l'avant du projectile le long du chemin qu'il prend, pixel par pixel. Vous pouvez effectuer une vérification de délimitation d'abord sur l'ensemble du volume pour éviter de le faire à chaque étape.


Qu'est-ce que la recherche binaire?
Iain

1
Désolé - la recherche binaire est plus ou moins ce dont vous parliez dans la question. Vous commencez au milieu et divisez l'espace de recherche par deux jusqu'à ce que vous convergiez sur la réponse. C'est optimal dans de nombreux cas, mais dans votre cas, cela ne fonctionnerait pas (vous pouvez ignorer complètement la bonne réponse).
JasonD

3

Étant donné qu'il est peu probable que le missile déplace une énorme quantité de pixels à chaque image (il ne serait pas fluide à l'écran), je ne vois aucune raison de ne pas simplement vérifier chaque pixel sur le chemin. L'algorithme de ligne de Bressenham est votre ami, et vous assure d'avoir également une copie locale de votre bitmap car vous ne voulez généralement pas accéder à la mémoire vidéo pour chaque pixel. Cela suppose que votre terrain bitmap est entièrement aléatoire (selon le terrain des vers destructibles). Si votre monde est basé sur des tuiles, vous pouvez ignorer toutes les tuiles que vous savez vides pour commencer, mais comme mentionné précédemment, à moins que vous n'ayez une énorme quantité de missiles à vérifier, je ne pouvais pas penser à une plate-forme qui en aurait besoin qui serait trop lente pour tester pixel par pixel, et vous n'aurez pas besoin de définir votre monde en primitives (un clone de vers rendrait cela difficile)


ouais je pensais à un terrain de type Worms. Pourriez-vous le diviser dynamiquement en tuiles, puis simplement marquer les tuiles vides à ne pas vérifier? S'il y avait beaucoup de missiles à la fois, cela accélérerait un peu les choses?
Iain

Alors, pensez-vous que je devrais avancer pixel par pixel, en vérifiant l'intersection, plutôt que de reculer?
Iain

Je pense que les trois réponses ont suggéré une recherche avancée. La vérification en arrière ne fonctionnera pas si la marche en avant fait sauter certains paysages.
JasonD

Oui, définitivement en avant.
Kaj

1

En plus des autres réponses, il y a certaines choses que vous pouvez faire pour accélérer cela si vous voulez faire un peu de comptabilité en ce qui concerne la "collecte" d'un tas de pixels en blocs "d'état similaire connu". Par exemple, vous pouvez stocker la hauteur de la pièce de terrain la plus élevée, vous pouvez donc tenir pour acquis que le missile ne frappera rien tant qu'il est au-dessus de cela. Vous pouvez également stocker la hauteur de l'espace "aérien" le plus bas, donc vous saurez que si le missile atteint cette altitude, il doit avoir touché quelque chose (bien qu'il soit préférable de l'utiliser comme contrôle de santé mentale). En allant plus loin, vous pouvez stocker des rectangles représentant des zones qui sont tout terrain et d'autres rectangles qui sont tous aériens, mais cela pourrait être plus de travail que de valeur.

En fin de compte, la meilleure méthode sera probablement de "stocker la hauteur de chaque colonne de terrain" et de calculer ensuite simplement la hauteur du missile à chaque étape de sa trajectoire. Je ne peux pas parler de jeux plus modernes, mais je crois que lorsque vous avez fait une "grotte" dans Scorched Earth, le terrain au-dessus de cette grotte est tombé directement, ne laissant aucun surplomb. Si vous voulez des surplombs, le travail sera un peu plus important, mais ce sera une extension de cette idée de base. (Astuce: faites d'abord fonctionner l'idée de base!)

Étant donné que votre terrain est vraisemblablement complètement arbitraire, il n'y a pas de raccourcis. Même si vous avez forcé votre terrain à être une spline ou quelque chose du genre, cela va être bouleversé une fois que vous commencez à le détruire et les tests d'intersection de splines linéaires sont itératifs et non parfaits ou exhaustifs et inutilement lents pour votre type de problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.