Gravitation

Anfängerfragen zum Programmieren mit PureBasic.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Gravitation

Beitrag von Tompazi »

Hi, ich habe folgendes Problem, ich will den "Ball hinunter fallen lassen" und zwar mit linear zunehmender geschwindigkeit das er dann wieder unten abprallt und - jetzt mein problem -, dass er dann wie ein normaler Ball auf der erde es tun würde, immer weniger hoch springen soll und dann irgendwann am boden liegen bleiben sollte.
Wie mache ich das?

hier mal mein Code:

Code: Alles auswählen

InitSprite()
InitKeyboard()
BallX = 10 ; Ballposition X Achse
BallY = 10 ; Ballposition Y Achse
BallYA = 10 ; Ball-anfangs-position Y Achse
tA = Date(); Anfangszeit
sX = 1     ; Geschwindigkeit X Achse
sY = 1 + a     ; Geschwindigkeit Y Achse
OpenScreen(1024,768,32,"Gravi")
Repeat
ClearScreen(000000$)

t = Date()  ; jetztZeit
tI = t - tA + 1 ; Gefahrene Zeit 
v = BallY - BallYA + 1 ; Weg
a = v / tI ; Beschleunigung Y Achse
If sY > 0
sY = 1 + a     ; Geschwindigkeit Y Achse
Else
sY = -1 - a     ; Geschwindigkeit Y Achse
EndIf
If BallX < 0
sX = -sX
EndIf
If BallX > 1024
sX = -sX
EndIf
If BallY < 0
sY = -sY
EndIf
If BallY > 768
sY = -sY
EndIf
BallY + sY
BallX + sX
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor($FFFFFF)
Circle(BallX,BallY,10)
StopDrawing()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(1)
Danke Tompazi

Ps: Weiß nicht wieso aber der ball steigt ein bischen bevor er herunter fällt.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Da musst du einen Reibungsfaktor für den Luftwiderstand in deine Rechnung mit einbeziehen. Wie das aber genau geht, weiss ich leider auch nicht...
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ganz einfach du entziehst dem Ball am aufplallpunkt engergie , also:

Code: Alles auswählen

If BallY > 768 
sY = -sY *0.9
EndIf 
dadurch prallt er nur noch mit 90% der aufplallgeschw. wieder nach oben

Ich denke mal für diese Sache reich diese grobe schätzung der Reibung, kannst den Faktor natürlich verändern

EDIT: habe mein DEin code zu laufen gebracht:

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
BallX.f = 100 ; Ballposition X Achse 
BallY.f = 100 ; Ballposition Y Achse 
sX.f = 5     ; Geschwindigkeit X Achse 
sY.f = 0     ; Geschwindigkeit Y Achse 
a.f = 0.0981    ; Beschleunigung

Reibung.f = 0.9

OpenScreen(1024,768,32,"Gravi") 
Repeat 
ClearScreen(000000$) 

sY + a     ; Gravitation 
BallY + sY 
BallX + sX 

If BallX < 0
 BallX = 0 
 sX = -sX * Reibung
EndIf 
If BallX > 1024 
 BallX = 1024
 sX = -sX * Reibung
EndIf 
If BallY < 0 
 BallY=0
 sY = -sY * Reibung
EndIf 
If BallY > 768 
 BallY = 768
 sY = -sY * Reibung
EndIf 


 StartDrawing(ScreenOutput()) 
  DrawingMode(1) 
  FrontColor($FFFFFF) 
  Circle(BallX,BallY,10) 
 StopDrawing() 
 FlipBuffers() 
 ExamineKeyboard() 
Until KeyboardPushed(1)
Du hattest n paar kleine fehler, jetzt läuft der Code so wie du haben wolltest ;-)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Man müsste doch noch auch die Dichte/Masse des Körpers sowie Material berücksichtigen, wenn man es wirklich realistisch machen will...
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ja logisch, aber da er eh nur n Kreis springn lässt ist das "scheiß egal".

Klar wäre das Material wichtig, wenn man darstellen will wie sich der Körper beim auftreffen verformt oder ob er vllt garnicht mehr hochkommt (sandsack)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Damit der Ball nicht ewig weiterläuft müsste man doch die Reibung bei Kollision auf beiden Achsen berücksichtigen oder?

Code: Alles auswählen

If BallX < 0
		BallX = 0
		sX = -sX * Reibung
		sY * Reibung
	EndIf
	
	If BallX > 1024
		BallX = 1024
		sX = -sX * Reibung
		sY * Reibung
	EndIf
	
	If BallY < 0
		BallY=0
		sY = -sY * Reibung
		sX * Reibung
	EndIf
	
	If BallY > 768
		BallY = 768
		sY = -sY * Reibung
		sX * Reibung
	EndIf
Ich weiß nicht ob das physikalisch korrekt ist aber es funktioniert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Die Luftwiderstandskraft hängt ab von der Geschwindigkeit und der Form des
Objektes, das Material ist egal, die Masse aber auch wieder nicht.

Dazu kommt noch, dass beim Aufprall Energie in Form von Wärme verloren
geht, weil sich die Objekte (Ball und Boden) mehr oder weniger stark
verformen. Das hängt jetzt wiederum nur vom Material ab. Je nach dem wie
leicht sich das Material in seinem elastischen Bereich verformen lässt, ist die
Reibung größer oder kleiner. Dringt die Verformungskraft über den
elastischen Bereich heraus, dann wandelt sich ein Teil der Energie in Wärme
um (siehe Sandsack) und der Ball springt nicht mehr wirklich hoch oder bleibt
sogar einfach liegen.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

lol da könnte mal endlos viele Sachen aufzählen ^^

- Die Gravitationskraft nimmt mit zunehmende Höhe ab
- Wird das Objekt sehr schnell muss mal relativistischen Formeln rechnen da man sonst die Lichtgeschwindigkeit überschreiten würde.
- In alles Gasen/Flüssigkeiten gibt es auch Auftriebskräft die entgegen der Gravitation wirken.
....

@NicTheQuick: Bitte nicht von verlorener Energie reden : "beim Aufprall Energie in Form von Wärme verloren geht"
Sie geht nicht verloren, sie wird nur umgewandelt :wink:

Aber zurück zum Thema, wurde dir (Tompazi) jetzt geholfen ? :roll:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

STARGÅTE hat geschrieben:@NicTheQuick: Bitte nicht von verlorener Energie reden : "beim Aufprall Energie in Form von Wärme verloren geht"
Sie geht nicht verloren, sie wird nur umgewandelt :wink:
Die Formulierung ist nicht falsch, da Bewegungsenergie verloren geht. Und
von der spreche ich ja die ganze Zeit. Und wenn sie in Form von
Wärmeenergie verloren geht, dann heißt das nichts anderes als umwandeln.
Benutzeravatar
50-Pfennig
Beiträge: 75
Registriert: 22.01.2007 22:24
Wohnort: 40764 Langenfeld
Kontaktdaten:

Beitrag von 50-Pfennig »

Also ich würde einfach den Impulserhaltungssatz und den Energieerhaltungssatz anwenden. Dazu braucht man ja aber Massen, die man sich dann ausdenken müsste.
Antworten