2009-12-31 13 views
7

Je fais des recherches sur les mathématiques pour un ray tracer, mais je ne suis pas une transition qui est faite dans presque tous les articles que j'ai lus sur le sujet. Ceci est ce que j'ai:Comment configurer une équation quadratique pour une intersection rayon/sphère?

Formule pour une sphère:

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

Où R est le rayon, C est le centre et X, Y, Z sont tous les points de la sphère.

Formule pour une ligne:

X + DxT, Y + dyt, Z + DZT

où D est un vecteur de direction normalisée pour la ligne et X, Y, Z sont tous les points de la ligne, et T est un paramètre pour un point sur la ligne.

En remplaçant les composants de la ligne dans l'équation de la sphère, nous obtenons:

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

Je suis tout jusqu'à ce point (du moins je pense), mais chaque tutoriel que j'ai lu fait un saut de cette équation quadratique sans l'expliquer (ceci est copié d'un des sites, de sorte que les termes sont un peu différent de mon exemple):

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

Je vais trouver comment résoudre T en utilisant la formule quadratique, mais je ne comprends pas comment ils arrivent à l'équation quadratique à partir des formules ci-dessus. Je suppose que c'est juste une partie de la connaissance mathématique commune que j'ai depuis longtemps oubliée, mais googler pour "Comment mettre en place une équation quadratique" n'a pas vraiment donné quelque chose non plus. Je voudrais vraiment comprendre comment arriver à cette étape avant de continuer, car je n'aime pas écrire du code que je ne comprends pas complètement.

+0

Il est un peu difficile de lire tous les symboles. Je pense que je sais comment répondre à votre question, mais pouvez-vous me diriger vers l'un des tutoriels avec lesquels vous rencontrez des problèmes afin que je puisse vous donner un peu de contexte? De plus, vous n'avez pas terminé la phrase au milieu de la question: "X, Y, Z sont tous les points sur la ligne, et T est ...". –

+0

http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter1.htm http://www.codeproject.com/KB/graphics/Simple_Ray_Tracing_in_C_.aspx Il y a un troisième, mais je ne sais pas pense que le html pour le site est rendu correctement, et certaines parties des équations semblent être manquantes, donc j'ignore celui-là. Je viens de corriger la phrase inachevée. –

+1

La question pourrait être plus claire si vous distinguiez entre X, Y, Z dans la formule pour une sphère (variables inconnues) et les X, Y, Z dans la formule pour la ligne (point connu sur la ligne). Lorsque vous substituez la ligne dans la sphère, vous convertissez à partir d'une paire d'équations avec inconnue X, Y, Z et T une équation avec T inconnu seulement (qui peut alors être résolu), mais l'utilisation de X, Y, Z dans le l'équation substituée indique que celles-ci sont encore inconnues. –

Répondre

8

D'ici:

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

Développer les trois termes au carré, vous avez donc une longue expression:

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

(Ceci est dû à l'utilisation de la formule (x+y+z)^2 = x^2 + y^2 + z^2 + 2xy + 2xz + 2yz)

Ensuite groupe donc vous avez des facteurs de T^2, T, et 1:

Ces facteurs sont les A, B, C donnés ci-dessus. C'est une équation quadratique pour T, et peut être résolue en utilisant la formule quadratique.

+0

Cela éclaircit les choses. J'aurais aimé qu'ils l'aient dit dans au moins un des articles. Peut-être que c'était un fait, cependant. Merci! –

11

Voici une description détaillée de chaque étape; J'espère que cela rendra les choses claires.L'équation d'une sphère tridimensionnelle est:

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

avec <a, b, c> étant le centre de la sphère et r son rayon. Le point <x, y, z> est sur la sphère s'il satisfait cette équation.

Les équations paramétriques pour un rayon sont:

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

<xo, yo, zo> est l'origine du rayon, et <xd,yd,yd> est la direction du rayon de la caméra. Pour trouver l'intersection, nous voulons voir quels points sur le rayon sont les mêmes que les points sur la sphère. Donc, nous substituons l'équation de rayon dans l'équation sphère:

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

qui se développe à:

(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 

Notez que ceci est une équation du second degré sous la forme At^2 + Bt + C = 0, avec:

  • 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]

On peut appliquer la formule quadratique générale pour une variable inconnue, qui est:

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

La partie B^2 - 4AC est appelée "discriminante". En fonction de la valeur du discriminant, nous obtenons zéro, une ou deux solutions à cette équation:

  • Si elle est inférieure à zéro, la solution est un nombre imaginaire, et le rayon et la sphère ne le font pas se croisent dans le vrai plan.

  • S'il est égal à zéro, alors le rayon coupe la sphère exactement à 1 point (elle est exactement tangente à la sphère).

  • S'il est supérieur à zéro, le rayon coupe la sphère exactement à 2 points.

Si le discriminante indique qu'il n'y a pas de solution, alors vous avez terminé! Le rayon n'intersecte pas la sphère. Si le discriminant indique au moins une solution, vous pouvez résoudre t pour déterminer le point d'intersection. Les deux solutions sont:

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

La solution plus petite est le point auquel le rayon frappe d'abord la sphère.

+0

J'aimerais pouvoir répondre à deux questions, car c'est vraiment une excellente réponse. Alors que l'autre aborde la question un peu plus directement, cela aide vraiment à mettre en perspective ce que j'essaie de faire, et je l'apprécie vraiment. Merci beaucoup pour votre temps et votre aide, John. –

+0

Note: Si l'une des deux solutions est négative et l'autre positive, cela signifie que le rayon provient de _inside_ de la sphère. (Vous devez voyager "en arrière" pour trouver un point d'intersection et "en avant" pour trouver l'autre.) –

+0

Sûrement il n'y a qu'un seul point s'il provient de l'intérieur de la sphère? ..ou voulez-vous dire que si vous reculiez depuis le point d'origine du rayon, vous sortiriez également de la sphère? –

Questions connexes