Ich untersuche die Mathematik für einen Raytracer, aber ich folge nicht einem Übergang, der in fast jedem Artikel gemacht wird, den ich zu diesem Thema gelesen habe. Das ist was ich habe:
Formel für eine Kugel:
(X - Cx) ^ 2 + (Y - Cy) ^ 2 + (Z - Cz) ^ 2 - R ^ 2 = 0
Dabei ist R der Radius, C ist der Mittelpunkt und X, Y, Z sind alle Punkte in der Kugel.
Formel für eine Zeile:
X + DxT, Y + DyT, Z + DzT
Dabei ist D ein normalisierter Richtungsvektor für die Linie und X, Y, Z sind alle Punkte auf der Linie und T ist ein Parameter für einen Punkt auf der Linie.
Durch Einsetzen der Komponenten der Linie in die Kugelgleichung erhalten wir:
(X + DxT - Cx) ^ 2 + (Y + DyT - Cy) ^ 2 + (Z + DzT - Cz) ^ 2 - R ^ 2 = 0
Ich folge alles bis zu diesem Punkt (zumindest denke ich, dass ich es tue), aber dann macht jedes Tutorial, das ich gelesen habe, einen Sprung zu einer quadratischen Gleichung, ohne es zu erklären (das wird von einer der Seiten kopiert) die Begriffe sind ein bisschen anders als in meinem Beispiel):
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
Ich lerne, wie man dann mit der quadratischen Formel nach T auflöst, aber ich verstehe nicht, wie sie aus den obigen Formeln zur quadratischen Gleichung kommen. Ich gehe davon aus, dass das nur ein Stück allgemeines mathematisches Wissen ist, das ich längst vergessen habe, aber das Googeln nach "Wie man eine quadratische Gleichung aufstellt" hat auch nicht wirklich etwas ergeben.
Ich würde wirklich gerne verstehen, wie ich zu diesem Schritt komme, bevor ich fortfahre, da ich nicht gerne Code schreibe, den ich nicht vollständig verstehe.
Von hier:
%Vor%Erweitern Sie die drei quadrierten Terme, sodass Sie einen langen Ausdruck haben:
%Vor% (Dies ist aufgrund der Verwendung der Formel (x+y+z)^2 = x^2 + y^2 + z^2 + 2xy + 2xz + 2yz
)
Dann gruppiere so, dass du die Faktoren T ^ 2, T und 1 hast:
%Vor%Diese Faktoren sind die oben angegebenen A, B, C. Dies ist eine quadratische Gleichung für T und kann mit der quadratischen Formel gelöst werden.
Hier finden Sie eine detaillierte Anleitung zu jedem Schritt. Hoffentlich wird dies die Dinge kristallklar machen. Die Gleichung für eine dreidimensionale Kugel lautet:
(x-a)^2 + (y-b)^2 + (z-c)^2 = r^2
wobei <a, b, c>
der Mittelpunkt der Kugel und r
ihr Radius ist. Der Punkt <x, y, z>
ist auf der Kugel, wenn er diese Gleichung erfüllt.
Die Parametergleichungen für einen Strahl sind:
X = xo + xd*t
Y = yo + yd*t
Z = zo + zd*t
Dabei ist <xo, yo, zo>
der Ursprung des Strahls und <xd,yd,yd>
ist die Richtung des Kamera-Strahls.
Um den Schnittpunkt zu finden, wollen wir sehen, welche Punkte auf dem Strahl die gleichen sind wie Punkte auf der Kugel. Also ersetzen wir die Strahlengleichung durch die Kugelgleichung:
(xo + xd*t - a)^2 + (yo + yd*t - b)^2 + (zo + zd*t - c)^2 = r^2
, das zu:
erweitert wird %Vor% Beachten Sie, dass dies eine quadratische Gleichung in der Form At^2 + Bt + C = 0
ist, mit:
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]
Wir können die allgemeine quadratische Formel für eine unbekannte Variable anwenden, nämlich:
%Vor% Der Anteil B^2 - 4AC
wird als "Diskriminante" bezeichnet. Abhängig vom Wert der Diskriminante erhalten wir null, eine oder zwei Lösungen für diese Gleichung:
Wenn es kleiner als Null ist, ist die Lösung eine imaginäre Zahl und der Strahl und die Kugel schneiden sich nicht in der realen Ebene.
Wenn es gleich Null ist, dann schneidet der Strahl die Kugel an genau einem Punkt (er ist genau tangential zur Kugel).
Wenn es größer als Null ist, schneidet der Strahl die Kugel an genau 2 Punkten.
Wenn die Diskriminante anzeigt, dass es keine Lösung gibt, dann sind Sie fertig! Der Strahl schneidet die Kugel nicht. Wenn die Diskriminante mindestens eine Lösung angibt, können Sie für t
auflösen, um den Schnittpunkt zu bestimmen. Die zwei Lösungen sind:
Die kleinere Lösung ist der Punkt, an dem der Strahl zuerst auf die Kugel trifft.
Tags und Links geometry raytracing algebra