Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 14:21

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Reflexionsvektor
BeitragVerfasst: Mi Mär 23, 2005 21:56 
Offline
DGL Member

Registriert: So Feb 13, 2005 14:50
Beiträge: 4
Grüße!

Ich bin gerade dabei, einen Pong-Clone zu programmieren, bei dem ich auf die Spielfläche beliebig ausgerichtete Strecken/Polygone setzen möchte, an denen der Ball dann entsprechend reflektiert wird.
Zunächst habe ich das ganze mal darauf beschränkt, dass ich einfache Geraden auf dem Bildschirm habe und einen Kreis mit einem Geschwindigkeitsvektor generiere. Prallt dieser auf wird der Reflexionsvektor berechnet und der Geschwindigkeitsvektor dementsprechend verändert.
Das funktioniert zur Hälfte. Zur Hälfte deshalb, weil ich wohl bei der Reflexionsvektor-Berechnung etwas nicht beachtet habe, worauf ich aber leider nicht komme.
Undzwar haben meine Geraden jeweils eine Reflektierende und eine Durchlässige Seite. Das heißt an einer Seite prallt der Kreis ab, aber kommt er von der anderen Seite, so "flutscht" er durch die Gerade durch.
Bei der Berechnung nutze ich eine Hilfsebene mit Stütz- und 2 Richtungsvektoren. Der Stützvektor ist der Schnittpunkt des Kreises mit der Geraden, der eine Richtungsvektor der Richtungsvektor der Geraden und der 2. Richtungsvektor ein Vektor in Richtung der Z-Ebene. Anhand dessen berechne ich eine Normale usw ... Und hier habe ich herausgefunden, dass, je nach dem, ob der 2. vektor in den Bildschirm hinein, bzw aus dem Bildschirm hinaus zeigt, sich auch die reflektierende und die durchlässige Seite der Geraden austauschen.
Ich füge hier mal den Quellcode der Reflexionsvektorberechnung ein:

Code:
  1.  
  2. function ReflexionsVektor(g: TGerade; v: TVektor): TVektor;
  3. var
  4. h: TEbene;
  5. s1,s2,n,s2e: TVektor;
  6. s1b: Extended;
  7. begin
  8.   h.p:=g.p;
  9.   h.u:=g.u;
  10.   h.v:=vektor(0,0,-1); // je nach dem ob hier der z-wert negativ oder positiv ist drehen sich die Seiten der Geraden
  11.   n := normale(h);
  12.   s1:=v;
  13.   s1b:=vektbetrag(s1);
  14.  
  15.   s2 := vektmult_rv(vektsum(einheitsvektor(s1),einheitsvektor(n)),-1/s1b);
  16.   s2e := einheitsvektor(s2);
  17.  
  18.   result := vektmult_rv(s2e,s1b);
  19. end;
  20.  


angemerkt sei hier, dass vektmult_vr(a,r): TVektor einen Vektor a mit einer reellen Zahl r multipliziert.

Hat evtl jemand eine Idee, wie ich erreiche, dass beide Seiten reflektieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 24, 2005 17:06 
Offline
DGL Member

Registriert: Mi Aug 28, 2002 17:03
Beiträge: 37
Wohnort: ABG
Hi!
Mal unabhängig von deiner Methode hätte ich das ganze so gelöst, das ich jeder Geraden einen Normalvektor verpassen, und dann das Punktprodukt zwischen Normale und Richtungsvektor berechnen würde. Ist das Punktprodukt kleiner als 0.0 dann ist der Ball praktisch von Hinten gekommen.
mfg olli

_________________
Programmieren beginnt im Kopf und endet im Compiler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 02:43 
Offline
DGL Member

Registriert: So Feb 13, 2005 14:50
Beiträge: 4
Ich werde es mal testen, vielen dank für den Tipp !


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]