Question

Je suis mise en œuvre d'un petit jeu et je suis mal à obtenir la physique fonctionne correctement. Dans ce jeu, il y a une bille (un cercle qui se déplace d'une trame à, et peuvent changer de rayon) et plusieurs parois (segments de ligne qui changent aussi et se déplacent d'une trame à). Je peux détecter les collisions correctement, et faire rebondir la balle dans la direction correcte est pas de problème.

Des difficultés surgissent dans des situations où la balle croise une ligne dans un cadre, puis croise à nouveau dans la trame suivante, ce qui provoque un double rebond. Je pouvais déplacer la balle le long de la normale de la ligne jusqu'à ce qu'il soit dans une position valide, mais cela provoque un comportement vraiment bizarre lorsque la ligne en question est frappé le long de son axe (imaginez une balle de ping pong tomber sur un cure-dent verticale et déplacement soudain de côté de sorte qu'il est sur un côté de la cure-dent ...). Il y a aussi quelques problèmes lorsque la balle croise plus d'une ligne dans une trame donnée (imaginez quatre lignes formant ensemble un rectangle et le ballon coupant le coin dudit rectangle) - quelle direction doit-elle rebondir? Dans quelle direction doit-il passer?

Je n'ai pas vraiment une question précise, mais je cherche des conseils ou des tutoriels utiles. Tous les 2D j'ai réussi à trouver jusqu'à présent que les intersections du rectangle de couverture.

J'utilise XNA si cela fait une différence.

Merci,
Cameron

Était-ce utile?

La solution

Ceci est un problème universel avec la plupart des bibliothèques de physique. Si vous Google pour « la profondeur de pénétration » (avec « physique », je suggère, ou vous pourriez trouver quelque chose tout à fait différent: D). Vous trouverez que même ces bibliothèques utilisent des astuces comme la vôtre

Il y a deux solutions à ceci:

Le seul pas cher est d'augmenter votre fréquence de mise à jour. Déplacer des objets dans 10 petites étapes au lieu d'un seul grand et vous aurez moins de pénétration, donc le fixer en compensant le ballon loin du mur sera moins visible.

La coûteuse est la détection de collision continue. Il existe des algorithmes qui peuvent vous dire, étant donné un mouvement et un objet stationnaire, le point précis dans le temps à la fois la volonté croisera. Google "intersection rectangle sphère balayé" pour trouver certains d'entre eux.

Vous pouvez ensuite mettre à jour comme celui-ci: la balle doit passer de 1,0 unités. Vérifier la collision. Collision se produit après 0,25 unités, donc déplacer la balle de 0,25 unités, calculer vecteur de réflexion (de sorte que le ballon rebondit sur le mur), répéter le contrôle de collision avec le reste de 0,75 unités (jusqu'à ce que vous connaissez la position finale de la balle). Cela permet d'éviter les pénétrations entièrement et même si votre balle se déplace si vite qu'il sauterait normalement sur le mur dans une seule mise à jour, la collision sera détectée.

Autres conseils

Il est généralement admis que, en raison de la timestep vos collisions croiseront passé un point acceptable entre les mises à jour.

En gros, il faut interpoler revenir au point entre le cadre et dernier courant où la collision est vraiment passé, replacer l'objet à ce moment-là, puis calculer les forces, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top