6 votos

Intersección de la línea y el plano en 3D

¿Cómo se podía calcular la intersección de una recta y un plano en 3D ?

Dado, por ejemplo, son 4 puntos que forman un avión (x1,y1,z1)...(x4,y4,z4) y 2 diferentes puntos que forman una línea (x5,y5,z5) and (x6,y6,z6). ¿Cómo es posible saber dónde está la línea que se cruzan con la llanura cuando esta información es dada. Pensé que para calcular la ecuación de la llanura y de la línea. A continuación, eq of the line = eq of the plane. encontrar el punto donde se intersecan. Pero no sé cómo la construcción de la ecuación de una recta en 3D dado los 2 puntos. Y no estoy seguro de que si me equiparar las 2 ecuaciones que dan el punto de intersección. Si alguien por favor sea tan amable de llenar los espacios en blanco de mi conocimiento o sugerir otra solución. Le estaría muy agradecido.

15voto

Emilio Gort Puntos 121

Su intuición de la configuración de las dos ecuaciones iguales es correcto y que es la forma de resolver para la intersección. Voy a ofrecer una explicación completa, con ejemplos de código.

Una forma común de representar un avión $\mathbf{P}$ es en punto-forma normal, $\mathbf{\vec{n}} \cdot (X-Y)=0$ donde $\mathbf{\vec{n}}$ es la normal del plano y tanto $X$ $Y$ son puntos que se encuentran en el plano. Esto puede ser reescrita en la constante de forma normal mediante la distribución del producto escalar y reordenando términos para obtener: $\mathbf{\vec{n}} \cdot X = d$ donde $d = \mathbf{\vec{n}} \cdot Y$ que es igual a la distancia desde el origen al $\mathbf{\vec{n}}$ es la unidad de longitud. A continuación es una simple estructura de datos que puede utilizar para representar un plano, y la firma de un constructor que se compute el plano de tres puntos en $\mathbb{R^3}$. La aplicación se deja como ejercicio para el lector ;).

struct Plane {
    Vector3 n; // normal
    float d; // distance from origin

    Plane(); // default constructor
    Plane(Vector3 a, Vector3 b, Vector3 c); // plane from 3 points
    Vector3 intersectLine(Vector3 a, Vector3 b); // we'll get to this later
};

Dados dos puntos, $A$$B$, una línea puede ser representado en forma paramétrica mediante la adición de un punto en el vector formado por los dos puntos, escalado por un parámetro de $t$. En símbolos, $L(t) = A + t(B-A)$. El uso de su intuición, podemos insertar esta ecuación (cuya salida es un punto), en $X$ en la constante de la normal del plano de la representación: $\mathbf{\vec{n}} \cdot [A + t(B-A)] = d$. Queremos saber el número de copias de $(B-A)$ tenemos que añadir a $A$ para llegar a un punto que se encuentra dentro del avión, en otras palabras, queremos resolver para $t$. Haciendo algunas de fantasía álgebra, obtenemos: $t = \frac{d-\mathbf{\vec{n}} \cdot A}{\mathbf{\vec{n}} \cdot (B-A)}$. Podemos (finalmente) el palo de esta expresión para $t$ nuevo en la ecuación para nuestra línea para obtener: $I = A+\frac{d - (\mathbf{\vec{n}} \cdot A)}{\mathbf{\vec{n}} \cdot (B-A)}(B-A).$

Armados con esta ecuación, podemos ahora aplicar una buena función que le dirá lo que queremos saber:

Vector3 Plane::intersectLine(Vector3 a, Vector3 b) {
    Vector3 ba = b-a;
    float nDotA = Vector3::dotProduct(n, a);
    float nDotBA = Vector3::dotProduct(n, ba);

    return a + (((d - nDotA)/nDotBA) * ba);
}

Esperemos que esto funciona para usted, y espero que no me fudge cualquiera de los detalles! Si usted planea hacer un montón de este tipo de computación geométrica vale la pena recoger Christer Ericson del tiempo Real de la Detección de Colisiones, que es una excelente fuente de referencia para este tipo de cosas. Alternativamente, usted puede engancharse algunos ya construidos clases de algo como OGRE3D, si no está particularmente interesado en la creación de su propio.

2voto

marty cohen Puntos 33863

Para que estas y muchas peticiones similares, van a

http://www.graphicsgems.org/

Ver también, su descendiente, diario de herramientas gráficas en el

http://JGT.akpeters.com/

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X