Objetos en movimiento que colisionan cuando se usa para evitar colisiones no alineadas (dirección)


9

Tengo problemas para evitar colisiones sin alinear por lo que creo que es un caso raro. He configurado dos objetos para que se muevan uno hacia el otro, pero con un ligero desplazamiento, por lo que uno de los objetos se mueve ligeramente hacia arriba y uno de los objetos se mueve ligeramente hacia abajo.

En mi algoritmo de dirección para evitar colisiones no alineado, encuentro los puntos en la línea de avance del objeto y la línea de avance del otro objeto donde estas dos líneas son las más cercanas. Si estos puntos más cercanos están dentro de una distancia de evitación de colisión, y si la distancia entre ellos es menor que los dos radios de las esferas de delimitación de los dos objetos, entonces los objetos deben alejarse en la dirección apropiada.

El problema es que, en mi caso, se calcula que los puntos más cercanos en las líneas están muy lejos del punto de colisión real. Esto se debe a que las dos líneas hacia adelante para cada objeto se alejan entre sí a medida que pasan los objetos. El problema es que debido a esto, no se realiza la dirección y los dos objetos chocan parcialmente.

Captura de pantalla de las líneas de reenvío de objetos.

¿Alguien tiene alguna sugerencia sobre cómo puedo calcular correctamente el punto de colisión? ¿Quizás teniendo en cuenta de alguna manera el tamaño de los dos objetos?


Tenga en cuenta que en la captura de pantalla, las líneas verde, roja y azul son solo los ejes del mundo 3D.
James Bedford

Respuestas:


6

Este es, con mucho, el mejor artículo de detección de colisión de bola a bola que he encontrado.

Lecciones de la sala de billar: detección rápida y precisa de colisiones entre círculos o esferas


Sé cómo hacer una prueba de colisión esfera-esfera. Mi problema es tratar de encontrar la posición donde ocurrirá esta colisión en el futuro. Gracias.
James Bedford

@ James ese artículo resolverá tus problemas. Mire la página 2 y puede usar un número arbitrariamente alto para la "velocidad" en una de sus esferas para determinar el punto de colisión "en el futuro".
Tetrad

Ok, lo siento por no echarle un vistazo, ¡se ve bastante bien! Tendré que responderte una vez que lo haya leído. Gracias :)
James Bedford

1
¿Podría aclarar que en la página 2, en la sección "Disparo de banco: colisión entre dos círculos en movimiento", significa que debe usar la diferencia entre la velocidad de los dos círculos en el algoritmo en lugar de la velocidad del primer círculo? (La velocidad del segundo círculo no se usa en la versión estacionaria del algoritmo). Este bit no fue tan claro para mí. Gracias.
James Bedford

0

No quieres encontrar el punto más cercano.

Desea encontrar el punto en las líneas donde la distancia es igual a los radios combinados de ambas esferas.


Ah ... ok! ¿Sabes cómo puedo resolver esto matemáticamente ...?
James Bedford

0

Si entiendo su pregunta correctamente, simplemente puede usar una prueba de intersección Esfera vs Esfera, como ha sugerido AttackingHobo.

La matemática para hacer tal prueba es la siguiente (corrígeme si me equivoco, ha pasado un tiempo). Además, esto está considerando que sus esferas tienen un centro y una variable de radio cada una.

La fórmula para verificar es algo como esto:

distanceOfSpheres <= sumOfRadii^2

Tienes una intersección esfera vs esfera. Esto es bastante simple, ¡veamos cómo se ve en el código!

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

Una vez más, creo que esta es la respuesta correcta que puede estar buscando. Si alguien sabe que esto está mal, corrígeme, ya que ha pasado un tiempo desde que hice estos cálculos.


Sé cómo hacer una prueba de colisión esfera-esfera. Mi problema es tratar de encontrar la posición donde ocurrirá esta colisión en el futuro. Gracias.
James Bedford

0

Ok, espero que esto tenga sentido ... Obtenga los vectores de las bolas y calcule su punto de colisión, llame a esto p1. Encuentre el ángulo entre los 2 vectores, llame a esto a1. En a1 / 2 dibuje una línea, esto estará en el medio exacto en grados entre los dos vectores. Necesita la ubicación en esta línea donde sin (a1 / 2) = (radio1 + radio2) / 2. Si esta imagen se visualiza en mi cabeza derecha, aquí es donde ocurre la colisión. Lo siento si esto está mal ... es tarde.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.