Reflektion an Wand

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
amateur
Beiträge: 3
Registriert: 11.09.2010, 14:34

Reflektion an Wand

Beitrag von amateur »

Hallöchen :)

Also ich hab nen Ball der in nem Rechteck herum bounced ;) Der Ball soll, wenn er an eine Wand kommt, von dieser Reflektiert werden (Einfallwinkel == Ausfallwinkel). Zu dem Ball ist die x u. y Koordinate und der Winkel zwischen x-Einheitsvektor und des Bewegungsvektors bekannt (alpha)

So, dann hab ichs eigtl. so hergeleitet, dass bei einer Reflektion in x-Richtung (rechts/links) der neue Winkel 180 - alpha ist, bei y-Richtung (oben/unten) -a. Dabei wurde entsprechend 360 gekürzt wenn dies vorkam, da es sich um eine vollständige Drehung handeln würde.

Code: Alles auswählen

void Robutton::reflect(const Object* rhs) 
{ 
	switch (rhs->get_type())
	{
	case AREA:
		{
			const sf::Vector2i size(static_cast<const Area*>(rhs)->getSize()); // Außmaße des Rechtecks holen 
			const bool reflect_x(m_position.x < 0 || m_position.x > size.x); // oben/unten oder rechts/links?
			setAngle(reflect_x ? (180 - m_angle) : (-m_angle)); // Winkel entspr. Herleitung setzen
		} break;
	}
}
Funktioniert auch eigtl. soweit gut, wird schön Reflektiert. Leider kommt es nach einer gelegentlich dazu, dass der Ball außerhalb des Spielfelds gerät, d.h. der Winkel spinnt.

Sieht jemand nen Fehler bei der Formel?
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von Krishty »

Warum der Ball außerhalb des Spielfeldes gerät, kann ich dir nicht sagen – ich wollte aber nur mal loswerden, dass ich das Rechnen mit Winkeln ziemlich anstrengend finde, vor allem weil es viele trigonometrische Funktionen benutzt … da du ja eh den Bewegungsvektor kennst, wäre die Lösung per Vektorrechnung vielleicht sauberer (und dadurch auch einfacher zu debuggen).

Du brauchst eine Funktion für das Skalarprodukt, dann kannst du einen beliebigen Vektor an einer beliebigen Ebene spiegeln:
V' = V - (2 × (N • V) × V)
Wobei V der Bewegungsvektor ist und N der Normalenvektor der Ebene (in Einheitslänge). Dann brauchst du nicht mehr zwischen horizontaler und vertikaler Spiegelung unterscheiden und es funktioniert in allen Raumdimensionen (denn spätestens, wenn man später was in 3D machen will, sind Winkel quasi unbrauchbar). Auch hat sich der Algorithmus bewährt; während ich bei den Winkeln nicht auf die Schnelle sagen kann, ob sie immer tun, was man beabsichtigt (insbesondere, falls die Werte numerisch instabil werden, z.B. bei sehr langsamen Bewegungen).

Gruß, Ky

P.S.: Es gibt leider keine Reflektion, nur die unintuitive Reflexion.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
amateur
Beiträge: 3
Registriert: 11.09.2010, 14:34

Re: Reflektion an Wand

Beitrag von amateur »

Schön wäre es ;) Ist leider kein Spiel sondern nur ne Simulation und da brauch ich genau diesen Winkel ;) Jedes mal zu berechnen wäre wahrscheinlich rechenintensiver ... :(
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Reflektion an Wand

Beitrag von eXile »

amateur hat geschrieben:Funktioniert auch eigtl. soweit gut, wird schön Reflektiert. Leider kommt es nach einer gelegentlich dazu, dass der Ball außerhalb des Spielfelds gerät, d.h. der Winkel spinnt.
Lass mich raten … was passiert, wenn der Ball zufälligerweise so weit aus dem Rechteck herausgetreten ist, dass selbst die Bewegung in reflektierter Richtung im nächsten Frame den Ball nicht mehr in das Rechteck hineinholen kann? Dies tritt insbesondere sehr leicht in den Ecken auf.

Wenn das der Fall ist, solltest du für Kollisionserkennung die Verbindungsstrecke zwischen der Position im letzen Frame und im aktuellen Frame benutzen. So kannst du auch eine doppelte Relexion in einer Ecke in einem einzigen Frame korrekt verarbeiten. (Hier sollte man vielleicht doch die Annahme treffen, dass die Simulationszeit so schnell vergeht, dass nicht mehr als zwei Kollisionen in einem Frame auftreten können. Meiner Meinung nach eine vernünftige Annahme.)

Nachtrag an Krishty: Ich bin irgendwie mit deiner Notation unzufrieden :lol:. Ich hätte lieber geschrieben:
V' = V - (2 • (N • V) • V)
Denn das sind nun einmal alles Punktprodukte, und man kann sich leicht mit dem Kreuzprodukt verhaspeln. Aber das hätte man durch lesen der Formel ja vermieden. Also eigentlich egal ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von Krishty »

eXile hat geschrieben:Denn das sind nun einmal alles Punktprodukte, und man kann sich leicht mit dem Kreuzprodukt verhaspeln. Aber das hätte man durch lesen der Formel ja vermieden.
Stimmt, aber als ich das letzte Mal jemanden mit der Formel habe hantieren sehen, kam er nicht drauf klar, dass das eine Skalare sind und das andere Vektoren … dem wollte ich mit traditionell anmutender Notation vorbeugen. Die Ball-Sprung-zu-groß-Theorie klingt übrigens sehr plausibel.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
amateur
Beiträge: 3
Registriert: 11.09.2010, 14:34

Re: Reflektion an Wand

Beitrag von amateur »

Nja das könnte da Problem sein, das schlicht ein Zweitesmal gedreht wird, weil er noch außerhalb ist ;) Lösung wäre wohl am einfachsten die Geschwindigkeit zu drosseln, oder?

Stimmen denn die Formeln ansonsten?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Reflektion an Wand

Beitrag von eXile »

amateur hat geschrieben:Nja das könnte da Problem sein, das schlicht ein Zweitesmal gedreht wird, weil er noch außerhalb ist ;) Lösung wäre wohl am einfachsten die Geschwindigkeit zu drosseln, oder?
Ich kann dir für jede Geschwindigkeit > 0 einen Fall (nahe einer Ecke) konstruieren, wo es nicht mehr funktioniert. Das Verfahren ist einfach unsauber, und die Geschwindigkeit zu drosseln ist ein Hack, außer man macht sinnvolle Annahmen (siehe mein vorheriger Post mit den max. zwei Reflexionen). :)
amateur hat geschrieben:Stimmen denn die Formeln ansonsten?
Ich frage mich irgendwie, warum du gar nicht den Radius des Kreises für deine Reflexionen mit einbeziehst. Das ist doch eigentlich dafür notwendig, oder?

In Paint hatte ich gerade irgendwie die Reflexion nicht hinbekommen, wahrscheinlich ist es einfach zu spät :lol:. Aber wenn dein Code fast immer funktioniert (bis auf den genannten Fehlerfall), bin ich doch zuversichtlich, dass deine Herleitung korrekt ist. ;)

So weit ich das sehe, kriegst du auch mit Überläufen hier noch keine Probleme, da solange der Ball wirklich nur im Recheck sich in etwas Kreisförmigen bewegt, bei einer Volldrehung nichts hinzugefügt oder abgezogen wird (d.h. plus/minus 0° und nicht so etwas wie +360° oder -720°). Vielleicht solltest du das trotzdem noch einmal nachprüfen, da ich zu dieser Uhrzeit nicht voll einsatzfähig bin ;)
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

amateur hat geschrieben:Schön wäre es ;) Ist leider kein Spiel sondern nur ne Simulation und da brauch ich genau diesen Winkel ;) Jedes mal zu berechnen wäre wahrscheinlich rechenintensiver ... :(
Ach ja? Wo fuer? Und was ist "jedes Mal"? Wie oft reflektieren die Baelle denn bei dir?
joeydee
Establishment
Beiträge: 1043
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von joeydee »

Bei mir sieht die Formel so aus:
v'= 2 • (-v • n) • n + v
amateur hat geschrieben:Schön wäre es ;) Ist leider kein Spiel sondern nur ne Simulation und da brauch ich genau diesen Winkel ;) Jedes mal zu berechnen wäre wahrscheinlich rechenintensiver ... :(
In einer Physik-Simulation (was spielt das für eine Rolle ob die Simulation für ein Spiel oder für eine wissenschaftliche Arbeit ist?) wird das eigentlich über Vektoren gemacht, nicht über Winkel. Wenn man einen Winkelwert braucht, wird der nachträglich berechnet. Ist auch gar nicht so aufwändig: im Zwischenergebnis v • n steckt schon der Cosinus des Winkels zwischen diesen beiden Vektoren (musst noch durch die Länge des Bewegungsvektors teilen, Normale ist ja schon Länge 1). Da stimmt sogar der Satz "Enfallswinkel==Ausfallswinkel" exakt, da das Punktprodukt nicht zwischen "rechts davon" und "links davon" unterscheidet.

Ist das Rechteck immer Axis-aligned? Sieht mir ganz so aus. Dann kehre doch einfach bei einem Überschreiten einer Grenze den entsprechenden Teil des Bewegungsvektors um, das wäre die einfachste Lösung. auf die Schnelle:
if(ball.x-ball.rad<0 || ball.x+ball.rad>size.x)ball.vx*=-1;
if(ball.y-ball.rad<0 || ball.y+ball.rad>size.y)ball.vy*=-1;

Nein, das ist kein Billig-Trick ;-), nur ein aufgelöster Sonderfall der Vektorformel: da bei den achsenparallelen Normalen immer eine 0 drin vorkommt kann man einiges wegfallen lassen.

