![]() |
Kollision Ball mit Ball über Winkel
Was ist am folgendem falsch ?
Die Kugeln kollidieren ab und zu sogar ganz richtig. Manchmal gehen sie aber ineinander rein und kollidieren gar nicht. Angle ist in Bogenmass angegeben.
Delphi-Quellcode:
function GetDistanceOfPoints(X1, Y1, X2, Y2: Single): Single; begin result := sqrt(sqr(X1-X2) + sqr(Y1-Y2)); end; procedure CheckCollision(const AIndex: Integer); var i: Integer; LTemp: Single; begin for i := 0 to FBalls.Count-1 do begin if i <> AIndex then begin if GetDistanceOfPoints(TLvBall(FBalls[i]).X, TLvBall(FBalls[i]).Y, TLvBall(FBalls[AIndex]).X, TLvBall(FBalls[AIndex]).Y) - (TLvBall(FBalls[AIndex]).Radius + TLvBall(FBalls[i]).Radius) <= 0 then begin TLvBall(FBalls[AIndex]).Angle := GradToRad(360 + (180 - RadToGrad(TLvBall(FBalls[AIndex]).Angle))); TLvBall(FBalls[i]).Angle := GradToRad(360 + (180 - RadToGrad(TLvBall(FBalls[i]).Angle))); end; end; end; |
Re: Kollision Ball mit Ball über Winkel
|
Re: Kollision Ball mit Ball über Winkel
Ok den Code nochmal, damit es übersichtlicher aussieht bissel umgeschrieben.
Delphi-Quellcode:
1. Ob ich das Ergebnis aus GetDistance mit der Summe der Radien Vergleiche oder ob ich diese Beiden Werte voneinander abziehe und gucke, ob sie kleiner als Null sind ist ja im Prinzip dasselbe
function GetDistanceOfPoints(X1, Y1, X2, Y2: Single): Single;
begin result := sqrt(sqr(X1-X2) + sqr(Y1-Y2)); end; procedure CheckCollision(const AIndex: Integer); var i: Integer; LDistance: Single; LCurrentBall, LBall: TLvBall; begin LCurrentBall := TLvBall(FBalls[AIndex]); for i := 0 to FBalls.Count-1 do begin if i <> AIndex then begin LBall := TLvBall(FBalls[i]); if GetDistanceOfPoints(LBall.X, LBall.Y, LCurrentBall.X, LCurrentBall.Y) - (LBall.Radius + LCurrentBall.Radius) <= 0 then begin LCurrentBall.Angle := GradToRad(360 + (180 - RadToGrad(LCurrentBall.Angle))); LBall.Angle := GradToRad(360 + (180 - RadToGrad(LBall.Angle))); end; end; end; 2. Laut Hilfe gibt es beide RadToDeg und auch RadToGrad 3. (Den Code hab ich hier einfach im Editor umgeschrieben, könnten sich also Fehler eingeschlichen haben) |
Re: Kollision Ball mit Ball über Winkel
Zitat:
Zitat:
|
Re: Kollision Ball mit Ball über Winkel
RadToDeg ändert am Verhalten leider nix.
Ich habe irgendwo noch einen Denkfehler. Wird sich schon mit bissel nachdenken und ausprobieren lösen lassen. :) |
Re: Kollision Ball mit Ball über Winkel
Kugeln prallen voneinander immer senkrecht ab.
Will heissen: sei: r1^ die Bewegungsrichtung Ball1 M1 Mitelpunkt Ball1 M2 Mittelpunkt Ball2 m1m2^ Vektor vom M1 nach M2 dann ist a der Winkel zwischen r1^und m1m2^. dann ist r1neu^=r1^+2a. das selbe gilt für Ball2. Zudem Berechnest Du bei jeder Kollision die neue Richtung für beide Bälle aus, das kann so nicht klappen. Da die Funktion für jeden ball gerufen wird, werden die Richtungen jeweils zweimal geändert. |
Re: Kollision Ball mit Ball über Winkel
Hallo Sidorion
danke für deine Ausführung. Eine Frage was ist a bei r1neu^=r1^+2a. Ich habe meinen Ball so konstruiert, daß ich - den Mittelpunkt - den Radius - den Winkel der Richtung - Geschwindigkeit habe. Vorher sah es so aus. - Mittelpunkt - Radius - Bewegung in X/Y Richtung (die Geschwindigkeit und die Richtung waren darüber geregelt) Vorher hatte ich es so, daß ich einen VX und einen VY hatte, die die Änderung von X und Y angegeben haben. Damit hatte die Kugelkollision geklappt. Wieso ich es umgeändert habe, um einen Winkel reinzukriegen liegt daran, daß ich zusätzliche rechteckige Objekte reingebracht habe an denen auch eine Kollision passieren sollte. Die einfache Kollision war auch dort kein Problem. Ich hatte, aber das Problem, daß der Ball je nach dem wo er auf dem Rechteck auftrifft, in einem anderen Winkel zurückprallen sollte. Zitat:
In a und c sollte es mit einem höherem/niedrigerem Winkel abprallen. Deswegen bin ich dazu übergegangen, die Kollisionen und die Bewegungen mittels eines Winkels zu bestimmen. Ziel: - Kollisionen zwischen Kugeln - Kollisionen zwischen Kugeln und Rechtecken mit obiger Vorgabe Hast du für dieses Vorhaben vielleicht eine bessere/elegantere Idee? |
Re: Kollision Ball mit Ball über Winkel
r1neu^ ist einfach der neue Richtungsvektor von Ball1.
Zum Abprallen von Bällen von Rechtecken gibts hier aber auch einen Tread, bin nur zu faul, Dir den jetzt rauszusuchen :twisted: such mal nach ball prallt von ecke ab. [edit] bin ja nicht so: ![]() |
Re: Kollision Ball mit Ball über Winkel
Zitat:
|
Re: Kollision Ball mit Ball über Winkel
Zitat:
Wie Cöster es richtig erkannt hat, wird dieser Thread mir nicht viel bringen. Mein Problem mit der Methode über ein VX/VY war, daß damit die Geschwindigkeit gleich mitbestimmt ist. Sprich will ich es unter einem völlig anderem Winkel abprallen lassen, dann verändert sich automatisch die Geschwindigkeit der Kugel. Die Variante über die Winkel gefällt mir persönlich im Moment sogar ziemlich gut, nur das ich die Kollision nicht ganz hinbekomme. Ich denke es ist im Moment eher ein mathematisches Problem, bei dem mir noch nicht ganz bewusst geworden ist, wo es hapert. Abprallwinkel := 180 - Winkel scheint mir richtig....wie gesagt scheint....da es nicht ganz passt Edit: Ich überlege gerade, ob ich die ganze Methodik nicht ändere. Eventuell mache ich es über fiolgende Vorgehenweise. KugelA prallt an KugelB - ich bestimme den Aufprallpunkt auf KugelB - lege eine Tangente an diesen Punkt - lasse KugelA an dieser Tangente abprallen ...wie ich das genau mathematisch realisiere weiss ich noch nicht. Muss es halt mal überdenken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz