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 = Skalar

    Problem:
    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 + t
    R. 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


Log in to reply