P.S.: Falls du eine Herleitung dieser Formel inkl. Zeichnung brauchst, da finde ich diesen Artikel ganz gut: http://wiki.delphigl.com/index.php/Reflexion
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Reflektion an Wand

Beitrag von eXile »

joeydee hat geschrieben:Bei mir sieht die Formel so aus:
v'= 2 • (-v • n) • n + v
Dies ist zu der original von Krishty genannten Formel äquivalent. Schön, dass wir alle uns zustimmen :lol:.
joeydee hat geschrieben:Ist das Rechteck immer Axis-aligned? Sieht mir ganz so aus. Dann kehre doch einfach bei einem Überschreiten einer Grenze den entsprechenden Teil des Bewegungsvektors um, das wäre die einfachste Lösung. auf die Schnelle:
if(ball.x-ball.rad<0 || ball.x+ball.rad>size.x)ball.vx*=-1;
if(ball.y-ball.rad<0 || ball.y+ball.rad>size.y)ball.vy*=-1;
Davon bin ich ausgegangen. Aber dieses Verfahren hat denselben Haken, den ich oben beschrieben hatte :)
joeydee
Establishment
Beiträge: 1043
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von joeydee »

eXile hat geschrieben:
joeydee hat geschrieben:Bei mir sieht die Formel so aus:
v'= 2 • (-v • n) • n + v
Dies ist zu der original von Krishty genannten Formel äquivalent. Schön, dass wir alle uns zustimmen :lol:.
Dann kannst du sicher auch meinen Denkfehler finden, darfst dann auch gleich nochmal darüber laut lachen wenn dir danach ist: wenn s=-2*(v•n), dann lautet die erste Formel v'=v+(s*v), die zweite dagegen v'=v+(s*n).

Nicht schön dass du meinen Post durch die Smilies indirekt quasi als nutzlos darstellst. Mir ging es nur darum, den Fragesteller vom Vorteil der Vektor- gegenüber der Winkelrechnung zu überzeugen und zu zeigen wie stark man das vereinfachen kann, deshalb auch das Zitat worauf ich mich bezog.

P.S.: zudem fällt mir gerade auf: du schlägst als Lösung des Timing-Problems vor, zwei Kollisionen anzunehmen. Genau das tue ich eigentlich, wenn auch achsenselektiert. Konnte jetzt auf die Schnelle noch keinen Fall nachvollziehen wo das schiefgeht. Du sagst du kannst einen Fall konstruieren - kannst du mir mal deine Werte für Rechteck, Position, Radius und Geschwindigkeitsvektor geben?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Reflektion an Wand

Beitrag von eXile »

