2010-12-08 13 views
6

Estoy tratando de descubrir un algoritmo más rápido para probar si un conical surface alineado con el eje intersecta el volumen de un cuadro delimitador alineado con el eje.Superficie infinita del cono * Prueba de intersección AABB

El algoritmo actual he desarrollado es el siguiente:

cone, AABB, lines along 4 parallel edges, and intersection points

  • x = 0
  • Para cada uno de los 4 bordes paralelos de la AABB:
    • Intersect su línea con el cono
    • Si el punto de intersección está dentro de la AABB:
      • Volver cierto.
    • Si el punto de intersección está en un lado específico de la AABB:
      • x + = 1
  • Si x == 0 o x == 4 (todo el las intersecciones estaban en un lado de la AABB):
    • Devolver falso.
  • Devuelve verdadero.

¿Alguien puede pensar en uno más eficiente? Esto parece hacer mucho trabajo extra al computar cada intersección de línea.

EDIT:

encima algoritmo es malo, por ejemplo:

cone hits untested axis of box

El cono puede cortar un solo borde de la caja de manera que todas las intersecciones del eje de la línea son de una sola lado, por lo que el algoritmo anterior no funciona a menos que todos los bordes sean probados o los bordes a ser probados sean inteligentemente elegidos (¿quizás los bordes más cercanos al cono?).

EDITAR EDITAR: Vea a continuación mi propia respuesta para la solución que descubrí más tarde, que me parece casi óptima.

+1

Algo obviamente, es a menudo más rápido para comprobar una esfera de delimitación (en este caso, de la caja) primero. – sje397

+2

Además, ¿no sería posible que tu algoritmo fallara? P. Ej. si el punto del cono perfora solo una cara y no se cruzan los bordes de la caja? – sje397

+0

Entre otras razones (ver arriba), sí. –

Respuesta

2

encontré otro, solución posiblemente óptima:

Antecedentes: La ecuación para un derecho abertura del cono unidad a lo largo del eje -z + es x^2 + y^2 - z^2 = 0

Encuentre el máximo y mínimo de x^2 + y^2 - z^2 sobre el AABB. Sugerencia: para x^2, el mínimo es abrazadera (0, xmin, xmax)^2 y el máximo es máximo (xmin^2, xmax^2).

  • Si el intervalo resultante es completamente negativo, la caja está completamente dentro del cono.
  • Si el intervalo resultante contiene 0, el cuadro se cruza con la superficie del cono.
  • Si el intervalo resultante es completamente positivo, la caja está completamente fuera del cono.
+1

Algunas optimizaciones son posibles, como expandir los cálculos para hacer un escape anticipado solo calculando el límite superior o inferior, y usarlo para regresar completamente por dentro o completamente por fuera. De hecho, si solo se desea un resultado verdadero/falso, solo se requiere el cálculo del límite inferior. –

2

En cuanto a parece que no hay una prueba de intersección cono/AABB conocida. ¡Así que estás solo, me temo!

Puede comenzar con el artículo de David Eberly "Intersection of a Triangle and a Cone" y ver cuánto de eso se puede adaptar a su situación. (En el peor de los casos, un AABB se compone de 12 triángulos, pero espero que pueda hacerlo mejor que eso.)

+0

Espero que no te importe que hice referencia a tu enlace en mi respuesta. Si eso es un problema, lo moveré a un comentario en su lugar. – celion

+0

No, adelante. No podría molestarme en hacer la tarea yo mismo. –

+0

En el sitio al que se hace referencia hay una prueba de intersección entre el cono y el cuadro delimitador orientado, que de hecho se basa en una prueba de cono-AABB. No es trivial, pero vale la pena leerlo. – Daerst

1

El link to the David Eberly article de @Gareth Rees es bueno, pero si divide todo en triángulos, Terminaré revisando vértices y bordes redundantes.Creo que esto va a funcionar bien:

  1. (Opcional) comprobar si la AABB es enteramente en el lado opuesto del plano perpendicular al eje del cono. Si es así, no hay intersección.

  2. Compruebe cada uno de los 8 vértices para ver si está dentro del cono. Si hay un vértice, el cono y la AABB se cruzan. Esto es bastante directo, pero se explica en la página 4 del enlace.

  3. Compruebe cada uno de los 12 bordes para ver si se cruzan con el cono. Si lo hace cualquier borde, el cono y AABB se cruzan. Esto está en las páginas 4-5 del enlace.

  4. Compruebe cada una de las 6 caras para ver si se cruzan con el cono. Si lo hace cualquier borde, el cono y AABB se cruzan. Es suficiente para el rayo de comprobación formado por el eje del cono contra el AABB; esta es una prueba de intersección bastante estándar.

En realidad, puede ser mejor cambiar el orden de la cara y el borde; Esperaría que los controles de la cara sean más rápidos que los de borde, por lo que es posible que pueda salir antes.

Probablemente hay algunas oportunidades agradables para optimizaciones SIMD ya que el número de vértices y aristas son ambos múltiplos de 4 y el cono es el eje alineados, pero eso es más allá del alcance de esta respuesta :)

2

he encontrado una mejor solución con la ayuda de piman en #gamedev:

Realice una prueba de círculo recto entre las caras superior e inferior de la AABB a lo largo del eje del cono con el círculo que el cono hace en su plano.

Si ambos rectángulos están afuera, el AABB está fuera del cono.

1

Se me ocurrió un algoritmo para resolver el caso general de un cono y un aabb arbitrarios, pero todavía maneja su caso específico de manera eficiente.

he descrito en otro hilo: Detect if a cube and a cone intersect each other?

+0

¡Ah, genial! Sin embargo, parece que el tuyo sigue siendo al menos un orden de magnitud más lento que mi respuesta para este caso específico. Mi respuesta requiere aproximadamente 10 operaciones de punto flotante. –

+0

También sospecho que la técnica que presenté aquí (basada en la aritmética de intervalos) podría aplicarse al caso general. –

+0

Desde entonces he optimizado mi solución bastante. La tuya es aún más rápida, pero en este momento, sabiendo lo que sé, es probable que te falten casos porque este es un problema MUY complejo. ¿Qué pasa con el caso donde el cono está al lado de la caja y la base del cono termina cerca del centro de la caja? Imagine que el borde del cono no toca la caja hasta que se cruza en el medio en la base del cono. –

Cuestiones relacionadas