2009-12-14 13 views
2

La plupart des algorithmes de détection de collision dans le billard utilisent une approche naïve, dans laquelle les positions des balles sont incrémentées puis contrôlées pour les collisions. Cette méthode ne fonctionne pas bien quand la vitesse est vraiment élevée parce que nous pouvons "sauter" des collisions.Comment pré-calculer les trajectoires dans un jeu de billard?

J'ai cherché un moyen de pré-calculer les trajectoires des balles dans un jeu de billard. Une fois que les trajectoires sont connues, je peux animer les balles jusqu'à ce qu'elles s'arrêtent de bouger. Et je n'ai pas à m'inquiéter de la vitesse, car les collisions sont mathématiquement détectées et résolues.

Savez-vous si quelqu'un a fait cela? Je ne veux pas réinventer la roue. Merci.

+0

Il existe des algorithmes très standard pour ce type de chose. Commencez avec quadtrees. –

+0

Les quadrats sont toujours une méthode de détection de collision en temps réel. Ma question est de savoir s'il existe une méthode pour détecter et résoudre toutes les collisions possibles avant que les balles commencent à bouger. –

+0

En supposant que vous êtes prêt à simplifier le modèle un peu, alors bien sûr, il pourrait y avoir. Cependant, il sera tout aussi imprécis (grâce aux simplifications) que la solution basée sur le timeseat, tout en étant beaucoup plus lent à fonctionner. En d'autres termes, quel est le but? –

Répondre

1

Commencez par quadtrees et réduisez votre intervalle d'échantillonnage. Si vos boules de billard bougent si vite qu'elles passent à travers d'autres balles, vous modélisez le jeu de façon incorrecte. Avez-vous déjà joué à un jeu de billard où les balles ont réellement bougé aussi vite?

Vous pouvez également

Entre deux pas de temps, le modèle de position précédente la balle et la position actuelle en tant que cylindre 2 dimensions. Si deux cylindres entrent en collision, diminuez le pas de temps et réessayez. De cette façon, vous obtenez des calculs généraux très rapides, et vous pouvez toujours gérer des vitesses très élevées.

1

La manière la plus simple est d'utiliser simplement l'approche "naïve" avec une taille de pas très fine, mais pas encore d'animer les boules.

1

Une solution que j'ai implémentée pour quelque chose de similaire consiste à utiliser des pas de temps variables. La mise en œuvre se déroule comme suit: vous disposez d'une méthode paramétrée dans le temps pour déterminer la position de la bille (à l'instant T plus le temps V variable); la valeur par défaut est de spécifier un V de 1.0. Dans votre calcul de la position mise à jour, vous pouvez effectuer une détection de collision; l'artefact naturel de détection de collision est un indicateur fractionnaire du moment où une collision se produit. Si cela se produit, réinitialisez vos positions pour l'itération courante, et soumettez à nouveau tous les mouvements avec le V fractionnaire, puis itérez sur le montant 1,0 - V.

Ceci fonctionne étonnamment bien, et a l'avantage d'être une implémentation relativement simple . Un point de préoccupation est que vous avez besoin de suffisamment de puissance CPU pour être capable de calculer des mouvements potentiellement plusieurs fois pendant une tranche de temps "naturelle" (c'est-à-dire, un cadre d'affichage, etc.). Cependant, comme ce type de calcul est assez facile pour les processeurs modernes, cela ne devrait pas poser de problème.

1

J'ai fait quelque chose de similaire il y a plusieurs années et j'ai décrit le mouvement des billes en fonction du temps. En utilisant cette méthode, j'ai été capable de trouver l'heure exacte de l'intersection pour deux balles. Chaque balle gardait une file d'attente prioritaire avec le plus petit temps d'intersection en tête de file d'attente, et les files d'attente étaient ajustées lorsqu'une collision se produisait. Cela a très bien fonctionné et était assez facile pour le premier passage, qui n'a pas eu d'accelleration aux balles. Plus tard (avec des maths plus difficiles), j'ai également été capable de l'étendre pour travailler avec friction ajouté.

Le principal inconvénient de cette méthode est que les calculs ont tendance à se produire tout à la fois, puis rien pendant un certain temps, au lieu d'être en mesure de faire un peu de travail à chaque image. Cela signifie que votre framerate ne sera pas stable. Cela n'a pas causé de problèmes perceptibles sur le matériel que j'utilisais il y a environ 8 ans. Même sur la pause, ou d'étranges cas plus ou moins impossibles comme plusieurs balles qui se touchent et se déplacent exactement dans la même direction quand elles frappent le mur, le creux serait dans le framerate, mais rien de notable.