joeydee hat geschrieben:
eXile hat geschrieben:
joeydee hat geschrieben:Bei mir sieht die Formel so aus:
v'= 2 • (-v • n) • n + v
Dies ist zu der original von Krishty genannten Formel äquivalent. Schön, dass wir alle uns zustimmen :lol:.
Dann kannst du sicher auch meinen Denkfehler finden, darfst dann auch gleich nochmal darüber laut lachen wenn dir danach ist: wenn s=-2*(v•n), dann lautet die erste Formel v'=v+(s*v), die zweite dagegen v'=v+(s*n).
Oh herrje ... mea culpa :oops:. Das hatte ich überlesen.
joeydee hat geschrieben:Nicht schön dass du meinen Post durch die Smilies indirekt quasi als nutzlos darstellst.
Smilies stellen eine postverfreundlichende Maßnahme dar und sind dahin inhärent ungeeignet, um negative Aspekte dem Postersteller oder dessen Rezipienten zuzuschreiben :)
joeydee hat geschrieben:Mir ging es nur darum, den Fragesteller vom Vorteil der Vektor- gegenüber der Winkelrechnung zu überzeugen und zu zeigen wie stark man das vereinfachen kann, deshalb auch das Zitat worauf ich mich bezog.
Das ist auch absolut sinnvoll! ;)
joeydee hat geschrieben:P.S.: zudem fällt mir gerade auf: du schlägst als Lösung des Timing-Problems vor, zwei Kollisionen anzunehmen. Genau das tue ich eigentlich, wenn auch achsenselektiert. Konnte jetzt auf die Schnelle noch keinen Fall nachvollziehen wo das schiefgeht. Du sagst du kannst einen Fall konstruieren - kannst du mir mal deine Werte für Rechteck, Position, Radius und Geschwindigkeitsvektor geben?
Ich habe das natürlich nicht selber implementiert, sondern alles im Kopf durchdacht. Aber betrachte es einfach mal so: Der erste Frame dauere 10 Sekunden, und somit fliegt der Ball meilenweit aus dem Recheck, z.B. genau ganz weit rechts von diesem. Alle darauffolgenden Frames dauern nun nur eine Millisekunde. Der Ball wird immer an der Stelle ganz weit rechts "rumwackeln", weil in jedem Frame das Vorzeichen in x-Richtung negiert wird, aber er wird niemals den Weg zurück ins Rechteck finden.

Das liegt daran, dass dieses Verfahren auch eigentlich keine Kollisionserkennung mit dem Rand des Rechtecks im engeren Sinne ist. Es ist eine Kollisionserkennung mit dem Raum außerhalb des Rechtecks.

Ich habe den noch schwerwiegenderen Fall einer misslungenen Eckkollision auch einmal zu Papier gebracht.
Bild
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von Schrompf »

Wow, DAS ist mal großes Kino in Posting-Form! You made my evening!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von Aramis »

Manchmal, aber wirklich nur manchmal, wuensche ich mir so einen kleinen 'Like'-Button auf ZFX :-)
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

Ich nicht, weil die Ausfuehrungen ziemlicher Unsinn waren. Reines Spiegeln reicht voellig aus, Kollisionspunkte berechnen braucht man nicht. Wenn ich einen Punkt, der hinter der Wand ist, an dieser spiegele, liegt er ja schliesslich wieder davor. Das heisst der Ball, kann nie hinter der Wand landen wenn alles korrekt implementiert ist.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Reflektion an Wand

Beitrag von eXile »

TGGC hat geschrieben:Ich nicht, weil die Ausfuehrungen ziemlicher Unsinn waren. Reines Spiegeln reicht voellig aus, Kollisionspunkte berechnen braucht man nicht. Wenn ich einen Punkt, der hinter der Wand ist, an dieser spiegele, liegt er ja schliesslich wieder davor. Das heisst der Ball, kann nie hinter der Wand landen wenn alles korrekt implementiert ist.
Nein TGGC, du liegst hier im Irrtum: Meine Analyse von joeydees Verfahren in obiger Abbildung ist korrekt; und es gibt einen kleinen Unterschied zwischen einem mathematisch korrektem Verfahren und "ziemlichen Unsinn". ;)

Das mit den Kollisionspunkten wird spätestens dann notwendig, wenn man die AABBs wegwirft oder dynamische Objekte mit ins Spiel kommen. Auch ist es bei meinem Verfahren sehr viel einfacher, die epsilon-Korrektur unterzubringen (nur zur Info: Hier ist von einer Simulation die Rede), denn die eigentliche Kollision wird in der Regel ja erst ab der äußeren epsilon-Umgebung der AABB erkannt.

Den eigentlichen Knackpunkt hast du nicht erkannt:
Kollisionsverfahren, die nicht global (die Position selber), sondern auf den lokalen Eigenschaften (hier: die Ableitung der Position nach der Zeit, d.h. die Geschwindigkeit) die Kollision zu beheben Versuchen, sind als solche sehr anfällig für Instabilitäten. Selbst in kommerziellen Physik-Engines sieht man das manchmal. Ob man jetzt den Schnittpunkt genau ausrechnet, sich aus Spaß die Householderreflektoren für mehrere hintereinandergeschaltete Reflexionen ausrechnet oder einfach nur spiegelt, ist dabei egal. :)
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

Bla.

