Spostamento di oggetti in collisione quando si utilizza la funzione di prevenzione delle collisioni non allineata (sterzo)


9

Ho dei problemi con l'eliminazione delle collisioni non allineata per quello che penso sia un caso raro. Ho impostato due oggetti per spostarsi l'uno verso l'altro ma con un leggero scostamento, quindi uno degli oggetti si muove leggermente verso l'alto e uno degli oggetti si muove leggermente verso il basso.

Nel mio algoritmo di governo di evitamento delle collisioni non allineato sto trovando i punti sulla linea in avanti dell'oggetto e sulla linea in avanti dell'altro oggetto dove queste due linee sono le più vicine. Se questi punti più vicini si trovano entro una distanza di prevenzione delle collisioni e se la distanza tra loro è inferiore ai due raggi delle sfere di delimitazione dei due oggetti, gli oggetti devono allontanarsi nella direzione appropriata.

Il problema è che, nel mio caso, i punti più vicini sulle linee sono calcolati per essere molto lontani dal punto di collisione reale. Questo perché le due linee in avanti per ciascun oggetto si allontanano l'una dall'altra mentre gli oggetti passano. Il problema è che a causa di ciò, non si verifica alcuna sterzata e i due oggetti si scontrano parzialmente.

Schermata delle linee in avanti dell'oggetto.

Qualcuno ha qualche suggerimento su come posso calcolare correttamente il punto di collisione? Forse prendendo in qualche modo in considerazione la dimensione dei due oggetti?


Si noti che nello screenshot, le linee verde, rossa e blu sono solo gli assi del mondo 3D.
James Bedford,

Risposte:


6

Questo è di gran lunga il miglior articolo di rilevazione di collisione palla a palla che abbia mai incontrato.

Lezioni di biliardo: rilevamento rapido e accurato delle collisioni tra cerchi o sfere


So come eseguire un test di collisione sfera-sfera. Il mio problema è cercare di trovare la posizione in cui questa collisione accadrà in futuro. Grazie.
James Bedford,

@James quell'articolo risolverà i tuoi problemi. Guarda a pagina 2 e puoi usare un numero arbitrariamente alto per la "velocità" su una delle tue sfere per determinare il punto di collisione "in futuro".
Tetrad

Ok - scusa se non l'ho verificato, sembra piuttosto buono! Dovrò tornare da te una volta che l'ho letto. Grazie :)
James Bedford,

1
Potrei solo chiarire che a pagina 2 nella sezione "Colpo di banco: Collisione tra due cerchi in movimento", significa che dovresti usare la differenza tra la velocità dei due cerchi nell'algoritmo anziché la velocità del primo cerchio? (La velocità del secondo cerchio non viene utilizzata nella versione stazionaria dell'algoritmo.) Questo bit non era così chiaro per me. Grazie.
James Bedford,

0

Non vuoi trovare il punto più vicino.

Volete trovare il punto sulle linee in cui la distanza è uguale al raggio combinato di entrambe le sfere.


Ah ok! Sai come posso capirlo matematicamente ...?
James Bedford,

0

Se capisco correttamente la tua domanda, puoi semplicemente usare un test di intersezione Sfera vs Sfera, come suggerito da AttackingHobo.

La matematica per fare questo test è la seguente (correggimi se sbaglio, è passato un po '). Inoltre, questo sta considerando che le sfere hanno un centro e una variabile di raggio ciascuna.

La formula per il controllo è simile a questa:

distanceOfSpheres <= sumOfRadii^2

Hai un'intersezione sfera vs sfera. Questo è abbastanza semplice, vediamo come appare nel codice!

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;
}

Ancora una volta, penso che questa sia la risposta corretta che potresti cercare. Se qualcuno sa che questo è sbagliato, per favore correggimi, dato che è passato un po 'di tempo da quando ho fatto questo calcolo.


So come eseguire un test di collisione sfera-sfera. Il mio problema è cercare di trovare la posizione in cui questa collisione accadrà in futuro. Grazie.
James Bedford,

0

Ok, speriamo che abbia un senso ... Prendi i vettori delle palle e calcola il loro punto di collisione, chiama questo p1. Trova l'angolo tra i 2 vettori, chiama questo a1. A1 / 2 disegna una linea, questo sarà nel mezzo esatto in gradi tra i due vettori. È necessaria la posizione su questa linea in cui sin (a1 / 2) = (raggio1 + raggio2) / 2. Se questa immagine è visualizzata nella mia testa a destra, è qui che si verifica la collisione. Scusa se questo è sbagliato ... è tardi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.