Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

07.07.2006, 15:17

2D Mathematik: Strahl soll von Kugel reflektiert werden.

Hi,

ich steh gerade vor einem typischen Blackout :shock:

Problem ist folgendes: Ich habe einen Strahl den ich eine Richtung aussende. Auf dem Weg des Strahls trifft dieser auf eine Kugel die diesen Strahl möglichst realistisch reflektieren soll. Also einen 2. Strahl generieren und diesen halt auch in eine bestimmte Richtung senden.

Jetzt weiß ich nur nicht mehr wie man so etwas berechnet :roll:

Einen "Spiegel" habe ich hinbekommen, indem ich erst geprüft habe, ob der Strahl den "Spiegel" berührt, daraus dann den Winkel berechnet, diesen auf die andere Seite übertragen und daraus den 2. Strahl generiert. (falls hier jemand einen besseren Ansatz hat, immer her damit :))

Jedoch bei der Kugel reiß ich mir ein Bein aus :?

Jemand eine Idee?

so long
- Patrick

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

07.07.2006, 15:28

Weiß jetzt nich, wie man das gescheit implementiert, aber ich werd einfacvh mal meine geometrische Herangehensweise beschreiben. Angenommen man hat eine Kugelgleichung und eine Geradengleichung für den Strahl.
Durchschlagpunkte von Kugel und Strahl berechnen (Vectorrechnung bietet jedes Tafelwerk). Prüfen welcher Durchschlagp. näher am Ursprung vom Strahl liegt.
An diesem Punkt eine Ebenengleichung aufstellen, die orthogonal zum Vector Kreismittelpunkt-Durchschlagpunkt liegt - da is wieder der Spiegel ;)

Das lässt sich sicher auch anders machen / ultra stark optimieren und zusammenfassen, sollte aber vom Grundsatz her gehen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

07.07.2006, 15:51

Weißt du, wie man den Schnittpunkt zwischen einer Linie und einer Kugel berechnet?
Wenn du den Schnittpunkt hast, berechnest du den Normalenvektor der Kugeloberfläche an dieser Stelle. Dazu musst du einfach nur die Differenz zwischen Schnittpunkt und Kugelmittelpunkt bilden und das Ergebnis normieren.
Jetzt hast du eine Position und einen Normalenvektor und kannst so tun, als befände sich an dieser Stelle ein normaler planer "unendlich kleiner" Spiegel.

Anonymous

unregistriert

4

07.07.2006, 16:02

David Scherfgen
Jop das ist es! Thx, werd mal direkt reinhauen!

edit: Differenz von Mittelpunkt der Kugel und Schnittpunt, ist das nicht der Radius? :?: Oder verstehe ich grade was falsch :roll:

grek40
Die Erklärung von David war etwas treffender für mich :D Trotzdem danke!

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

5

07.07.2006, 16:08

Zitat von »"nix da"«

edit: Differenz von Mittelpunkt der Kugel und Schnittpunt, ist das nicht der Radius?


Der Betrag schon. Vektoriell ist es aber der nicht normalisierte Normalenvektor. Tönt komisch, ist aber so.

Für was brauchst du das denn? Tönt verdächtig nach einem Raytracer.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Anonymous

unregistriert

6

07.07.2006, 16:24

big_muff
Klingt nicht nur danach, ist auch einer :D Gab damals aufm C64 son geiles Game, da hat man einen Strahl ausgesendet und mußte den anhand von Geometrischen Objekten (Dreiecke, Kugeln, Strecken, Drachen usw.) ablenken um ein Ziel zu treffen.

Anonymous

unregistriert

7

07.07.2006, 16:59

So das geht soweit auch prima wie david es sagte, jedoch noch mal zurück zum Thema "Strahl spiegeln auf einer glatten Oberfläche":

Gibt es da noch andere (bessere/leichtere/schnellere/oä.) Ansätze als meinen um einen Richtungsvektor zu bekommen? Startpunkt des 2. Strahls ist ja der Auftreffpunkt des ersten Strahls.

edit: Habe dazu diese Formel gefunden:

Quellcode

1
2
→   →        → →    →
R = V – 2 * (V·N) * N 

R ist der Reflektierte Vektor
V ist der einfallende Vektor
N ist die Normale des Spiegels

Jedoch stellt sich mir die Frage, wie dies Funktionieren soll, wenn die Position des Spiegels nicht mit einbezogen wird :?:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

07.07.2006, 17:17

Dir = Richtung des einfallenden Strahls
Dir' = Richtung des reflektierten Strahls
N = Normalenvektor beim Schnittpunkt

Dir' = Dir - 2 * Dir·N * N

oder anders geschrieben:

Dir' = Dir - (2 * dot(Dir, N) * N)


Edit: Da war ich wohl zu spät.
Die Position des Spiegels ist unerheblich. Eine Rolle spielt nur der Einfallswinkel. Hier wird ja auch nur die Richtung des reflektierten Strahls berechnet, nicht sein Startpunkt. Den hast du ja schon durch den Schnittpunkt gegeben.

Anonymous

unregistriert

9

07.07.2006, 17:24

David Scherfgen
Auch wenn ich Deine Codes oft grauenvoll finde, aber in Mathe biste ein Genie :lol:

Danke :roll:

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

10

07.07.2006, 17:26

Ein anderer Weg, ohne Winkel zu berechnen, ist folgender:

P Schnittpunkt Strahl/Ebene
d Richtungsvektor vom Strahl
P' = Orthogonale Projektion von (P+d) in die Ebene (damit ist P' - P senkrecht zur Ebenennormale)
m = P' - (P + d) ist Vektor von (P + d) nach P'
d' = P' + m - P ist Richtung des reflektierten Strahls

Orthogonale Projektion im 2D ist auch nicht so schwer:

n Normale der Ebene
n' senktrecht zu n, normiert
P' = P + n' * (d * n')

Da kann man aber sicher noch was zusammenfassen.

Der Übergang zum 3D erfordert eigentlich nur, dass du eine Normalbasis für die Ebene hast. (zwei normierte Vektoren senkrecht zur Ebenenormale, die nicht linear abhängig sind)

Das ist evtl. ein wenig schneller als die Arbeit mit Sinus und Co, weil man eben ohne trigonometrische Funktionen auskommt. Konstruktiv ist das aber etwas schlechter nachzuvollziehen. (jedenfalls, wenn man das nur als Text liest)

In solchen Fällen hilft es mit immer sehr, eine kleine Zeichnung anzufertigen.

Gruss,
Rainer

PS: das habe ich eben selbst aber nicht so nachgerechnet. ;)
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige