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.?
Réponses:
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?
la source
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.
la source
É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)
la source
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.
la source