Fuer Reflektion ist der Kollisionspunkt ist nie notwendig. Wichtig ist nur die Reihenfolge, in der man kollidiert. In diesem Spezialfall ist auch die unwichtig, da n1*n2= 0. Also kein Grund fuer dein Aufheben. Das ist unsinnig, da die Frage schon im ersten Post korrekt beantwortet war.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Reflektion an Wand

Beitrag von eXile »

Die Ball-Sprung-zu-groß-Theorie habe ich erst danach gepostet :)

Ach komm, sei doch nicht so griesgrämig und lass anderen doch auch ihren Spaß ;) Du solltest wissen, dass einige, insbesondere ich, sehr häufig über die Fragestellung hinausschießen und das auch aus gutem Grunde: To boldly go where no man has gone before. Wenn man hier nur mit Scheuklappen die Frage beantworten würde, und keine kleinen Takeaways, Bilder, weiterführenden Erklärungen, Lösungsansätze und Hintergrundinformationen einstreuen würde, könnte man das Forum gleich dicht machen. Eine schöne Diskussion zu haben, ist doch toll :lol:

Von meiner Seite aus wärs das erstmal, sollte der Threadersteller noch fragen haben, werde ich mich aber natürlich wieder melden ;)
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

Du kannst ja gern weiterdiskutieren. Aber bitte ohne zu behaupten, alle vorherigen Loesungen waeren falsch.
Alexander Kornrumpf
Moderator
Beiträge: 2110
Registriert: 25.02.2009, 13:37

Re: Reflektion an Wand

Beitrag von Alexander Kornrumpf »

TGGC hat geschrieben:Du kannst ja gern weiterdiskutieren. Aber bitte ohne zu behaupten, alle vorherigen Loesungen waeren falsch.
Ulkig, dasselbe wollte ich zu dir sagen.
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

Alexander Kornrumpf hat geschrieben:
TGGC hat geschrieben:Du kannst ja gern weiterdiskutieren. Aber bitte ohne zu behaupten, alle vorherigen Loesungen waeren falsch.
Ulkig, dasselbe wollte ich zu dir sagen.
Ich habe nur exiles Ausfuerhungen als unsinnig bezeichnet. Seine Loesung ist unnoetig kompliziert, nicht falsch - und das habe ich auch nicht behauptet.
Benutzeravatar
Eike Anderson
Moderator
Beiträge: 34
Registriert: 28.02.2009, 15:52
Alter Benutzername: Swordfighter

Re: Reflektion an Wand

Beitrag von Eike Anderson »

TGGC hat geschrieben:Bla.
Fuer Reflektion ist der Kollisionspunkt ist nie notwendig.
Dies ist eine Vereinfachung fuer die hier beschriebene Situation, die aber nicht allgemeingueltig ist. Es gibt durchaus Situationen, in denen fuer die Berechnung von Reflexion der Kollisionspunkt berechnet werden muss.
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

Eike Anderson hat geschrieben:
TGGC hat geschrieben:Bla.
Fuer Reflektion ist der Kollisionspunkt ist nie notwendig.
Dies ist eine Vereinfachung fuer die hier beschriebene Situation, die aber nicht allgemeingueltig ist. Es gibt durchaus Situationen, in denen fuer die Berechnung von Reflexion der Kollisionspunkt berechnet werden muss.
Nein.
Benutzeravatar
Eike Anderson
Moderator
Beiträge: 34
Registriert: 28.02.2009, 15:52
Alter Benutzername: Swordfighter

Re: Reflektion an Wand

Beitrag von Eike Anderson »

TGGC hat geschrieben:
Eike Anderson hat geschrieben:
TGGC hat geschrieben:Bla.
Fuer Reflektion ist der Kollisionspunkt ist nie notwendig.
Dies ist eine Vereinfachung fuer die hier beschriebene Situation, die aber nicht allgemeingueltig ist. Es gibt durchaus Situationen, in denen fuer die Berechnung von Reflexion der Kollisionspunkt berechnet werden muss.
Nein.
ist das so?
Wie bitte soll denn dann eine Reflexion an einer gekruemmten Oberflaeche berechnet werden, fuer die man eine Tangente als Reflexionsebene benoetigt... und um diese zu berechnen brauch man den Punkt, an dem die Kollision stattfindet... oder verstehe ich die Bedeutung von Kollisionspunkt falsch?
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

