Seite 1 von 2

Gravitation

Verfasst: 13.12.2007 19:46
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.

Verfasst: 13.12.2007 20:09
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...

Verfasst: 13.12.2007 20:15
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 ;-)

Verfasst: 13.12.2007 20:38
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...

Verfasst: 13.12.2007 20:42
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)

Verfasst: 13.12.2007 22:45
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.

Verfasst: 13.12.2007 23:07
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.

Verfasst: 13.12.2007 23:24
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:

Verfasst: 14.12.2007 15:05
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.

Verfasst: 16.12.2007 15:11
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.