2012-01-03 4 views
1

Je suis en train de jouer un peu et d'essayer de faire fonctionner certaines choses pour un projet ultérieur, mais j'ai un problème auquel je n'arrive pas à trouver de solution.Détection de collision et rebondissement

À l'heure actuelle, j'ai une détection de collision efficace et précise, mais le problème est de créer la physique. La physique est simple en ce moment, un objet a un vecteur pour sa direction et sa vitesse, quand il y a une collision, le vecteur est inversé. Le problème est que lorsque des objets se heurtent, ils se poussent l'un dans l'autre et finissent par inverser le vecteur pour toujours, ce qui provoque des résultats étranges. Par exemple. magiquement flottant vers le haut, ou semblant ignorer complètement la physique.

Quelqu'un peut-il m'aider?

EDIT: La détection se fait en séparant le théorème de l'axe et je n'ai pas mis de code car tout ce qui se passe réellement est une boucle pour vérifier les collisions, quand on trouve les vecteurs inversés. Comme je l'ai dit, la détection fonctionne très bien, je pense que mon problème est tel que Sibbo l'a dit en déplaçant les objets afin qu'ils ne se heurtent plus.

+2

Vous allez devoir poser des questions plus spécifiques et fournir un exemple de code concis pour que nous puissions vous aider. En ce moment, la question est trop vague. – Gray

Répondre

1

Je ne connais pas votre implémentation, mais lorsque vous détectez une collision, vous devez déplacer les objets afin qu'ils ne se touchent plus. Cela empêchera votre programme d'entrer dans une boucle de collision sans fin

+1

Voilà ce que je devais faire :) ty – SpaceFace

1

Écartez légèrement les objets (en dehors du seuil de collision) et inversez le vecteur vitesse. En supposant que vous utilisiez également un vecteur pour la position, modifiez simplement ses valeurs de sorte que les objets ne soient plus considérés comme en collision.

0

Chaque objet doit avoir une taille et quand ils rebondissent sur les bords les uns des autres, ils rebondissent sur une ligne qui bi-sec la ligne entre eux. Supposez-vous que tous les objets ont la même masse?

1

J'ai récemment écrit la physique pour un jeu de billard pour un projet universitaire (alors que ce n'est peut-être pas un code qui est conforme aux normes de l'industrie, il fait ce qu'il est censé faire); Ce que nous avons fini par faire pour éviter des boucles infinies de calcul des effets d'une collision identique était la suivante: nous stockions toutes les collisions dans une java.util.List et chaque fois que la collision suivante était calculée, nous vérifiions si les deux objets participaient à la collision. faisaient déjà partie de la dernière collision qui avait été calculée; si c'était le cas, cette paire d'objets était ignorée. Cela a un inconvénient: à l'inverse, vous n'introduisez pas d'inexactitudes en utilisant un mouvement de décalage (minimal) pour que les objets ne se touchent plus. Inconvénient, vous ne pouvez pas avoir deux collisions entre deux objets identiques l'un après l'autre (par exemple, vous ne pouvez pas avoir [(boule_1, boule_2); (boule_1, boule_2); ...], vous ne pouvez avoir quelque chose comme [(ball_1, ball_2); (ball_1, table); (ball_1, ball_2); ...] comme votre liste de collisions).