AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Besonderes Abprallen nach Kollision

Ein Thema von TheAn00bis · begonnen am 23. Jun 2006 · letzter Beitrag vom 23. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#1

Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 11:34
Hey,

Ich habe hier ein schon fast mathematisches Problem, für welches ich momentan noch nicht einmal einen Lösungsansatz habe.

Es geht um Kollision in einem Spiel: Ein Ball trifft auf einen Schläger und soll abprallen. (siehe Anhang!) Der Winkel soll dabei von der Position des Auftreffens abhängig sein: Trifft der Ball in der Mitte des Schlägers auf, so wird er orthogonal zum Schläger wegfliegen, ganz außen parallel, dazwischen irgendwas zwischen 0° und 90°.

Die Bewegung des Balles wurde folgendermaßen umgesetzt: TBall hat die Attribute vX und vY für die Geschwindigkeiten und posX und posY für die Positionen. Außerdem gibt es size für die Größe. Die Bewegung ist dabei sehr einfach:

Delphi-Quellcode:
procedure TBall.Update;
begin
   posX := posX + vX;
   posY := posY + vY;
end;
PosX und posY gehen immer von der Ecke links unten des Objekts aus.

Diese Prozedur wird in sehr kurzem Intervall aufgerufen. Der Schläger kann sich auf der x-Achse bewegen, auch er hat die Eigenschaften posX und posY und sizeX, sizeY.

Meine Probleme sind folgende:

Wie kommte ich auf den Ausfallswinkel? Als erstes musss ich den Abstand berechnen, den der Ball von der Mitte hat, dies ist natürlich kein Problem: d = Schläger.posX+Schläger.sizeX/2 - Ball.posX-Ball.size/2. Aber wie komme ich vom Abstand auf den Winkel? Denn ein Abstand von 0 soll ja 90° ergeben, ein Abstand von Schläger.sizeX soll 0° ergeben. Und wenn ich den Winkel habe, wie gebe ich dem Ball dann diese Richtung?
Ich möchte die alte gesamt Geschwindigkeit beibehalten, dazu rechne ich über den Pythagoras v aus: v = sqrt(vx^2+vy^2). Die neue Richtung ergibt sich ja aus dem Verhältnis von vX und vY, aber wie komme ich vom Winkel auf dieses Verhältnis?

Ich würde mich freuen, wenn ihr mir bei einem Lösungsansatz behilflich wäret!
Miniaturansicht angehängter Grafiken
1_207.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 11:59
Ich finde das unrealistisch, wenn der Ball von unten kommt und dann wieder nach unten abprallt, aber ist ja deine Entscheidung.

Dein Schläger hat eine bestimmte Breite. Da der Winkel zwischen 0 und 180° sein kann, oder auch nicht. kannst du jedem Punkt auf deinem Schläger einen Winkel zuweisen. Dazu Teilst du die Länge des Schlägers durch 180 und dann Multiplizierst du den Wert mit dem Aufschlagspunkt. Dann hast du den Winkel.

Aber ich finde der Einfallswinkel sollte gleich dem Ausfallwinkel sein und die Bewegungsrichtung des Schlägers sollte den Ball ablenken.

Ich habs nicht getestet, kann also alles falsch sein.

MfG
freak
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
morri

Registriert seit: 6. Jun 2006
Ort: Wuppertal
106 Beiträge
 
Delphi 7 Professional
 
#3

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 12:05
Ich würde aber allg. im Bogenmaß arbeiten .
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#4

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 12:14
Zitat von freak4fun:
Ich finde das unrealistisch, wenn der Ball von unten kommt und dann wieder nach unten abprallt, aber ist ja deine Entscheidung.

Dein Schläger hat eine bestimmte Breite. Da der Winkel zwischen 0 und 180° sein kann, oder auch nicht. kannst du jedem Punkt auf deinem Schläger einen Winkel zuweisen. Dazu Teilst du die Länge des Schlägers durch 180 und dann Multiplizierst du den Wert mit dem Aufschlagspunkt. Dann hast du den Winkel.

Aber ich finde der Einfallswinkel sollte gleich dem Ausfallwinkel sein und die Bewegungsrichtung des Schlägers sollte den Ball ablenken.

Ich habs nicht getestet, kann also alles falsch sein.

MfG
freak
Jep, funktioniert! Aber wie bekomme ich jetzt aus 180° vX=1, vY=0 bzw aus 90° vX=0, vY=1 bzw. aus 0° vX=-1 vY=0? Also die negativen Werte werde ich wohl über eine if-Abfrage regeln müssen, aber wie komme ich erstmal auf die Werte überhaupt.
Zitat von morri:
Ich würde aber allg. im Bogenmaß arbeiten .
Darin sehe ich keinen Vorteil. Aber wenn du mir einen nennst bin ich gerne bereit meine Meinung zu ändern.
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 12:34
Zitat von TheAn00bis:
Aber wie bekomme ich jetzt aus 180° vX=1, vY=0 bzw aus 90° vX=0, vY=1 bzw. aus 0° vX=-1 vY=0? Also die negativen Werte werde ich wohl über eine if-Abfrage regeln müssen, aber wie komme ich erstmal auf die Werte überhaupt.
Tut mir leid, versteh ich nicht. Was meinst du damit?

Zitat von morri:
Ich würde aber allg. im Bogenmaß arbeiten .
Würden mich die Vorteile auch mal interessieren.

MfG
freak
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#6

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 12:42
Zitat von freak4fun:
Zitat von TheAn00bis:
Aber wie bekomme ich jetzt aus 180° vX=1, vY=0 bzw aus 90° vX=0, vY=1 bzw. aus 0° vX=-1 vY=0? Also die negativen Werte werde ich wohl über eine if-Abfrage regeln müssen, aber wie komme ich erstmal auf die Werte überhaupt.
Tut mir leid, versteh ich nicht. Was meinst du damit?
Die Richtung, in welche der Ball fliegt ergibt sich ja nur aus dem Verhältnis der x-Geschwindigkeit(vX) zur y-Geschwindigkeit(vY), wie ein Richtungsvektor quasi.
Jetzt habe ich den Winkel, der angibt in welche Richtung der Ball fliegt. Aber wie muss ich vX und vY jetzt setzen? Die Geschwindigkeit v habe ich ja wie geschrieben aus den alten vX- und vY-Werten errechnet. Wenn der Winkel jetzt 180° ist soll der Ball ja nur nach links fliegen, also vX=v, vY=0, bei 90° vX=0, vY=v, aber wie berechne ich die Werte für die Winkel die zwischen 0° und 90° liegen, bzw. zwischen 90° und 180° (das wären ja die negierten Werte von 0° bis 90°).
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 12:53
Such mal im Tafelwerk / Formeln und Tabellen nach Koorinatensystem und Anstieg m bzw. Anstiegswinkel Alpha. Hab ich jetzt keine Zeit zu.

MfG
freak
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#8

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 13:26
Ich habs mal über Dreieckssätze versucht zu lösen ^^
Habs jetzt nicht nachgerechnet, ich hoffe aber mal, das ich das richtig gemacht habe.
Also bitte nicht steinigen (Mein Abi ist schon zwei Jahre her und in Mathe war ich nie besonders gut ).

Bitte Fehler korrigieren und mich freundlich zurechtweisen ^^
[edit] Skizze aktualisiert [/edit]
Miniaturansicht angehängter Grafiken
plong_683.png  
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 13:44
Erst einmal ein paar Definitionen: Der Schläger mit der Länge 2a liege auf der x-Achse, sein Mittelpunkt im Ursprung. Der x-Wert des Balles sei b (liegt bei -a <= b <= a auf dem Schläger).
Wenn man sich nun noch einmal das Bild anschaut, sollte ersichtlich sein, dass b der Kosinus des Winkels ist, jedenfalls für a = 1.
Allgemein:
alpha = arccos(b / a)
vom Winkel zum Vektor kommen wir wieder per Sinus und Kosinus:
http://img90.imageshack.us/img90/5488/result7vt.png
(Sogar schon normalisiert)
Und da wir nach Perfektion streben, entfernen wir schnell wieder alle Trigonometriefunktionen:
v_x = b / a
v_y = Sqrt(1 - v_x²) // sin² a + cos² a = 1

@Anubis: Ich würde aber vielleicht nicht nur diesen Kosinus-Vektor benutzen, sondern mit dem echten Spiegelvektor mitteln. Dann hast du eine Mischung aus Realität und Kontrollierbarkeit.
@Bogenmaß: Man muss einfach nichts umrechnen .
[add("Mittagessen war im Weg ")]
@H4ndy: Noja, es geht einfacher .
[/add]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#10

Re: Besonderes Abprallen nach Kollision

  Alt 23. Jun 2006, 14:10
@H4ndy Danke, hätte bestimmt auch geklappt aber Khabarakhs weg ist wirklich einfacher!

@Khabarakh: Vielen Dank! Ist eigentlich wirklich offensichtlich, aber igendwie habe ich gar nicht an Trigometrie gedacht! Ich rechne das jetzt ganz einfach über v*cos(angle) bzw v*sin(angle) aus.

Edit: Achja, was das betrifft:

Zitat:
Ich würde aber vielleicht nicht nur diesen Kosinus-Vektor benutzen, sondern mit dem echten Spiegelvektor mitteln. Dann hast du eine Mischung aus Realität und Kontrollierbarkeit.
Die Bewegung des Paddles spielt auch eine Rolle, ich denke das Handling wird schon ganz gut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 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