Eike Anderson hat geschrieben:Wie bitte soll denn dann eine Reflexion an einer gekruemmten Oberflaeche berechnet werden, fuer die man eine Tangente als Reflexionsebene benoetigt... und um diese zu berechnen brauch man den Punkt, an dem die Kollision stattfindet... oder verstehe ich die Bedeutung von Kollisionspunkt falsch?
Jetzt sagst du selbst, das man den Kollisionspunkt nicht braucht, sondern nur die Tangente.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2366
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von Jonathan »

Ach, sowas ist doch jetzt albern. Wenn die Tangente direkt vom Kollisionspunkt abhängt und man die Tangente für die Reflexionsberechnung braucht, braucht man den Kollisionspunkt um an die Tangente zu kommen und somit die Kollision auszurechnen.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von TGGC »

Jonathan hat geschrieben:Wenn die Tangente direkt vom Kollisionspunkt abhängt
Die Tagente koennte aber auch von was anderem abhaengen, d.h. wir haben wieder einen speziellen Fall. Auch die Reihenfolge in der man kollidiert, kann man vielleicht manchmal mit dem Kollisonspunkt ausrechnen. Na und? Fuer die eigentliche Spiegelung braucht man den Kollisionspunkt nicht, und deswegen ist es Unsinn zu sagen, das die Formeln zum Spiegeln nicht funktionieren und sie alle "denselben Haken" haetten. Und die mit dem riesigen Bild angekuendigte Loesung (Schnittpunkt finden, Reststrecke spiegeln, Reststrecke zu Kollsionspunkt addieren) ist einfach nur unnoetig kompliziert, da das simple Spiegeln des Endpunktes genau das gleiche Ergebnis errechnet.

So, dann mal noch viel Spass beim Spiegeln...
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von Krishty »

Mal eine möglicherweise ganz dumme Frage: Ein Ball legt in einer bestimmten Zeit, die wir Frame nennen, eine bestimmte Strecke zurück, abhängig von seiner Geschwindigkeit. Wenn der Bewegungsvektor einfach gespiegelt wird, ohne den Punkt der Kollision zu bestimmen (egal, ob in Zeit oder in Raum, ist ja quasi das gleiche), hat der Ball dann nicht innerhalb des Frames eine viel zu große / zu kleine Strecke zurückgelegt?

Könntet ihr vielleicht mal ein Bildchen zeichnen, wie ihr euch die Bewegung eines durch Spiegelung reflektierten Balls vorstellt?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von Zudomon »

@Krishty
Da hast du Recht! Wenn man es ganz exakt machen möchte, dann müsste man hier unterscheiden zwischen Position und Geschwindigkeit. Während die Geschwindigkeit direkt gespiegelt würde ( was garnicht der Fall ist, sobald man Materialeigenschaften einfließen lässt, da dann die Reflektion eine Interpolation zwischen reiner Reflektion und Diffuse gestreut darstellen würde ), müsste man um auf die Position zu kommen genauer hinschauen.
Also Position += Geschwindigkeit * Zeitdelta. Das was da aufaddiert wird könnte man dann als kinetische Energie bezeichnen. Diese Strecke könnte allerdings durch besagte Kollision unterbrochen werden, also würde nur ein Teil der Strecke zurück gelegt. Es würde ein Energie Rest bleiben der dann z.B. in die dabei neu entstehenden Richtung eingerechnet werden könnte. Dabei stellt das ganze ja eine Rekursion dar. Denn die Reststrecke muss schließlich wieder auf Kollision geprüft werden. Eigentlich ist das auf dem eXile ja auch so beschrieben.
Naja, wie gesagt, das alles nur wenn man es exakt haben möchte.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Reflektion an Wand

Beitrag von CodingCat »

Naja, es ist halt die Frage, wie man spiegelt, mit der bisher genannten Formel geht das natürlich nicht einfach so. Leichte Modifkation ermöglicht aber tatsächlich eine Spiegelung der Position an einer Ebene, mit p' = p - 2 * (p * n - d) * n wird man wie TGGC anmerkt in diesem Fall durchaus unabhängig von der vergangenen Framezeit präzise Ergebnisse erhalten. Das Problem dabei ist nur, dass man sich jetzt darüber streiten kann, ob da die Position des Schnittpunktes mit der Ebene über das d nun implizit mit drin steckt oder nicht. :mrgreen:

So oder so handelt es sich um einen Spezialfall bei Spiegelung an einer bzw. in diesem Fall mehreren orthogonalen Ebenen, sobald diese Voraussetzung wegfällt, kommt man um eXiles bildreich illustrierte Ausführungen wohl kaum drumrum.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten