Wurf berechnen
-
Hallo,
zunächst mal sorry, dass ich hier poste, gehört eigentlich ins Spieleprogrammierung-Forum. Ich bin aber kein registrierter Mitglied.
Also mein Problem ist, dass ich nicht weiß wie ich einen Wurf berechnen kann. Ich weiß, wie das in der Physik gemacht wird:
Dazu brauche ich aber die Zeit.
Waagerecht: s(t)=vxt
Senkrecht: s(t)=vy*t - 0.5*gt²Aber bei meinem Spiel habe ich keine Zeit. Ich könnte sie zwar messen, wenn der Spieler zuerst schießt. Ist aber nicht die Lösung, für ein rundenbasiertes Gameplay.
Eine andere Möglichkeit, die ich mir überlegt habe, wäre den PC-Spieler auf gut-glück schießen zu lassen und dann die Geschwindigkeit anzupassen, sodass er irgendwann trifft. Ist aber auch irgendwie langweilig, wenn der menschliche Part besser schießen kann. Und der PC so an die 3-4 Versuche braucht.
Damit ihr mir helfen könnt muss ich natürlich noch verraten was am Anfang bekannt ist. Das sind die 2 Abschussrampen, also ihre Positionen. Als Ergebnis sollte am besten der Geschwindigkeitsvektor herauskommen. (Da die Zeiten unbekannt sind, bringt so ein reines Umformen nicht viel. Falls das jemand vorschlagen sollte...)
Die Spielidee ist natürlich nicht von mir. Es gab schon vorher auch solche Spiele, in denen sich zwei Bunker gegenseitig über ein Gebirge beschiessen. Jedoch habe ich keine Ahnung, wie die Spiele hießen um sich von denen eine Inspiration zu holen.
-
Achja, was ich noch vergessen habe. Ich habe auch schon versucht eine Funktion aufzustellen die eine Wurfparabel beschreibt. Ist mir aber auch nicht gelungen. Habe aber vergessen wo das Problem war, ist schon 1/2 Jahr her.
-
sicher hast du die zeit in deinem spiel
-
Was hindert dich daran 1000 Würfe mal kurz auszuprobieren? Der User muss das ja nicht sehen...
[Edit: Hm, könnte man das Problem direkt lösen? Dachte das Wurfproblem geht sowieso nur iterativ?]
-
Mal ein Ansatz:
x(t) = vx*t => t = x(t)/vxy(t) = vy*t - 1/2*g*t^2 = x(t)*vy/vx - 1/2*g*(x(t)/vx)^2
Und schon hast du deine Beschreibung für eine Wurf-Parabel unabhängig von der Zeit.
-
delta tee schrieb:
sicher hast du die zeit in deinem spiel
CStoll schrieb:
x(t) = vx*t => t = x(t)/vx
y(t) = vy*t - 1/2*g*t^2 = x(t)*vy/vx - 1/2*g*(x(t)/vx)^2
Was ich aber brauche sind die Geschwindigkeitsvektoren. Oder übersehe ich da wieder was?
JBenni schrieb:
Was hindert dich daran 1000 Würfe mal kurz auszuprobieren?
Gute Frage... Das werde ich dann wohl auch machen.
Hm, könnte man das Problem direkt lösen? Dachte das Wurfproblem geht sowieso nur iterativ?
Wie meinst du das?
Danke an alle.
-
1r0ll|/|4514h schrieb:
delta tee schrieb:
sicher hast du die zeit in deinem spiel
Du kannst auch jede Sekunde (oder kürzer) die aktuelle Position deines Geschosses berechnen - und dann abfragen, ob und was an der Position steht.
CStoll schrieb:
x(t) = vx*t => t = x(t)/vx
y(t) = vy*t - 1/2*g*t^2 = x(t)*vy/vx - 1/2*g*(x(t)/vx)^2
Was ich aber brauche sind die Geschwindigkeitsvektoren. Oder übersehe ich da wieder was?
Du hast deine Abschußgeschwindigkeit v0 und den Winkel α (gegenüber Bodenebene), richtig? Damit ist vx=v0*cosα und vy=v0*sinα.
-
CStoll schrieb:
1r0ll|/|4514h schrieb:
delta tee schrieb:
sicher hast du die zeit in deinem spiel
Du kannst auch jede Sekunde (oder kürzer) die aktuelle Position deines Geschosses berechnen - und dann abfragen, ob und was an der Position steht.
Die Position muss ich aber im Voraus wissen, bzw. diese "am Stück" berechnen.
CStoll schrieb:
x(t) = vx*t => t = x(t)/vx
y(t) = vy*t - 1/2*g*t^2 = x(t)*vy/vx - 1/2*g*(x(t)/vx)^2
Was ich aber brauche sind die Geschwindigkeitsvektoren. Oder übersehe ich da wieder was?
Du hast deine Abschußgeschwindigkeit v0 und den Winkel α (gegenüber Bodenebene), richtig? Damit ist vx=v0*cosα und vy=v0*sinα.
Nein, vx und vy ist die Abschussgeschwindigkeit. Der Winkel wird dann daraus berechnet: tanα = vy/vx, wenn ich mich richtig erinnere. BTW, den Winkel brauche ich eigentlich nicht.
-
Und die Abschussgeschwindigkeit ist das was ich berechnen möchte.
Ich habe gerade eine Idee, weiß aber nicht ob sie mich weiterbring.
Die Geschwindigkeit ist ja die Ableitung der Streckenfunktion?Also:
v(t) = s'(t)=> (v0x war vorher vx, v0y war vy)
vx(t) = x'(t) = v0x // Toll, nur eine unbekannte. Dafür aber keine Zeit!!!
vy(t) = y'(t) = v0y - g*t // Immer noch zwei unbekanntenVielleicht kann man damit etwas anfangen... Ich schlafe mal eine Nacht darüber. Wenn man die Energieerhaltungs-Sätze dazunehmen kann, kommt hoffentlich was gescheites raus.
Was mich jetzt noch interessiert. Mal angenommen der Abschusswinkel beträgt immer 45° dann könnte man eigentlich aus v0x v0y berechnen (und umgekehrt natürlich auch). Damit hätte man 2 unbekannten und 2 Gleichungen?
also:
x(t) = v0x * t
y(t) = v0y * t - 0.5 * g * t²v0y = v0x / cos 45°
=>
x(t) = v0x * t
y(t) = v0x * t / cos 45° - 0.5 * g * t²
=>
Der Zielort ja bekannt: P(x1 | y1)
=>
v0x = x1 / t
=>
y1 = x1 / cos 45° - 0.5 * g * t²
=>
t = √2 / g * (x1 / cos 45° - y1)Stimmt so alles?
-
Du könntest ja vom umgekehrten Ansatz ausgehen: Du hast deine Position (0,0) und die Position des Ziels (xt,yt), und setzt vx und vy (oder v und α) als gegeben voraus. Damit hast du eine quadratische Gleichung:
y = x*vy/vx - x2/(2*g*vx2) (=x tanα - x2/(2*g*(v*cosα)2) = yt
0 = x2/(2*g*vx2) - x*(vy/vx) + yt = A x^2 + B x + C
x0 = B/2A + sqrt(B2/4A2 -C/A) = xt
Die letzte Gleichung kannst du jetzt nach vx oder vy umstellen, um deine Abschußgeschwindigkeit zu ermitteln.