Déplacement d'objets entrant en collision lors de l'utilisation de l'évitement de collision non aligné (direction)

9

J'ai du mal à éviter les collisions non alignées pour ce que je pense être un cas rare. J'ai réglé deux objets pour qu'ils se rapprochent, mais avec un léger décalage, donc l'un des objets se déplace légèrement vers le haut et l'un des objets se déplace légèrement vers le bas.

Dans mon algorithme de direction d'évitement de collision non aligné, je trouve les points sur la ligne avant de l'objet et la ligne avant de l'autre objet où ces deux lignes sont les plus proches. Si ces points les plus proches se trouvent dans une distance d'évitement de collision, et si la distance entre eux est inférieure aux deux rayons des deux sphères limites de l'objet, alors les objets doivent s'éloigner dans la direction appropriée.

Le problème est que dans mon cas, les points les plus proches sur les lignes sont calculés pour être vraiment très éloignés du point de collision réel. En effet, les deux lignes avant de chaque objet s'éloignent l'une de l'autre lorsque les objets passent. Le problème est qu'à cause de cela, aucune direction n'a lieu et les deux objets entrent en collision partiellement.

Capture d'écran des lignes avancées de l'objet.

Quelqu'un a-t-il des suggestions sur la façon de calculer correctement le point de collision? Peut-être en tenant compte de la taille des deux objets?

James Bedford
la source
Notez que dans la capture d'écran, les lignes vertes, rouges et bleues ne sont que les axes du monde 3D.
James Bedford

Réponses:

6

C'est de loin le meilleur article de détection de collision de balle à balle que j'ai rencontré.

Leçons de la salle de billard: détection rapide et précise des collisions entre cercles ou sphères

Adam Harte
la source
Je sais comment faire un test de collision sphère-sphère. Mon problème est d'essayer de trouver la position où cette collision se produira à l'avenir. Merci.
James Bedford
@James cet article résoudra vos problèmes. Regardez la page 2 et vous pouvez utiliser un nombre arbitrairement élevé pour la "vitesse" sur l'une de vos sphères pour déterminer le point de collision "dans le futur".
Tetrad
Ok - désolé de ne pas l'avoir vérifié, ça a l'air plutôt bien! Je devrai vous revenir une fois que je l'aurai lu. Merci :)
James Bedford
1
Puis-je simplement préciser qu'à la page 2 sous la section "Tir de banque: Collision entre deux cercles en mouvement", cela signifie que vous devez utiliser la différence entre la vitesse des deux cercles dans l'algorithme au lieu de la vitesse du premier cercle? (La vitesse du deuxième cercle n'est pas utilisée dans la version stationnaire de l'algorithme.) Ce bit n'était pas si clair pour moi. Merci.
James Bedford
0

Vous ne voulez pas trouver le point le plus proche.

Vous voulez trouver le point sur les lignes où la distance est égale aux rayons combinés des deux sphères.

AttackingHobo
la source
Ah ok! Savez-vous comment je peux comprendre cela mathématiquement ..?
James Bedford
0

Si je comprends bien votre question, vous pouvez simplement utiliser un test d'intersection Sphère vs Sphère, comme l'a suggéré AttackingHobo.

Le calcul pour faire un tel test est le suivant (corrigez-moi si je me trompe, ça fait longtemps). En outre, cela considère que vos sphères ont chacune un centre et une variable de rayon.

La formule de vérification ressemble à ceci:

distanceOfSpheres <= sumOfRadii^2

Vous avez une intersection sphère vs sphère. C'est assez simple, voyons à quoi ça ressemble dans le code!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

Encore une fois, je pense que c'est la bonne réponse que vous cherchez. Si quelqu'un sait que c'est mal, corrigez-moi, car cela fait un moment que je n'ai pas fait ce calcul.

joelretdev
la source
Je sais comment faire un test de collision sphère-sphère. Mon problème est d'essayer de trouver la position où cette collision se produira à l'avenir. Merci.
James Bedford
0

Ok, j'espère que cela a du sens ... Obtenez les vecteurs des boules et calculez leur point de collision, appelez cela p1. Trouvez l'angle entre les 2 vecteurs, appelez cela a1. À a1 / 2 tracez une ligne, celle-ci sera exactement au milieu en degrés entre les deux vecteurs. Vous avez besoin de l'emplacement sur cette ligne où sin (a1 / 2) = (radius1 + radius2) / 2. Si cette image est visualisée dans ma tête à droite, c'est là que la collision se produit. Désolé si c'est faux ... il est tard.

Sam
la source