AGB  ·  Datenschutz  ·  Impressum  







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

Gravitation und Kollision

Ein Thema von tumo · begonnen am 22. Jun 2018 · letzter Beitrag vom 23. Jun 2018
Antwort Antwort
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#1

Gravitation und Kollision

  Alt 22. Jun 2018, 17:50
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 ). 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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Gravitation und Kollision

  Alt 22. Jun 2018, 18:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Gravitation und Kollision

  Alt 22. Jun 2018, 18:39
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: Gravitation und Kollision

  Alt 22. Jun 2018, 19:35
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.
  Mit Zitat antworten Zitat
Solutor

Registriert seit: 24. Dez 2017
15 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: Gravitation und Kollision

  Alt 22. Jun 2018, 19:56
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.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

AW: Gravitation und Kollision

  Alt 22. Jun 2018, 20:53
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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#7

AW: Gravitation und Kollision

  Alt 22. Jun 2018, 21:07
Da es in dieser Diskussion schon zweimal auftaucht:

Zitat:
xxxxxxxxxxxxxxx
Das schmerzt ja fast in den Augen.
Und durch Deinen Beitrag jetzt schon dreimal . 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.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Gravitation und Kollision

  Alt 23. Jun 2018, 11:28
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:56 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