Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Gravitation und Kollision (https://www.delphipraxis.net/196819-gravitation-und-kollision.html)

tumo 22. Jun 2018 16:50

Gravitation und Kollision
 
Hallo,

vorab: ich weiß, dass ein "müsstest du doch in der Schule/Studium/irgendwo gelernt haben" eine echt schöne Antwort ist, nur hilft mir das nicht wirklich weiter. Auch in Internetrecherche bin ich unglaublich schlecht (Auch mit Google und Co.). Daher bitte ich darum wenn möglich leicht verständliche Antworten zu geben.

Ich experimentiere gerade mit OpenGL rum und im Zuge dessen auch mit Physik. Da ich gerne eine eigene "Physik-Engine" haben möchte, will ich auch nicht auf eine schon vorhandene zurückgreifen. Sonderlich realistisch muss es nicht sein, Luftwiederstand und ähnliches vernachlässige ich (weil ich's kann :P). Nun habe ich eine Art Flummi programmiert, die mit einer Startposition, -geschwindigkeit und -beschleunigung startet. Sobald der Körper auf den Boden trifft, wird ein Teil der Geschwindigkeit abgezogen und der Rest negiert (also fliegt der Körper dann nach oben), bis die Beschleunigung auch diese wieder umgekehrt hat und so weiter... Das Problem ist nun, dass der Körper nie zum Ruhen kommt, sondern immer weiter eine gewisse Geschwindigkeit erfährt, genug um komische Pixelsprünge zu erzeugen, wenn der Körper fast auf dem Boden ist.

Ich habe eine grobe Vermutung wo das Problem liegen könnte: Das Objekt wird in ca. 15ms Abständen (weil OnIdle) aktualisiert, also Position und Geschwindigkeit. Wenn das Objekt kurz vor dem Boden ist, ist es nach dieser Berechnung unter dem Boden. Bei der Überprüfung, die nach dieser Objektaktualisierung passiert, wird das Objekt exakt auf den Boden gesetzt, hat aber noch die Geschwindigkeit von der kleinen Differenz zwischen der eigentlich berechneten Position und dem Boden. Das bisschen zu viel löst am Ende dieses komische Zittern aus, vielleicht.

Ich stehe echt auf dem Schlauch. Zur Information: 10. Klasse, also erwartet nicht zu viel von meinem Schulwissen. Grundlagen kenne ich schon, aber alles etwas speziellere ist mangelware bei mir.

Wenn ihr Code(-schnipsel) sehen wollt, sagt bescheid.

Mit freundliche Grüßen

Namenloser 22. Jun 2018 17:35

AW: Gravitation und Kollision
 
Zitat:

Zitat von tumo (Beitrag 1405559)
Da ich gerne eine eigene "Physik-Engine" haben möchte

Na da hast du dir ja was vorgenommen.

Ich kann dein Problem nicht ganz nachvollziehen, aber es klingt für mich eher nach einem Bug in deinem Programm als nach einem grundlegenden Problem, obwohl es davon bei Physik-Engines auch genügend gibt.

Zitat:

Sobald der Körper auf den Boden trifft, wird ein Teil der Geschwindigkeit abgezogen und der Rest negiert (also fliegt der Körper dann nach oben), bis die Beschleunigung auch diese wieder umgekehrt hat und so weiter...
Kann es sein, dass das Abziehen das Problem ist? Angenommen, deine aktuelle Geschwindigkeit ist 15 und du ziehst 30 ab. Dann ist deine neue Geschwindigkeit -15. Anschließend negierst du den Wert und bist wieder bei 15.

Probier mal, statt einen festen Wert abzuziehen, den alten Wert mit einem Faktor (z.B. 0.8) zu multiplizieren. Dürfte eh realistischer sein.

Uwe Raabe 22. Jun 2018 17:39

AW: Gravitation und Kollision
 
Zitat:

Zitat von tumo (Beitrag 1405559)
Das Objekt wird in ca. 15ms Abständen (weil OnIdle) aktualisiert, also Position und Geschwindigkeit.

Wenn du mit Zeitintervallen arbeitest, musst du berechnen, welche Position und Geschwindigkeit das Objekt am Ende des Zeitintervalls hat. Wenn innerhalb des Intervalls eine Richtungsumkehr erfolgt, musst du halt ausrechnen, wie die Werte dann sind. Einfach zu diesem Zeitpunkt eine bestimmte Position anzunehmen, die womöglich nicht mal zur Geschwindigkeit passt, kann nicht wirklich funktionieren.

Eventuell musst du das Intervall aufsplitten, in dem du den Aufprallzeitpunkt bestimmst, und dann die beiden Teile einzeln ausrechnen.

gammatester 22. Jun 2018 18:35

AW: Gravitation und Kollision
 
Zusätzlich zu dem bereits Gesagten:

Wenn Du die Physik nicht völlig auf den Kopf stellen willst, kann Dein Körper auch nicht zur Ruhe kommen, wenn Luftwiederstand und ähnliches vernachlässigt werden.

Wegen der Energiehaltung trifft er mit der gleichen Geschindigkeit auf den Boden, mit der er abgehoben hat. Dann kommt Dein Bruchteil q<1 zum tragen, etc. Das heißt nach n Sprüngen hat er q^(n-1) mal die erste Aufschlagsgeschwindigkeit.

IMO solltest Du die Gechwindigkeit = 0 setzen (d.h. der Körper kommt zur Ruhe, kein Zittern), wenn eine bestimmte Grenze unterschritten wird.

Solutor 22. Jun 2018 18:56

AW: Gravitation und Kollision
 
Wie durch die anderen Posts bereits erklärt, ist Deine Lösung eine Quick and Dirty Lösung. Für Demos usw. ausreichend, doch physikalisch eben nicht 100% korrekt. Die Sache mit den Zeitintervallen ist schon der richtige Ansatz. Du musst die Position die der Ball am Ende des Zeitintervalls bnerechnen. Tritt innerhalb des Zeitintervals ein Bodenkontakt auf, so musst du dies berücksichtigen und die Position nach der Reflektion, am Ende des Zeitintervalls berechnen. Doch auch das ist zunächst nur eine Annäherung an die Realität.
Für die Reinbung einfach einen konstanten Geschwindigkeitsbetrag abzuziehen ist auch nicht ganz korrekt. Sinnvoller wäre es den Geschwindigkeitsbetrag um einen bestimmten Faktor zu verringern. Dies kann man auch in jedem Zeitintervall machen, wenn man die Luftreibung näherungsweise simulieren möchte. Auch sollte alle Berechnungen mit Fliesskommawerten durchführen und nur für die Darstellung wieder in Ganzzahlen umwandeln. Dies müsste für Deine Zwecke ausreichen.

Delphi-Laie 22. Jun 2018 19:53

AW: Gravitation und Kollision
 
Da es in dieser Diskussion schon zweimal auftaucht:

Zitat:

Luftwiederstand
Das schmerzt ja fast in den Augen. Leute, das ist ein Widerstand! Der hat nichts mit "wieder", dafür aber mit "wider" zu tun.

gammatester 22. Jun 2018 20:07

AW: Gravitation und Kollision
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1405571)
Da es in dieser Diskussion schon zweimal auftaucht:

Zitat:

xxxxxxxxxxxxxxx
Das schmerzt ja fast in den Augen.

Und durch Deinen Beitrag jetzt schon dreimal :wink:. Sicherheitshalber habe ich das potientielle vierte Mal aus ge-x-t.

Also setze doch einfach Deine Schutzbrille auf und steuere etwas Substantielles zu Diskussion bei.

Bjoerk 23. Jun 2018 10:28

AW: Gravitation und Kollision
 
Der (total) elastische Stoß ist hier ganz nett erklärt. Zu beachten wäre aber noch, daß der Stoß in u/v-Ebene stattfindet und nicht in x/y-Ebene.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 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