2009-12-31 10 views
7

che sto ricercando la matematica per un ray tracer, ma io non sto seguendo una transizione che è fatto in quasi ogni articolo che ho letto sull'argomento. Questo è quello che ho:Come impostare l'equazione quadratica per un'intersezione raggio/sfera?

Formula per una sfera:

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

dove r è il raggio, C è il centro, e X, Y, Z sono tutti i punti della sfera.

Formula per una linea:

X + DxT, Y + DYT, Z + DZT

dove D è un vettore di direzione normalizzato per la linea e X, Y, Z sono tutti i punti sulla linea, e T è un parametro per qualche punto della linea.

Sostituendo i componenti della linea nell'equazione sfera, otteniamo:

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

Seguo tutto fino a quel punto (almeno penso di sì), ma poi ogni tutorial che ho letto fa un salto da quello a un'equazione quadratica senza spiegarlo (questo è copiato da uno dei siti, in modo che i termini sono un po 'diverso dal mio esempio):

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

.210

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

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

Ottengo come poi risolvere per T usando la formula quadratica, ma non capisco come ottengano l'equazione quadratica dalle formule sopra. Suppongo che sia solo un pezzo di conoscenza matematica comune che ho dimenticato da tempo, ma cercare su Google come "impostare un'equazione quadratica" non ha dato alcun risultato.

Mi piacerebbe davvero capire come arrivare a questo punto prima di passare, come non mi piace la scrittura di codice non comprendere appieno.

+0

È un po 'difficile leggere tutti i simboli. Penso di sapere come rispondere alla tua domanda, ma puoi indicarmi uno dei tutorial con cui hai problemi in modo da poter fornire un contesto? Inoltre, non hai terminato la frase nel mezzo della domanda: "X, Y, Z sono tutti i punti sulla linea, e T è ...". –

+0

http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter1.htm http://www.codeproject.com/KB/graphics/Simple_Ray_Tracing_in_C_.aspx C'è un terzo, ma non lo faccio penso che l'html per il sito sia reso correttamente, e alcuni pezzi delle equazioni sembrano mancare, quindi sto ignorando quello. Ho appena aggiustato la frase incompleta. –

+1

La domanda potrebbe essere più chiara se si distingue tra X, Y, Z nella formula per una sfera (variabili sconosciute) e X, Y, Z nella formula per la linea (punto noto sulla linea). Quando si sostituisce la linea nella sfera, si converte da una coppia di equazioni con X, Y, Z e T sconosciute a un'equazione con solo T sconosciuto (che può quindi essere risolto), ma l'uso di X, Y, Z nel equazione sostituita indica che questi sono ancora sconosciuti. –

risposta

8

Da qui:

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

Espandere i tre quadrato termini, in modo da avere una lunga espressione:

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

(Ciò è dovuto utilizzare la formula (x+y+z)^2 = x^2 + y^2 + z^2 + 2xy + 2xz + 2yz)

Poi gruppo quindi hai fattori di T^2, T e 1:

Questi fattori sono A, B, C sopra riportati. Questa è un'equazione quadratica per T e può essere risolta usando la formula quadratica.

+0

Questo chiarisce le cose. Vorrei che lo avrebbero appena detto in almeno uno degli articoli. Forse era un dato di fatto, però. Grazie! –

11

Ecco una dettagliata procedura dettagliata di ogni passaggio; spero che questo renderà le cose chiare.L'equazione di una sfera tridimensionale è:

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

con <a, b, c> essere il centro della sfera e r suo raggio. Il punto <x, y, z> si trova sulla sfera se soddisfa questa equazione.

Le equazioni parametriche per un raggio sono:

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

dove <xo, yo, zo> è l'origine del raggio, e <xd,yd,yd> è la direzione del raggio della telecamera.

Per trovare l'intersezione, vogliamo vedere quali punti sul raggio sono gli stessi punti sulla sfera. Quindi sostituiamo l'equazione raggio nell'equazione sfera:

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

che si espande a:

(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 

Si noti che questo è un'equazione quadratica in 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]

si può applicare la formula quadratica generale per una variabile sconosciuta, che è:

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

La porzione B^2 - 4AC è chiamato "discriminante". A seconda del valore del discriminante, avremo zero, uno, o due soluzioni a questa equazione:

  • Se è minore di zero, la soluzione è un numero immaginario, e il raggio e la sfera non lo fanno si intersecano nel piano reale.

  • Se è uguale a zero, il raggio interseca la sfera esattamente a 1 punto (è esattamente tangente alla sfera).

  • Se è maggiore di zero, il raggio interseca la sfera esattamente a 2 punti.

Se il discriminante indica che non c'è soluzione, il gioco è fatto! Il raggio non interseca la sfera. Se il discriminante indica almeno una soluzione, è possibile risolvere per t per determinare il punto di intersezione. Le due soluzioni sono:

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

La soluzione più piccola è il punto in cui il raggio colpisce per primo la sfera.

+0

Vorrei poter contrassegnare due domande come risposta, in quanto questa è davvero una risposta fantastica. Mentre l'altro affronta la questione un po 'più direttamente, questo aiuta davvero a mettere quello che sto cercando di fare in una prospettiva migliore, e lo apprezzo davvero. Grazie mille per il tuo tempo e aiuto, John. –

+0

Nota: se una delle due soluzioni è negativa e l'altra è positiva, ciò indica che il raggio proviene da _inside_ della sfera. (Devi viaggiare "all'indietro" per trovare un punto di intersezione e "avanti" per trovare l'altro.) –

+0

Sicuramente c'è un solo punto se proviene dall'interno della sfera? ..o vuoi dire che se tornassi indietro dal punto di origine del raggio usciresti anche dalla sfera? –