Physikalisch korrekter Wurf

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

sbrog

Betreff: Physikalisch korrekter Wurf

BeitragMo, Jul 05, 2004 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Kennt jemand Artikel und Formeln über dieses Thema ? Wär echt mal spannend so was zu proggen Very Happy
  • Zuletzt bearbeitet von sbrog am Mo, Jul 05, 2004 20:28, insgesamt einmal bearbeitet
 

Blitzkrieg Bop

BeitragMo, Jul 05, 2004 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Hast du kein Tafelwerk/ Formelsammlung ?
Da steht so ne Formel drin...
~ Hey Ho Let's Go ~

sbrog

BeitragMo, Jul 05, 2004 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider nicht, abgesehen davon, ich versteh bei so Formeln nur die Hälfte.

Lord_Vader

BeitragMo, Jul 05, 2004 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey ich kämpfe mich auch mit Physik ab Smile

Nein mal ehrlich das was du meinst is ne kurve, parabel oder wie man das nennt, ne quadratische gleichung.

f(x)= 2x+1 2x ist die scalierung das heisst die kugel fliegt 2mal so hoch aber noch gleich weit. +1 ist nur der startpunkt der y achse.

x ist halt die weite, für die setzte den wert ein und rechnest. Dann haste die höhe der kugel auf der bestimmten x koordinate Smile Mathe 10. Schuljahr Very Happy
 

Edlothiol

BeitragMo, Jul 05, 2004 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das war jetzt eine lineare Gleichung Rolling Eyes
Wenn man einen Gegenstand wirft, fliegt er wie schon gesagt in einer Parabel. Die Gleichung sieht so aus:
y = x² + px + q
Für p und q muss man eben passende Werte einsetzen. Mathe 9. Schuljahr Wink

sbrog

BeitragMo, Jul 05, 2004 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
f(x)= 2x+1 2x


was bedeutet denn das 2x ? Meinst du f(x) = 2x +1 * 2x ???

Wie ich das sehe, ist das wohl nur die halbe Wahrheit.

Irgendwie muss doch auch die Wurfstärke, die Erdanziehungskraft , die Wurfhöhe und der Abschusswinkel berücksichtigt werden.[/quote]

Lord_Vader

BeitragMo, Jul 05, 2004 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry natürlich ² ^^ Nein aber sonst hats gestimmt bei meiner gleichung, und wir hatten es im 10. Razz

f(x) ist das selbe wie y Smile

D2006

Administrator

BeitragMo, Jul 05, 2004 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich das programmieren müsste (und das habe ich schon):

ich hab die Variablen x und y des Objekts.
Ich füge die Variable x_speed# und y_speed# hinzu.

wenn ich jetzt ein Objekt werfen will, dann:

y_speed# = abschussgeschwindigkeit * sin ( abschusswinkel )
x_speed# = abschussgeschwindigkeit * cos( abschusswinkel )

Der Luftwiderstand und die Reibung sei vernachlässigt.
Während des Flugs bleibt x_speed# bis zum auftreffen konstant!
y_speed# nimmt immer um einen bestimmten Wert zu (Gravitationskonstante).

Das war mein Vorschlag. Aber ihr könnt gerne mal zeigen, wie ihr das mit ner Funktion lösen wollt (stell' ich mir recht umständlich vor).
Ürbigens wenn man wie gesagt die Reibung vernachlässigt ist dieser Wurf physikalisch korrekt. Schwierig wird es halt nur wenn man schräge Wände programmieren will.

MfG
D2006

Michi1988

BeitragMo, Jul 05, 2004 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube D2006 trifft es schon ziemlich genau. Diese ganzen sachen
zu berücksichtigen ist glaube ich ohne besonders gute Physik Kenntnisse
nahezu unmöglich. Viel zu viele Probleme und Einflüsse.
z.b. eine unwucht der Kugel oder sonstiges.

Michi

stfighter01

BeitragMo, Jul 05, 2004 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
naja ein bisschen luftwiderstand zu simulieren ist nicht so schwer.

aber wie gesagt die kollisionsprüfung ist der horror schlechthin (zumindest bei unförmigen gegenden)

für den reibungsfreien flug würd ich mich an D2006 seine variante halten.

mfg stfighter
Denken hilft!
 

Cloud

BeitragMo, Jul 05, 2004 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
die Wurfbahnparabel ist:

y = x * tan(a) - ( (g * x²) / (2V0² - cos² a) )

dabei ist:
g = die Gravitationskonstante 9,81 m/s²
V0 = ist die abwurfgeschwindigkeit
a = der abwurfwinkel


die Formel sollte meines Wissens so richtig sein sonst nochmal Googeln, sie berücksichtigt aber nicht den Luftwiderstand sollte so aber ausreichen.
Duron 1200 | 256 RAM | Geforce 2 TI

sbrog

BeitragMi, Jul 07, 2004 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Cloud hat Folgendes geschrieben:
die Wurfbahnparabel ist:

y = x * tan(a) - ( (g * x²) / (2V0² - cos² a)



stimmt das dann so in bb übersetzt ?
g= 9,81
abwurfwinkel = 30
v0 = 10



y = x * Tan(abwurfwinkel) - ((g * x^2)/(2*v0^2-Cos(a)^2))

Markus2

BeitragMi, Jul 07, 2004 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hatte ich mal zum testen gemacht .
Man kann dabei auf ein Ziel werfen und es wird immer getroffen .
Vieleicht kannste es ja gebrauchen .

LM werfen
RM Ziel ändern

Code: [AUSKLAPPEN]


Graphics3D 640,480,16,0
SetBuffer BackBuffer()
AppTitle " Steine werfen"

Global cam=CreateCamera()
CameraRange cam,1,10000
;CameraClsMode cam,0,True

light=CreateLight()

PositionEntity cam,0,0,-50

Global ziel=CreateCube()
EntityColor ziel,255,255,255
ScaleMesh ziel,0.5,0.5,0.5
ScaleMesh ziel,10,10,10
EntityType ziel,2
EntityPickMode ziel,2

Global stein=CreateSphere(8)
ScaleMesh stein,0.5,0.5,0.5
ScaleMesh stein,10,10,10
EntityType stein,1
EntityRadius stein,5
HideEntity stein

Type SteinType

 Field Entity

 Field xs# ;Stein Start
 Field ys#
 Field zs#

 Field xe# ;Ziel position
 Field ye#
 Field ze#

 Field wi# 
 Field ws#
 Field st#
 Field dy#
 Field dz# 
 Field l#   ;Flugbahn länge
 
 Field treffer
 Field count
 Field blow#
 Field sollweg

End Type

Global cStein.SteinType

;-----------------------------------------------------

Collisions 1,2,2,2 ;stein mit ziel als sphere to polygon

;-----------------------------------------------------

While Not KeyHit(1)

 If MouseHit(1) Then
  CameraPick cam,MouseX(),MouseY()
  pe=PickedEntity()
  If pe Then SteinWerfen Rnd(-50,50),EntityY(cam),EntityZ(cam)+20,pe
 EndIf

 If MouseHit(2) Then
  PositionEntity ziel,Rnd(-50,50),Rnd(0,50),Rnd(50,500)
 EndIf

 SteineUpdaten
 UpdateWorld
 RenderWorld

 Text 0,0,"Maustaste 1 = Werfen , 2 = Ziel bewegen"

 Flip

Wend
End

;-----------------------------------------------------

Function SteinWerfen(xs#,ys#,zs#,ZielEntity)

 Local dx#,dy#,dz#

 cStein=New SteinType

 cStein\Entity=CopyEntity(Stein)
 EntityColor cStein\Entity,Rnd(64,200),Rnd(64,200),Rnd(64,200)
 cStein\wi=-90 ;-90 bis 90 = 180
 cStein\ws=180
 cStein\st=4
 cStein\xs=xs
 cStein\ys=ys
 cStein\zs=zs

 cStein\xe=EntityX(ZielEntity)
 cStein\ye=EntityY(ZielEntity)
 cStein\ze=EntityZ(ZielEntity)

 cStein\dy=0
 cStein\dz=0

 cStein\treffer=False
 cStein\count=100
 cStein\blow=1
 cStein\sollweg=False

 dx=cStein\xe - cStein\xs
 dy=cStein\ye - cStein\ys
 dz=cStein\ze - cStein\zs

 cStein\l=Sqr(dx*dx+dy*dy+dz*dz)* (Pi/(360 / cStein\ws)) ;das sollte die Flugbahnlänge ergeben !?

 PositionEntity cStein\Entity,xs,ys,zs
 PointEntity cStein\Entity,ZielEntity

 ResetEntity cStein\Entity

End Function

;-----------------------------------------------------

Function SteineUpdaten()

 For cStein = Each SteinType
 
  If cStein\treffer=False Then

   Local winkelvonbis#=cStein\ws / cStein\st

   cStein\dy= (-Sin(cStein\wi)*cStein\l) / winkelvonbis/2 ;bei /2 ist z.B. die max. Flughöhe = der Flugbahnlänge zum Ziel /2
   cStein\dz= ( Cos(cStein\wi)*cStein\l) / winkelvonbis

   MoveEntity cStein\Entity,0,cStein\dy,cStein\dz

   If CountCollisions(cStein\Entity)>0 Then cStein\treffer=True
  EndIf

  If cStein\treffer=True Then
    cStein\blow=cStein\blow+0.025
    ScaleEntity cStein\Entity,cStein\blow,cStein\blow,cStein\blow
    cStein\count=cStein\count-1
    If cStein\count<=0 Then cStein\sollweg=True
  Else
   cStein\wi=cStein\wi+cStein\st
   If cStein\wi>90 Then cStein\sollweg=True
  EndIf

  If cStein\sollweg=True Then
   SteinWeg cStein
  EndIf

 Next

End Function

;-----------------------------------------------------

Function SteinWeg(xStein.SteinType)

 FreeEntity xStein\Entity
 Delete xStein

End Function

;-----------------------------------------------------

Function R2#(x#)

 ;Runden

 Return Int(x#*100.0)/100.0

End Function

;-----------------------------------------------------
 

michaelw

BeitragMi, Jul 07, 2004 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Also richtig macht man das so, hab das auch schon auf dem Taschenrechner etc. programmiert:

x = v * t * cos (a)

y = (-g/2) * t^2 + v * t * sin(a)

wobei:

v = Anfangsgeschwindigkeit (z.b. 50 Km/h)
a = Abwurfwinkel (z.b. 45°)
g = 9.81 = Fallbeschleunigung
t = ist di Zeit, ist am Anfang auf Null zu setzen

Man muss jetzt nur die Zeit jedesmal um einen bestimmten Faktor erhöhen und dann halt die x und y Position berechnen. Je nachdem wie viel größer man die Zeit pro Durchlauf macht, desto genauer oder ungenauer wird die Flugbahn gezeichnet.

Travis

BeitragMi, Jul 07, 2004 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Formel von michaelw haut schon mal hin. Für eine Art "Ballerburg"-Clone (kennt das Game jemand?) reichts völlig aus.

Code: [AUSKLAPPEN]

Graphics 800,600,16,2
SetBuffer BackBuffer()

Global StX = 0     ; Startposition X
Global StY = 500   ; Startposition Y
Global x#,y#

Global g = 9.81   ; Gravitation

Global v = Input("Speed:  (1 - 99)  : ") ; Geschwindigkeit
Global a = Input("Winkel: (0° - 90°): ") ; Winkel
Global t# ; Zeit

If v < 1 Then v = 1
If v > 99 Then v = 99
a = -a

Start = MilliSecs()
Repeat
;Cls

  UpdateBall()
  UpdateScreen()

  If y > 500 Then
   Color 255,255,255
   Text 0,30, "Zeit: " + (MilliSecs()-Start) + "ms"
   Text 0,40, "Entf: " + (x - StX) + "m"
   Text 0,50, "Ende."
   Flip
   WaitKey
   End
  EndIf

Flip
Until KeyHit(1)
End



; --- Flugbahn des Balles berechnen ---
Function UpdateBall()
 t# = t + .1

 x# = StX + v * t * Cos(a)
 y# = StY - (-g/2) * t^2 + v * t * Sin(a)
End Function
; --- Flugbahn des Balles berechnen ---



; --- Bildschirminhalte anzeigen ---
Function UpdateScreen()

 Color 255,255,255
 Oval x-2,y-2,4,4,1

 Color 0,0,100
 Rect 0,500,800,100,1

End Function
; --- Bildschirminhalte anzeigen ---
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
  • Zuletzt bearbeitet von Travis am Do, Jul 08, 2004 13:08, insgesamt 2-mal bearbeitet

Mr.Keks

BeitragDo, Jul 08, 2004 7:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
x = v * t * cos (a)

y = (-g/2) * t^2 + v * t * sin(a)
das ist eigentlich dasselbe wie das, was D2006 gepostet hat, wenn man von der fallbeschleunigung absieht... naja, und dass man eine formel ist, in die man eine beliebige zeit setzen kann, aber was bringt uns das?

die fallbeschleunigung fällt (Very Happy) ja kaum jemandem auf... is echt so. nach wollknäuelwar haben mich ne menge leute nach den hochkomplexen, supertollen, absolut echt wirkenden geschossflugbahnparabeln gefragt. dabei machte ich es genau so wie D2006! Smile


Code: [AUSKLAPPEN]
t# = t + .05

 sx# = sx + v * t * Cos(a)
 sy# = sy - (-g/2) * t^2 + v * t * Sin(a)
äh, lol? ich glaube, du hast die formel missverstanden travis... =) entweder schreibst du sx = startx + .... und setzt die zeit immer höher oder du setzt die zeit auf eins und schreibst sx = v*.... so wie du es jetzt machst, beschleunigt das geschoss ja Very Happy
MrKeks.net

Travis

BeitragDo, Jul 08, 2004 13:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Embarassed stimmt. Man sollte nachts lieber schlafen anstatt Flugbahnen zu berechnen. Hab' den Fehler in meinem Beitrag korrigiert. Das ganze sollte man mal ausarbeiten und dann ins Codearchiv stellen. Sowas kann man ja immer mal gebrauchen.

Jetzt könnte ich mich glatt wieder dran setzen und ein Ballerburg-Clone machen. Rolling Eyes
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

michaelw

BeitragDo, Jul 08, 2004 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@Inarie:

Ja, von D2006, das sind einfach die Gleichungen ineinander eingesetzt, aber dann machst du x einfach immer z.b. um 1 größer. In meiner Formel wird x aber immer berechnet und eben nicht immer um 1 größer. Ich glaub aber das die Wurfparabel Formel die Flugbahn berechnet wie sie mit Luftwiderstand oder so ist, und meine Formeln berechnen theoretische Werte, wie sie ohne Berücksichtigung des Luftwiderstandes wären. Ich hab die Erfahrung gemacht das diese theoretische Flugbahn schöner aussieht, aber muss Jeder selber wissen.

stfighter01

BeitragDo, Jul 08, 2004 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
die formeln mögen ja richtig sein, aber ich würd es trotzdem so simulieren:


function feueredigsbums()

x_speed= abschussgeschw* sin( winkel ) * zeitkonst
y_speed= abschussgeschw* cos( winkel ) * zeitkonst

x_pos= startpositionx
y_pos= startpositiony

end function

mainloop start:

y_speed= y_speed - gravitiationsbeschleunigung * zeitkonst

x_pos= x_pos+ x_speed
y_pos= y_pos+ y_speed

mainloop end:



legende:
x,y_speed sind die geschwindigkeiten des objektes (z.b.: 800m/sec)

x,y_pos gibt die position des objektes an

gravitationsbeschleunigung ( 9.81 m/sec )

zeitkonst: faktor, abhängig von der bildschirmfrequenz um einen gleich
schnellen flug auf allen systemen zu gewährleisten
ist ausserdem massstab für die geschwindigkeit am bildschirm
z.b.: 10 m/sec entspricht 10 cm/sec am bildschirm


mfg stfighter
Denken hilft!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group