Und nochmal Kollision - Ball zu Ball
Hi,
hab leider wieder ein Kollisionsproblem. Ich will, dass 2 Bälle kollidieren und dabei realistisch abgeprallt weiterfliegen. Ich hab nun Code gefunden und versucht für mich umzuformen, Ergebnis:
Delphi-Quellcode:
Code wird ausgeführt, sofern die Bälle kollidieren.
CollisionVec.X := ((Self.FPosition.X + Self.FRadius div 2) / 2) + ((Other.FPosition.X + Other.FRadius div 2) / 2);
CollisionVec.Y := ((Self.FPosition.Y + Self.FRadius div 2) / 2) + ((Other.FPosition.Y + Other.FRadius div 2) / 2); Self.FAngle := ArcTan2(CollisionVec.Y - (Self.FPosition.Y + Self.FRadius div 2), (Self.FPosition.X + Self.FRadius div 2) - CollisionVec.X); Momentan fliegen die Bälle bei Kollision aber einfach nurnoch nach Rechts O_o air |
Re: Und nochmal Kollision - Ball zu Ball
Wie wär's wenn du auch den neuen Kurs des 2. Ball setzt? :gruebel:
|
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
Übrigens: 0° in FAngle bedeutet nach rechts ;) air |
Re: Und nochmal Kollision - Ball zu Ball
Ich hatte auch mal Probleme mit den Winkelfunktionen. Da kamen dann immer die falschen Werte raus. Vllt. liegt es ja daran. Wie sieht denn der Ursprungscode aus?
|
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
air |
Re: Und nochmal Kollision - Ball zu Ball
moin,
- hast du an Gradmaß --> Bogenmaß gedacht? - warum teilst du den Radius immer durch zwei? - wie willst du eine Kollision simulieren, wenn du nirgends die Geschwindigkeit / den Bewegungsvektor der Kugeln verwendest? |
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
Zitat:
|
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
Aber zunächst würd' ich mir darüber Gedanken machen, dass die Bälle beim Aufprall Energien (kinetische Energien) austauschen. Es reicht nicht nur die Ausfallswinkel zu bestimmen. Zitat:
|
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
Wenn ich das noch mit DegToRad umziehe ändert sich garnichts ;) Der Radius durch 2, weil in dem Beispiel, das ich gefunden hatte, der Mittelpunkt dastehen sollte, und Mittelpunkt ist eben (X + Radius/2 | Y + Radius/2). Zum 3.: :gruebel: Die Kollision selbst funktioniert ja, nur eben der Abprallwinkel stimmt nicht. Zu der Sache mit der kinetischen Energie: Nunja, kommt drauf an wie man das berechnet. Momentan hätte ich einfach dazu tendiert, den Multiplikator für die Geschw. des anderen Balls zu setzn. Also Ball A hat 3, Ball B 5, dann hat danach Ball A eben 5 und Ball B 3. Ich hatte in der Schule (leider) noch keine Trigo, kommt erst dieses Jahr am Ende, von daher kann ich mich nur an anderen Codes orientieren ;) Den Thread finde ich übrigens grad leider nimmer :pale: |
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
Zitat:
@Airblader: Vielleicht solltest du langsam doch ganz auf Vektoren umstellen :wink: . http://www.tobias-nopper.de/BillardG...physik-de.html |
Re: Und nochmal Kollision - Ball zu Ball
Ich habe mir gestern schon den Vektorartikel auf wiki angesehen, aber irgendwie werde ich nich schlau draus, was ich groß anders mache.
Kenn mich mit Vektoren halt leider praktisch 0 aus *fg* air |
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
|
Re: Und nochmal Kollision - Ball zu Ball
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
air Edit: Ok, ich habe nun alles auf Vektoren umgestellt. Allerdings hilft mir das hier nicht viel weiter, denn ich hab in etwa keine Ahnung was das Skalarprodukt u.ä. ist und mein erster Ansatz mit Hilfe von wiki war da nicht arg viel hilfreicher ;) BigEdit: Also, nach etwas Hilfe hab ich es nun so:
Delphi-Quellcode:
Dass momentan noch etwas unnötiges berechnet wird, weiß ich, aber so scheinen die vektoren zwar in der richtung zu stimmen, jedoch zu lang zu sein (bälle werdn verdammt schnell).
VL2 := sqrt(VecLength);
SpeedVec.X := (1 / VL2) * DistVec.X; /// Speedvec = normiertes m SpeedVec.Y := (1 / VL2) * DistVec.Y; B := Self.FMoveVector.X * SpeedVec.X + Self.FMoveVector.Y * SpeedVec.Y; VecB.X := B * SpeedVec.X; VecB.Y := B * SpeedVec.Y; D := Other.FMoveVector.X * SpeedVec.X + Other.FMoveVector.Y * SpeedVec.Y; VecD.X := D * SpeedVec.X; VecD.Y := D * SpeedVec.Y; VecA.X := Self.FMoveVector.X - VecB.X; VecA.Y := Self.FMoveVector.Y - VecB.Y; VecC.X := Other.FMoveVector.X - VecD.X; VecC.Y := Other.FMoveVector.Y - VecD.Y; VecK.X := VecB.X + VecD.X; VecK.Y := VecB.Y + VecD.Y; Self.FMoveVector.X := VecC.X + VecK.X; Self.FMoveVector.Y := VecC.Y + VecK.Y; Ich häng mal noch die Grafik an, die ich von Master of the Wind bekommen habe und nach der ich das gemacht habe. Edit: Ok, die Richtung stimmt auch nicht :| Ganz großes Edit: Ich glaube nun hab ichs - basierend auf dem Source von BillardGL :) *freu* Ich werd den Code nochmal etwas sortieren, variablen ändern etc. und ihn dann morgen online stellen ;) |
Re: Und nochmal Kollision - Ball zu Ball
jo glaub hab den Fehler, du musst:
VecA.X := VecB.X - Self.FMoveVector.X; VecA.Y := VecB.Y - Self.FMoveVector.Y; für VecD das selbe, schuldigung hab mich vertan...Jetzt müssten aber die Richtungen stimmen... achja und du hast das vergessen: Other.FMoveVector.X := VecA.X + VecK.X; Other.FMoveVector.Y := VecA.Y + VecK.Y; |
Re: Und nochmal Kollision - Ball zu Ball
Das Setzen für den anderen Ball hatte ich auch drin, aber änderte nicht wirklich was ;)
Habs ja nun wie gesagt mit Hilfe des BillardGL Source selber hinbekommen, aber trotzdem Danke für die Hilfe ;) Werde nachher den Code posten. air Edit: So hier isser...hab mich entschlossen, die Variablennamen doch so zu lassen, wie sie in BillardGL auch heißen.
Delphi-Quellcode:
Bei dem *1 kann man jeweils einen Verlustfaktor angeben.
dx, dy, dx2, dy2, richtung, abstand2, skalarp, kraftx, krafty: extended;
... dx2 := Other.FPosition.X - Self.FPosition.X; dy2 := Other.FPosition.Y - Self.FPosition.Y; abstand2 := sqrt(dx2*dx2+dy2*dy2); dx := dx2 / abstand2; dy := dy2 / abstand2; richtung := (Other.FMoveVector.X - Self.FMoveVector.X) * dx2 + (Other.FMoveVector.Y - Self.FMoveVector.Y) * dy2; if richtung < 0 then begin skalarp := 0.9 * (Self.FMoveVector.X*dx+Self.FMoveVector.Y*dy) - (Other.FMoveVector.X*dx+Other.FMoveVector.Y*dy); kraftx := dx * skalarp; krafty := dy * skalarp; Self.FMoveVector.X := (Self.FMoveVector.X - kraftx) * 1; Self.FMoveVector.Y := (Self.FMoveVector.Y - krafty) * 1; Other.FMoveVector.X := (Other.FMoveVector.X + kraftx) * 1; Other.FMoveVector.Y := (Other.FMoveVector.Y + krafty) * 1; end; Nu muss ich das für mich noch umschreiben, dass die Kreise ihre Geschw. behalten und nicht, dass sie immer geändert wird - aber das sollte ich hinbekommen :stupid: Edit: Oder auch nicht :gruebel: Ich müsste doch eigentlich nur diesen Vektor auf der Mittelpunktlinie (im obigen Bild Vektor b also Beispiel) gleichlang haben wie den Bewegungsvektor des Kreises (also V2), oder? Und im BillardGL Code wäre das dann wohl skalarp. Soweit zur Theorie...die Praxis hängt bei mir grad etwas *fg* (Übrigens: Was soll denn das 0.9 als Faktor vor skalarp darstellen? Ein Verlustfaktor kanns eig. nich sein, da der ja später erst dazukommt...) air |
Re: Und nochmal Kollision - Ball zu Ball
Also die 0,9 damit wird der Energieverlust beim Stoß eingerechnet...
|
Re: Und nochmal Kollision - Ball zu Ball
Hab den fehler bei mir gefunden *schäm* hehe, ja beim elastischen massegleichen Stoß tauschen sich einfach die Geschwindigkeitsvektoren, das hab ich falsch gemacht. hier die änderung:
VecK.X := VecB.X + VecD.X; VecK.Y := VecB.Y + VecD.Y; Self.FMoveVector.X := VecC.X + VecK.X; Self.FMoveVector.Y := VecC.Y + VecK.Y; das ist falsch und muss wie folgt sein: Self.FMoveVector.X := VecC.X + VecB.X; Self.FMoveVector.Y := VecC.Y + VecB.Y; Self.FMoveVector.X := VecD.X + VecA.X; Self.FMoveVector.Y := VecD.Y + VecA.Y; So gut, habs nachgecodet, und so funktioniert es (zumindest bei mir) hehe...naja...also Frohe Weihnachten euch allen |
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
Naja...ich würde eig. nurnoch gern rausfinden, wie ich es anstellen kann, dass sich die Geschw.vektoren eben nicht tauschen *fg* Also wenn sie aufeinanderprallen, soll jeder seine Geschw. behalten. Ich denke, die Theorie dafür hab ich (siehe Seite 1 unten), aber irgendwie verzweifel ich an der praktischen Seite. air |
Re: Und nochmal Kollision - Ball zu Ball
Zitat:
|
Re: Und nochmal Kollision - Ball zu Ball
Danke, werd ich mal probieren ;)
Der Sinn ist, dass das ganze ein simpler Teilchensimulator werden soll und da lernt man ja, dass Teilchen beim Aufprall nicht langsamer werden, keine Reibung entsteht etc. air Edit: Danke, scheint zu funktionieren :thumb: |
Re: Und nochmal Kollision - Ball zu Ball
Also ich hab das mal programmiert was du da haben willst..so einen Teilchensimulator. Ich frag mich gerade, wie du das hinbekommen hast, dass das funktioniert, ohne das Stoßgesetz zu beachten. Denn um es wirken zu lassen tauschen sich nunmal die Geschwindigkeiten (actio=reactio). So! Und bei meinem Simulator hab ich lustige Effekte entdeckt. Durch die Ungenauigkeit der Berechnungen, fehlen die Zwischenrechnungen, zum Stoß. Er rechnet quasi mit den Positionen, wenn sich die Kugeln überschneiden, und nicht mit den Positonen, wo sich die Kugeln berühren. Das führt zu Paarbildung, zumindest bei mir. Es bilden sich kurzzeitig paare, aufgrund von wiederholten stößen ineinander, die sich meistens im Kreis drehen. Nach einer gewissen Zeit reicht die neue Geschwindigkeit dann aus, die eine Kugel wieder zu verlassen. Naja ist aber nicht sinn und zweck der sache. Du müsstest anders heran gehen. Etwas komplizierter.
Du musst testen welche Kugeln sich bei der nächsten Rechnung berühren würden. Für diese dann genau den Zeitpunkt und die Koordinaten berechnen lassen, den Stoß berechnen lassen. Ich sehe gewisse Probleme mit der Synchronisierung. Da steckt dann bissl Physik dahinter. du musst halt wissen, wie viel zeit eigentlich zwischen einer Berechnung und der nächsten vergeht, und dementsprechend die obigen Rechnungen ausführen. So das war mein Beitrag. Wenn du willst kann ich dir ja mal mein Programm schicken. |
Re: Und nochmal Kollision - Ball zu Ball
Jap, bei bestimmten Berechnungen habe ich tatsächlich auf diese Paarbildung.
Ist ein ganz simpler Trick: Erst in einer Extraschleife die neuen Positionen berechnen und in einer 2. dann erst die ganzen Kollisionen etc. So können die sich zwar überschneiden, aber die Paarbildung fällt weg, da vor der "Fehlkollisionsberechnung" der Kreis ja wieder entfernt ist. Schwer zu erklären ;) Ich kann dir das Projekt ja schicken, wenn du willst. Ist eh nur ein Test gewesen, das eigentliche Programm schreib ich neu :) air |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz