blog · git · desktop · images · contact & privacy · gopher


Raytracing: Einfache Schnitttests

In den Statistiken zu dieser Seite, die mir mein Webhoster zur Verfügung stellt, sehe ich, dass immer wieder Leute über Suchbegriffe wie "Schnitttest Kugel" hier her finden. Tatsächlich taucht das Posting zum GLSL-Raytracer bei diesen Suchworten ziemlich weit oben in den Suchmaschinen auf.

Nun ist aber in diesem Posting mitnichten erklärt, wie der Schnitttest überhaupt funktioniert. Im Code ist es zwar ausprogrammiert, aber ich bezweifle, dass es das ist, was derjenige gesucht hatte -- zumal man sich erst einmal ein bisschen durchwühlen muss, bis man an dieser Stelle angelangt ist. Also kurzerhand aufgeschrieben, wie das alles denn nun abläuft. Und damit es sich auch lohnt, ist außer dem Schnitttest mit der Kugel auch noch der mit einer Ebene und mit einem Dreieck erklärt.

Hier geht es zum Download des PDFs. Das Dokument kann unter der Lizenz Creative Commons Attribution (CC-BY) frei weitergegeben, verändert werden und so weiter. Falls jemand Fehler findet, bin ich um Rückmeldung aber auch dankbar.

Also, noch einmal: "Schnitttest Kugel", "Schnitttest Ebene", "Schnitttest Dreieck". Da oben im PDF steht's. ;)

Kommentare

Karl-Heinz fragt nach:

Hallo,

als Autodidakt kämpfe ich immer wieder damit, dass mir das erforderliche Hintergrundwissen fehlt, die akademischen Erklärungen, wie was funktioniert, zu verstehen.

Das PDF Schnitttest war für mich ein enormer Erkenntnisgewinn, weil ich der Argumentationskette problemlos folgen konnte. So konnte ich die Theorie verstehen (vielen Dank für die Mühe) und gleichzeitig sehen, wie das alles implementiert wird.

Ganz tolle Arbeit. Vielen Dank für Zusammenschreiben.

Eine Frage beschäftigt mich allerdings noch:

Auf Seite 3 des PDF (Schnitttest mit einer Kugel) wird als Formel für den Vektor h angegeben:

vec_h = vec_p + ( alpha - x ) * vec_u.

Wenn ich dem Text folge und die Zeichnungen selbst interpretiere, würde ich aber die Gleichung wie folgt formulieren:

vec_h = (vec_p + alpha * vec_u) - x

(analog auch für den Fall alpha minus x).

Können Sie mir diese Diskrepanz evtl. erklären?

Vielen Dank und viele Grüße

Karl-Heinz

Meine Antwort:

Hallo Karl-Heinz,

freut mich zu hören, dass das PDF hilfreich war. :)

Zum Vektor h: Ihre Gleichung kann nicht funktionieren, weil x kein Vektor ist. Wenn man sie von links her liest, dann startet man bei vec_p (Vektor) und addiert darauf vec_u (Vektor), was vorher um alpha (Skalar) skaliert wurde. Damit erhält man insgesamt aus der Klammer wieder einen Vektor, was bis hierhin okay ist. Danach müsste man aber x (Skalar) subtrahieren und genau das ist nicht definiert (Vektor minus Skalar).

Bei der Version aus dem PDF startet man bei vec_p und addiert darauf vec_u, welches vorher um (alpha - x) skaliert wurde (Skalar alpha minus Skalar x ist wieder ein Skalar). Man hat hier also eine komponentenweise Skalarmultiplikation (siehe auch) von vec_u und eine Vektoraddition und erhält daher folglich insgesamt als vec_h wie erwartet einen Vektor.

Hilft das weiter? :)

Cheers!

Vain

Und noch einmal seine Reaktion:

Hallo Vain,

vielen Dank für die zusätzliche Erläuterung. Sie hat mir sehr geholfen, die Zusammenhänge zu verstehen! Mein Fehler war, dass ich nicht mehr daran gedacht hatte, dass vec_u normiert ist, so dass ich mir nicht vorstellen konnte, wie (alpha - x) funktionieren kann. Jetzt ist alles klar!

Herzlichen Dank und viele Grüße

Karl-Heinz