supongo que su polígono 3D es plana (de lo contrario no es realmente un polígono y no es así definido). Por lo tanto, puede encontrar una base ortonormal 2D para este plano. Lo que significa que puede usar cualquier algoritmo de triangulación 2D (puede encontrar muchas implementaciones de C# en la web) y volver a 3D usando su base ortonormal. De esta manera obtendrás triángulos 3D y podrás realizar fácilmente tu prueba de intersección de polígono de rayos ejecutando múltiples pruebas de intersección triángulo-rayo.
Otra forma es realizar un cálculo de intersección de plano de rayos. Tome el punto de intersección P, represéntelo utilizando coordenadas 2D con la base ortonormal anterior. Además, como en la solución anterior, represente su polígono en 2D utilizando la misma base. Luego ejecuta cualquier algoritmo 2D "is point in polygon" y obtendrás los resultados.
actualización: Aquí está la matemáticas Usted puede tomar cualquiera de los dos puntos en el plano P1, P2 (por ejemplo dos de los puntos del polígono) y tomar el vector u = p2 - p1. Normalízalo, y es el primer vector base. Luego toma el N normal del avión y calcula v = cross_product (u, N) y normaliza v. Este es el segundo vector de base. Tenga en cuenta que ambos vectores tienen una unidad de longitud y que son ortogonales entre sí. Por lo tanto, forman una base ortonormal.
Defina p1 como el origen del avión. A continuación, la traducción a 2D de cualquier punto Q en el polígono (q puede ser uno de los vértices del polígono, o cualquier otro punto en el plano del polígono):
x = dot_product(q - p1, u)
y = dot_product(q - p1, v)
Aquí x, y son las coordenadas en 2D es el punto.
Así que después de traducir todo para 2D y haciendo sus algoritmos 2D se puede traducir cualquier punto 2D (x, y) de nuevo a 3D como esto:
q = p1 + x * u + y * v
Aquí * es el producto escalar del vector (x, y son los escalares y u, v son los vectores).
Alex.
¿es posible hacerlo sin la transformación ortonormal 3D-2D? ¿Y hay alguna referencia sobre cómo hacer la transformación ortonormal? Me encantaría leerlos, ¡gracias! – Graviton
Escribiré la respuesta en el mensaje mismo. Los comentarios tienen malas capacidades de formateo :) – Alex
gracias. Eso es bueno – Graviton