Abprallverhalten eines Balles
-
Hallo,
Ich würde gerne ne Art Minigolf programmieren und möchte deshalb mal ein fundiertes Testprogramm für Ballphysik schreiben.
Das Problem:
Ein Ball trifft auf einen Balken (der nicht senkrecht oder waagrecht ist!!!) auf und prallt von diesem ab.Mein Physik-Verständnis sagt, mir, dass ich irgendwie den Einfallwinkel berechnen muss, den dann "umdrehe" und als Ausfallwinkel hernehme.
Doch wie setzt ich sowas mit C++ um?m.f.G. Daniel Lang
-
Einfallswinkel = Ausfallswinkel, du musst wohl ne Art Koordinaten System machen, in dem du dann die Begrenzungen des Spielfeldes als Linien einzeichnest, die man dann als Funktion darstellen könnte, als z.b. wäre eine diagonale Linie , dann bewegst du den Ball auch auf der Bahn einer Funktion und wenn er dann die andere Funktion schneidet, d.h. an den Rand stößt, musst du einen neue Funktion für den Ball ausrechen, die z.b. einen anderen Anstieg hat, da gibts ein paar Formeln für. Ich glaub m = tan (alpha) ist eine davon. Ist jetzt vielleicht nicht ganz verständlich und ich würde dann noch trigonometrische Funktionen rein bringen, aber so könnte es vielleicht funktionieren. Auf jeden Fall musst du da mal probieren, ich müsste mich tiefer mit beschäftigen damit ich jetzt alles genau sagen könnte, aber sollte eigentlich kein Problem sein. Kannst mich ja mal bei ICQ kontaktieren wenn du Fragen hast!
ICQ: 167420098
-
Danke schonmal, ich verwende aber kein ICQ
Also Einfallswinkel = Ausfallswinkel, das ist mir auch noch klar.
Momentan brauch ich eigentlich noch nicht mehr, als einen Ball nur an einer schrägen Wand zu reflektieren.Die Geschwindigkeit und Richtung des Balles hab ich durch zwei Variablen vx (verschiebung auf der x-achse) und vy (verschiebung auf der y-achse) definiert.
Diese beiden Variablen könnte man als Vektoren sehen.
Angenommen, ich hätte dann einen normalen-Vektor auf die schräge Wand.
Wie gehts weiter?
-
Naja, du könntest wenn du nen Vektor in X und in Y Richtung hast, einen Resultierenden ausrechnen, über trigonometrische Funktionen!
Und über diesen Resultierenden könntest du wiederum den Anstieg errechnen, also im Prinzip ne Funktion der der Ball folgt, laut f(x) = mx + n, wobei m der Anstieg und n unwichtig.
-
und wie geht das?
-
Die resultierende Geschwindigkeit errechnen?
-
Du musst nicht mal Winkelfunktionen nehmen, es geht auch der Pytagoras:
Hm, ich überleg grad nochmal, eigentlich brauchst du vres gar nicht.
-
Zu allererst ergibt sich eh das Problem, dass du eine Kollision Ball - Balken abfragen musst.
-
Ja, wenn du die Bewegung des Balls und auch die Balken als Funktionen ansiehst, dann kannst du doch einfach die Schnittpunkte berechnen. Ist es denn eigentlich 2D oder 3D?
-
michaelwitzik schrieb:
Ja, wenn du die Bewegung des Balls und auch die Balken als Funktionen ansiehst, dann kannst du doch einfach die Schnittpunkte berechnen.
Nein, denn das ist dann die Kollision des Mittelpunkt des Balles und dem Balken. Der Ball hat aber eine Ausdehnung.
-
Na dann nimmst du nicht die Koordinaten des Balls zur Schnittpunktprüfung sondern gehts z.b. 2 Stellen auf der X Achse und den zugeörigen Y Wert vor und nimmst diesen Punkt zur Prüfung!
-
Sei <a,b> das Skalarprodukt zweier Vektoren a,b (ist der Begriff bekannt?).
Sei n der Normalenvektor der Wand, v der Geschwindigkeitsvektor des Balls.
Dann ist v_n := -<n,v>n die Komponente der Geschwindigkeit, die senkrecht zur Wand steht (Normalenkomponente).
Und v_t := v - v_n ist die verbleibende Tangentialkomponente.
Für die Reflexion muss jetzt lediglich die Normalenkomponente umgedreht werden:
v_n --> -v_n,
die Tangentialkomponente bleibt gleich.
und nun wieder die Komponenten zusammenzählen: v = v_n + v_t. fertig is der reflektierte Geschwindigkeitsvektor!
(funktionert in 2D und 3D gleichermaßen)
Kurz zusammengefasst: v_reflektiert := v + 2<n,v>*n
-
Ähm, sicher dass es bei der Normalenkomponente minus lauten muss?
<n,v> ist, wenn die beiden in unterschiedliche Richtung zeigen (phi > 90 Grad),
ja schon negativ, d.h. dass, wenn man das ganze mit n multipliziert, der passende vektor v_n rauskommt.Dann wäre
v_reflektiert := v - 2*n*<n,v>
oderwenn n nicht die Länge 1 hat.
-
vielen Dank schonmal, ich hoffe ich kann das jetzt noch in C++ umsetzen...