Evitación de colisiones en 3D: encontrar el vector de velocidad actualizado (fuera de los conos de "velocidades de colisión")

8

Estoy tratando de comprender e implementar el mecanismo de un sistema totalmente en 3D para evitar colisiones (comportamiento de dirección) para el movimiento de vuelo (seis grados de libertad), actualmente enfocado en sortear obstáculos estáticos (todo con la forma de una esfera).

Sin embargo, no entiendo cómo descifrar el nuevo vector de velocidad del agente en movimiento. La siguiente figura ilustra la escena. El agente móvil (verde) tiene que dirigir tres objetos estáticos (azul). La línea roja representa el vector de velocidad inicial inicial.

ingrese la descripción de la imagen aquí

Tenga en cuenta que también hay tres conos blancos / semitransparentes. Estos representan los "vectores de velocidad prohibidos" con respecto a cada obstáculo. Significa, el conjunto de vectores de velocidad que, si se usan como los nuevos vectores delanteros del agente, harían que el agente chocara con uno o más de los obstáculos (también tenga en cuenta que el radio de cada cono es igual al radio del obstáculo dado más el radio del agente, para permitir un desplazamiento para que el jugador pueda maniobrar).

Para descubrir el nuevo vector adelantado del agente en movimiento en dicho entorno 3D, considerando los tres obstáculos, un enfoque ingenuo sería simplemente portar a 3D la solución clásica explicada en este artículo a menudo citado y ejemplificada por la siguiente imagen 2D:

ingrese la descripción de la imagen aquí

Allí, una nueva velocidad (flecha naranja) simplemente se calcula normalizando la distancia mínima (flecha negra) entre la velocidad original y el centro del obstáculo y luego multiplicando dicha normal por la suma entre el radio del obstáculo y el radio del agente de mudanzas Luego, un promedio de las nuevas velocidades calculadas para cada uno de los obstáculos daría la velocidad final total.

En muchos casos, eso es suficiente. Sin embargo, eche un vistazo a los siguientes casos (ejemplificados en 2D para facilitar la visualización):

ingrese la descripción de la imagen aquí

En todos ellos, el enfoque ingenuo dará lugar a una colisión. En ayb, la nueva velocidad final coincidirá con la velocidad original (flecha roja) y el agente en movimiento avanzará a pesar de estar parcial o totalmente bloqueado. En c) yd), la nueva velocidad (flecha naranja) seguirá teniendo la misma consecuencia.

Entonces, mi pregunta es: ¿cuál es la forma más eficiente desde el punto de vista computacional de descubrir el nuevo vector adelantado del agente en movimiento en dicho entorno 3D, teniendo en cuenta los tres obstáculos, de manera que se evite la colisión? O, en otras palabras, el nuevo vector adelantado que:

1) no está dentro de ninguno de los conos;

2) es el más cercano posible al vector de avance original (línea roja en la imagen).

PD: Preferiblemente, no estoy buscando una biblioteca, estoy buscando aprender cómo hacerlo.

Louis15
fuente

Respuestas:

1

No creo que haya una manera eficiente de resolver el problema exactamente, pero así es como trataría de abordarlo.

Primero, usaría volúmenes delimitadores alrededor de cada objeto, en lugar de los objetos mismos. Sin embargo, cada objeto puede ser aproximado por la unión de más de un volumen delimitador.

La solución más simple sería calcular un único volumen delimitador que contenga todos los objetos que necesita evitar y calcular el cono a partir de ese volumen.

Esto podría no ser lo suficientemente bueno si los objetos no están relativamente cerca uno del otro. Es posible que desee hacer algunos clústeres de manera que dos objetos pertenezcan al mismo clúster si no es posible, o al menos no es trivial pasar entre ellos. Calcule el grupo de objetos considerando sus volúmenes delimitadores más el tamaño del volumen delimitador del jugador más un margen extra. Puede usar algo como esto:

http://lab.polygonal.de/?p=120

Una vez que tenga los grupos, busque el más cercano y calcule el cono para evitar chocar con él. Debido a la forma en que se crearon los grupos, si dirige lo suficiente para evitar golpear un grupo, no golpeará a otro.

Además, puede crear una estructura recursiva al calcular los clústeres que lo ayudarán a encontrar el clúster más cercano.

Hay algunas cosas con las que puedes jugar. Por ejemplo, en lugar de elegir el grupo más cercano, elija los dos grupos más cercanos y calcule un solo cono que los evite a ambos. Además, puede probar otros volúmenes delimitadores que no sean esferas.

Gato
fuente
0

Hay dos formas de abordar esta pregunta que puedo ver. Primero, si simplemente desea encontrar una manera de dirigir, entonces solo necesita implementar pathfinding (esto me parece bastante útil ). Ese sería el final de eso (y es la respuesta práctica correcta a esta pregunta), pero creo que tiene más curiosidad acerca de una solución matemática a su problema.

