2009-12-31 9 views
7

Estoy investigando las matemáticas para un rastreador de rayos, pero no estoy siguiendo una transición que se hace en casi todos los artículos que he leído sobre el tema. Esto es lo que tengo:¿Cómo configurar la ecuación cuadrática para una intersección de rayos/esferas?

Fórmula para una esfera:

(X - Cx)^2 + (Y - Cy)^2 + (Z - Cz)^2 - R^2 = 0

Donde R es el radio, C es el centro, y X, Y, Z son todos los puntos en la esfera.

Fórmula para una línea:

X + DxT, Y + DYT, Z + DZT

donde D es un vector de dirección normalizado para la línea y X, Y, Z son todos los puntos de la línea, y T es un parámetro para algún punto de la línea.

Mediante la sustitución de los componentes de la línea en la ecuación de esfera, obtenemos:

(X + DxT - Cx)^2 + (Y + DYT - Cy)^2 + (Z + DZT - Cz)^2 - R^2 = 0

Sigo todo hasta ese punto (al menos creo que sí), pero luego cada tutorial que he leído hace un salto de eso a una ecuación cuadrática sin explicarlo (esto se copia de uno de los sitios, por lo que los términos son un poco diferente de mi ejemplo):

a = Xd^2 + Yd^2 + Zd^2

B = 2 * (Xd * (X0 - Xc) + Yd * (Y0 - Yc) + Zd * (Z0 - Zc))

C = (X0 - Xc)^2 + (Y0 - Yc)^2 + (Z0 - Zc)^2 - Sr^2

Obtengo cómo resolver para T usando la fórmula cuadrática, pero no entiendo cómo llegan a la ecuación cuadrática de las fórmulas anteriores. Supongo que es solo un conocimiento matemático común que hace tiempo que olvidé, pero buscar en Google "Cómo configurar una ecuación cuadrática" tampoco ha dado realmente nada.

Realmente me gustaría saber cómo llegar a este paso antes de continuar, ya que no me gusta escribir código que no entiendo completamente.

+0

Es un poco difícil leer todos los símbolos. Creo que sé cómo responder a su pregunta, pero ¿puede indicarme uno de los tutoriales con los que está teniendo problemas para poder proporcionar algún contexto? Además, no terminó la oración en el medio de la pregunta: "X, Y, Z son todos los puntos en la línea, y T es ...". –

+0

http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter1.htm http://www.codeproject.com/KB/graphics/Simple_Ray_Tracing_in_C_.aspx Hay un tercero, pero no lo hago Creo que el html para el sitio se está procesando correctamente, y algunas partes de las ecuaciones parecen estar ausentes, así que ignoro esa. Acabo de arreglar la oración sin terminar. –

+1

La pregunta podría ser más clara si distinguiste entre X, Y, Z en la fórmula de una esfera (variables desconocidas) y X, Y, Z en la fórmula para la línea (punto conocido en la línea). Cuando sustituyes la línea en la esfera, conviertes de un par de ecuaciones con X, Y, Z y T desconocidas a una ecuación con T desconocida solamente (que luego puede resolverse), pero el uso de X, Y, Z en el La ecuación sustituta indica que todavía son incógnitas. –

Respuesta

8

A partir de aquí:

(X + DxT - Cx)^2 + (Y + DyT - Cy)^2 + (Z + DzT - Cz)^2 - R^2 = 0 

Expandir los tres al cuadrado términos, por lo que tiene una larga expresión:

X^2 + Dx^2T^2 + Cx^2 + 2XDxT - 2XCx - 2DxTCx + ...... = 0 

(Esto se debe a la utilización de la fórmula (x+y+z)^2 = x^2 + y^2 + z^2 + 2xy + 2xz + 2yz)

Entonces grupo entonces usted tiene factores de T^2, T, y 1:

Estos factores son los A, B, C dados anteriormente. Esta es una ecuación cuadrática para T, y se puede resolver usando la fórmula cuadrática.

+0

Eso aclara las cosas. Ojalá lo hubieran dicho en al menos uno de los artículos. Sin embargo, tal vez era algo dado. ¡Gracias! –

11

Aquí hay un tutorial detallado de cada paso; con suerte, esto aclarará las cosas.La ecuación para una esfera tridimensional es:

(x-a)^2 + (y-b)^2 + (z-c)^2 = r^2

con <a, b, c> ser el centro de la esfera y r su radio. El punto <x, y, z> está en la esfera si satisface esta ecuación.

Las ecuaciones paramétricas para un rayo son:

  • X = xo + xd*t
  • Y = yo + yd*t
  • Z = zo + zd*t

donde <xo, yo, zo> es el origen del rayo, y <xd,yd,yd> es la dirección de rayos cámara.

Para encontrar la intersección, queremos ver qué puntos en el rayo son los mismos que en la esfera. Así sustituimos la ecuación de rayos en la ecuación de la esfera:

(xo + xd*t - a)^2 + (yo + yd*t - b)^2 + (zo + zd*t - c)^2 = r^2

que se expande para:

(xd^2 + yd^2 + zd^2)        * t^2 + 
    [2[xd * (xo - a) + yd * (yo - b) + zd *(zo - c)]] * t + 
    [(xo - a)^2 + (yo - b)^2 + (zo - c^)2 - r^2]  * 1 
    = 0 

en cuenta que esta es una ecuación cuadrática en forma At^2 + Bt + C = 0, con:

  • A = (xd^2 + yd^2 + zd^2)
  • B = [2[xd * (xo - a) + yd * (yo - b) + zd *(zo - c)]]
  • C = [(xo - a)^2 + (yo - b)^2 + (zo - c^)2 - r^2]

podemos aplicar la fórmula cuadrática general para una variable desconocida, que es:

t = [-B +- sqrt(B^2 - 4AC)]/2A 

La porción B^2 - 4AC se llama el "discriminante". Dependiendo del valor del discriminante, obtendremos cero, uno o dos soluciones a esta ecuación:

  • Si es menor que cero, la solución es un número imaginario, y el rayo y la esfera no lo hacen se cruzan en el plano real.

  • Si es igual a cero, entonces el rayo interseca la esfera exactamente en 1 punto (es exactamente tangente a la esfera).

  • Si es mayor que cero, entonces el rayo interseca la esfera exactamente en 2 puntos.

Si el discriminante indica que no hay solución, ¡ya está! El rayo no se cruza con la esfera. Si el discriminante indica al menos una solución, puede resolver por t para determinar el punto de intersección. Las dos soluciones son:

t_1 = [-B + sqrt(B^2 - 4AC)]/2A 
t_2 = [-B - sqrt(B^2 - 4AC)]/2A 

La solución más pequeña es el punto en el que el rayo primero toca la esfera.

+0

Ojalá pudiera marcar dos preguntas como respuesta, ya que esta es realmente una respuesta increíble. Mientras que el otro aborda la pregunta un poco más directamente, esto realmente ayuda a poner lo que estoy tratando de hacer en una mejor perspectiva, y realmente lo aprecio. Muchas gracias por su tiempo y ayuda, John. –

+0

Nota: Si una de las dos soluciones es negativa y la otra es positiva, eso indica que el rayo proviene de _inside_ de la esfera. (Tienes que viajar "hacia atrás" para encontrar un punto de intersección y "hacia adelante" para encontrar el otro.) –

+0

Seguramente solo hay un punto si se origina dentro de la esfera. ¿O quieres decir que si retrocedieras desde el punto de origen del rayo, también saldrías de la esfera? –

Cuestiones relacionadas