Brechung mit Vektoren
-
Salut zusammen,
Nach langem hirnen und grügeln an einem (eigentlich simplen) Problem mit Vektoren aus der Computergraphik (OpenGL+c++), bin ich in dieses Forum gelandet. Ich hoffe jemand kann mir eine einigermassen einfache Lösung zeigen:Variablen:
Gross = Vektor, klein = SkalarProblem:
Eine diskrete Oberfläche ist definiert durch die Punkte V_ij in R^3. Diese Oberfläche soll alle Sichtstrahlen von einem gegebenen Augpunkt aus nach den physikalischen Brechungsgesetz brechen. Finde zu jedem Punkt die Geradengleichung des Sichtstrahles nach erfolgter Brechung.Erläuterungen:
Ich schränke das Problem ein auf einen Punkt V der Brechungsoberfläche. Zu V ist der Normalenvektor N und Sichtstrahlvektor S0 gegeben.
Zuerst berechne ich den Eintrittswinkel a0 zwischen der N und S0:
a0 = arccos ( (N * S0) / (|N| * |S0| ) )
Nun wende ich das Brechungsgesetz sin(a0)/sin(a1) = c0 / c1 an, und berechne a1 ( = arcsin ( (sin(a0)c1) / c0 ).
Jetzt reduziert sich das Problem darauf, einen geeigneten Richtungsvektor R des gebrochenen Sichtstrahles S(t) zu finden, denn alles andere haben wir! Als Einstiegspunkt von S(t) wird einfach der Ortsvektor V verwendet, also lautet der Ansatz: S(t) = V + tR. R ist gesucht.Folgende Bedingungen für R müssen gelten (hab ich so rausgefunden):
1. Winkel ( R, -N ) = a1 = arcsin ( ( sin( a0 ) * c1 ) / c0 )
2. R element E(u,v) = V + u * -Normale + v * S0
3. (-N x S0) * R = 0 (R ist orthogonal zur Normalen der Ebene E(u,v), andere Formulierung von 3.)
(4. | V + R | > | V | (auf dem Kegel um die Normale gibt es so nur einen Vektor R, nicht zwei!)) (unsicher)Lösungswege:
1. Durch Auflösung des Gleichungssystems der 3 Komponentengleichungen der Ebene E(u,v) und der Winkelgleichung sollte man R eigentlich bestimmen können. Doch leider hab ich's noch nicht hingekriegt (diese elenden Wurzeln beim Betrag...). Das Problem vereinfacht sich noch mehr, wenn man bedenkt, dass die Länge von R eigentlich unwichtig ist, also kann man zwei Komponenten z.B. xR, yR schon vorher geeignet festlegen...
2. Durch eine Rotationsmatrix lässt sich S0 bestimmt irgendwie in R überführen...Leider bin ich kein Zahlencrack, doch ich hoffe die Aufgabe klar formuliert zu haben. Ansonsten bitte nachfragen.
Ich danke euch schon im voraus für eure Bemühungen!
Gruss,
Aurelio