Para abordar eso, veamos un problema equivalente. Tome una porción 2D de su escena "por delante" de su piloto de un avión que es normal al vector original. Lo que obtendrá es un punto que representa su vector original y una serie de elipses que son las proyecciones 2D de sus conos de oclusión. Ahora lo que quieres hacer es encontrar el punto más cercano a tu punto original (llamémoslo P) que se encuentra en el exterior de las elipses no superpuestas. Resulta que este es un problema bastante difícil de resolver. Hay 3 pasos:

  • Calcule los puntos de intersección de todas sus elipses
  • Encuentra cualquier agujero en la unión de todas tus elipses
  • Calcule el punto más cercano a Ptodas sus elipses fuera de la unión (que puede estar dentro de un agujero)

De acuerdo, todo esto requiere multiplicadores de Lagrange y verificación de ángulo y algunas otras cosas realmente complicadas para resolver. Veamos otras opciones. Si transformamos nuestro problema en un espacio angular, vemos que lo que realmente queremos hacer es encontrar la distancia mínima entre un punto y múltiples círculos proyectados sobre la superficie de una esfera. En geometría diferencial, esto a menudo se llama 2 esferas y es útil aquí. Entonces, primero, necesitamos encontrar la distancia entre dos puntos en la superficie de la esfera, que utilizaremos la métrica de 2 esferas para encontrar. Afortunadamente, es bastante fácil: ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)donde nos mantenemos Rconstantes a medida que el radio de nuestra esfera de 2 se proyecta en 3 espacios. Viniendo de la física, thconsidero que el ángulo es positivo zy phel ángulo positivo xconsSiendo la distancia.

¿Qué logra hacer esto? Nos permite eliminar el uso de multiplicadores de Lagrange para minimizar la distancia, y nos permite trabajar en coordenadas "nativas" (ya que definimos nuestros conos en términos de un ángulo de oclusión). Entonces ahora necesitamos encontrar el radio de nuestras proyecciones de cono. Tomemos un cono por ahora y llamemos al ángulo que lo define a. El radio de la proyección es entonces simplemente R*a. Eso fue bastante fácil: ¿qué otra cantidad necesitamos saber sobre los conos? Necesitamos conocer el centro de la proyección, que se define por el vector de apariencia del actor. Primero convertimos x, yy zen coordenadas esféricas donde sabemos que estamos a distancia R, y resolvemos thy ph, lo que podemos hacer simplemente conectando nuestras fórmulas de conversión:th = acos(z/R)y ph = atan2(y/x)(usar atan2aquí para explicar las ambigüedades del cuadrante de arctangent). El proceso es el mismo para encontrar la posición de su vector original en coordenadas esféricas.

Entonces el problema se ha simplificado. Sin embargo, el problema sigue siendo bastante difícil de resolver, pero ahora solo necesita preocuparse por círculos y puntos en lugar de elipses y puntos o ángulos y vectores. El resto del proceso es más bien de procedimiento. Esencialmente, necesita encontrar un área delimitada formada por sus círculos, para lo cual existen múltiples soluciones. Presentaré un método que puede no ser el mejor, pero funcionará.

Primero compararía la suma de los radios de todos los pares de círculos y la distancia entre los centros, y luego, si suman es mayor que la distancia del centro, los igualaría y resolvería thyphpara encontrar las intersecciones. Usted sabe que cada par de intersecciones describe "ángulos prohibidos" para el círculo en cuestión, que almacenaría como una matriz de ángulos de punto de intersección (desde el centro del círculo) para cada círculo que se cruza con este, lo que es importante " fusionar "los rangos que se superponen a medida que los agrega a la matriz para que la siguiente parte funcione correctamente. Luego, encuentra el punto más cercano en el borde del círculo al punto original (que es tan simple como dibujar una línea a través del punto central del círculo y el punto original, luego encuentra la ubicación en la línea en el radio del círculo lejos del centro). Luego recorra su matriz almacenada y pruebe si ese ángulo está en el rango de cada ángulo prohibido. Si es así, seleccione el borde más cercano. Ese es el punto más cercano al exterior descrito dentro de este círculo. Repita el proceso para todos los círculos (se puede hacer algo de optimización en el proceso de selección; en realidad no necesita calcular esto para cada círculo). Ahora compare todas sus distancias más cortas, encuentre las más pequeñas, y esa es su respuesta, descrita en los ángulosthy ph. Recuerde que la distancia se describe con la métrica de 2 esferas mientras realiza este cálculo. Como no te importa la esfera en la que está todo esto, solo los ángulos, puedes establecer R=1y hacer estos cálculos en la esfera de la unidad.

Esta es la forma más simple en que podría pensar hacer esto. No estoy seguro de que sea la forma más simple, pero funcionaría bastante bien. Prácticamente para un juego, sin embargo, solo quieres implementar pathfinding.

dannuic
fuente