Frage

Ich recherchiere die Mathematik für einen Ray Tracer, aber ich verfolge keinen Übergang, der in nahezu jedem Artikel, den ich zu diesem Thema gelesen habe, vorgenommen wird. Das habe ich:

Formel für eine Kugel:

(X - cx)^2 + (y - cy)^2 + (z - cz)^2 - r^2 = 0

Wo R der Radius ist, C ist das Zentrum und x, y, z sind alle Punkte in der Kugel.

Formel für eine Zeile:

X + DXT, Y + DYT, Z + DZT

wobei D ein normalisierter Richtungsvektor für die Linie und x, y ist, z sind alle Punkte auf der Linie, und T ist ein Parameter für einen Punkt auf der Linie.

Indem wir die Komponenten der Linie in die Kugelgleichung einsetzen, erhalten wir:

(X + dxt - cx)^2 + (y + dyt - cy)^2 + (z + dzt - cz)^2 - r^2 = 0

Ich verfolge alles bis zu diesem Punkt (zumindest denke ich, dass ich es tue), aber dann macht jedes Tutorial, das ich gelesen habe ein wenig anders als mein 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 bekomme, wie man dann die quadratische Formel für t lösen kann, aber ich verstehe nicht, wie sie aus den obigen Formeln zur quadratischen Gleichung kommen. Ich gehe davon aus, dass dies nur ein gängiges mathematisches Wissen ist, das ich längst vergessen habe, aber das Googeln nach "Wie man eine quadratische Gleichung einrichtet" hat auch nichts ergeben.

Ich würde wirklich gerne verstehen, wie ich zu diesem Schritt kommen kann, bevor ich weitergehe, da ich nicht gerne Code schreibe, den ich nicht vollständig erfasse.

War es hilfreich?

Lösung

Von hier:

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

Erweitern Sie die drei quadratischen Begriffe, sodass Sie einen langen Ausdruck haben:

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

(Dies liegt an der Verwendung der Formel (x+y+z)^2 = x^2 + y^2 + z^2 + 2xy + 2xz + 2yz)

Dann haben Sie Faktoren von t^2, t und 1:

(....)T^2 + (....)T + .... = 0

Diese Faktoren sind die oben angegebenen a, b, c. Dies ist eine quadratische Gleichung für T und kann unter Verwendung der quadratischen Formel gelöst werden.

Andere Tipps

Hier ist eine detaillierte Vorgehensweise jedes Schritts; Hoffentlich wird dies die Dinge kristallklar. Die Gleichung für eine dreidimensionale Kugel ist:

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

mit <a, b, c> das Zentrum der Sphäre sein und r sein Radius. Der Punkt <x, y, z> ist auf der Sphäre, wenn es diese Gleichung erfüllt.

Die parametrischen Gleichungen für einen Strahl sind:

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

wo <xo, yo, zo> ist der Ursprung des Strahls und <xd,yd,yd> ist Kamerastrahlrichtung.

Um die Kreuzung zu finden, möchten wir sehen, welche Punkte auf dem Strahl mit Punkten auf der Kugel übereinstimmen. Deshalb ersetzen wir die Strahlengleichung in die Kugelgleichung:

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

was erweitert zu:

  (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

Beachten Sie, dass dies eine quadratische Gleichung in der Form ist At^2 + Bt + C = 0, 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:

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

Das B^2 - 4AC Der Teil wird als "Diskriminant" bezeichnet. Abhängig vom Wert der Diskriminanz erhalten wir Null, ein oder zwei Lösungen für diese Gleichung:

  • Wenn es weniger als Null ist, ist die Lösung eine imaginäre Zahl, und der Strahl und die Kugel kreuzen sich nicht in der realen Ebene.

  • Wenn es gleich Null ist, schneidet der Strahl die Kugel genau 1 Punkt (er ist genau tangential zur Kugel).

  • Wenn es größer als Null ist, schneidet der Strahl die Kugel mit genau 2 Punkten.

Wenn die Diskriminanz angibt, dass es keine Lösung gibt, sind Sie fertig! Der Strahl kreuzt die Sphäre nicht. Wenn die Diskriminanz mindestens eine Lösung angibt, können Sie es lösen t um den Schnittpunkt zu bestimmen. Die beiden Lösungen sind:

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

Die kleinere Lösung ist der Punkt, an dem der Strahl zuerst die Kugel trifft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top