Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.07.2011, 21:53

Wurfparabel. Zielwählen und Wurf danach ausrichten

Hi, ich hab hier ein Problem.
Ich habe ein Wurfparabel programmiert. Also Raketenwerden gespawnt und fliegen in eine Vectorrichtung. Es macht je nachdem wie ich den Geschoss ausgerichtet habe längere oder kürzere Bogen. Jetzt möchte ich ein Schritt weiter gehen. Und zwar möchte ich, wenn irgendwohin visiere (ist 3D Vector) und schieße oder aktiviere (wie auch immer), dass mein Geschoss auch sich von selbst den Winkel oder auch die Vectorrichtung anpasst, damit ich das Ziel treffe (oder etwa, da ich Streuung auch hab^^).

Bis jetzt hab ich das (Wurfparabel)

Quellcode

1
2
3
4
5
6
7
8
9
            Direction = Entity:forward()*20   ; das ist der forwärtsvectorrichtung lokal um 20 fache vegrößert.
            Pos = Entity:pos()                      ; Position des Flugobjectes bzw auch die Kanone von der aus Geschossen wird.
            SlowMo = 0.01                           ; Parabel vergrößern
            Time = Time + (1*SlowMo)        ; Zeit vergrößern (weil es bei 0 anfängt, erst mal vergrößern)
            S = G/2 * Time^2  
            Forward = Direction * Time      ; Den schub nach vorn erst mal verlangsamen
            Pos += Forward                      ; Position
            Pos -= vec(0,0,S)                   ; um S die Z Vector verringern ( damit es auch mal nach unten fällt^^)
            ZielPos ; Je nachdem wohin ich Ziele.

Wenn ich das jetzt so ansehe weiß ich, dass ich Direction irgendwie rausrechnen muss.
Also Direction = nur was? :S. Forward ist am anfang 0, Time auch... oder da fällt mir gerade ein.. muss ich erst mal die Zeit ausrechnen???

Naja ich hoffe ihr kennt euch damit aus :(
Nichts ist unmöglich.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MaZy« (15.07.2011, 22:02)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

16.07.2011, 06:57

Du hast da offensichtlich eine quadratische Gleichung und entgegen meiner anfänglichen Befürchtung enthält sie keinen Raketenschub oder Reibung, sondern nur eine lineare Komponente und die Gravitation. Du kannst also ganz einfach den Schnittpunkt dieser quadratischen Gleichung mit einer ebene deiner Wahl berechnen, Google sollte helfen für "Achsenschnittpunkte einer quadratischen Gleichung" und das sollte man auch in der Schule machen, etwa in der 8. Klasse: G/2*Time² - Direction*Time + Pos = 0 --> pq-Formel hilft.
Basierend darauf musst Du vermutlich eine Iterations-Formel zur Annäherung an Dein Ziel benutzen. Newton-Verfahren könnte klappen, ist nur etwas eklig, weil Du ja mehrere Parameter im Startvektor hast. Eine analytische Lösung sehe ich da bisher jedenfalls keine. Eventuell, wenn Dein Untergrund eine Ebene ist, wird aber wohl eher ein unebenes Terrain sein. Du kannst eventuell auch Regula Falsi für alle Komponenten Deines Vektors einzeln durchlaufen lassen. Ist zumindest simpler zu implementieren und letztendlich ist die Art der verwendeten Annäherung ja schnurz.
Insgesamt ist natürlich Dein Problem, dass Du ein Ziel eventuell gar nicht treffen kannst oder aber mit zwei verschiedenen Startvektoren das gleiche Ziel erreichst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Mastermind

unregistriert

3

16.07.2011, 09:44

BlaBlubb.

Das Problem ist wenn ich mich nicht schwer täusche weniger dass man es nicht analytisch lösen könnte, als dass du entweder die Anfangs-Geschwindigkeit oder die Flugdauer des Geschosses frei (mit Einschränkungen, s.u.) wählen kannt.

Da es aber in der Realität vermutlich eine Obergrenze für die Geschwindigkeit gibt, hat man ein Optimierungsproblem. (Wähle die Anfangsgeschwindigkeit so, dass die Flugdauer minimal wird.) Das ist aber insofern nicht weiter schlimm, als das näherungsweise gilt, je schneller das Geschoss fliegt, desto früher ist es da.

Sei §v_0§ der anfängliche Bewegungsvektor bzw. §|v_0|§ die Anfangsgeschwindigkeit. Ich gehe mal modellhaft davon aus, dass es möglich ist für dein Geschoss einen Bereich §[a,b]§ für gültige §|v_0|§ festzulegen. Weiterhin soll es Gründe geben nicht immer mit Vollkraft b zu schießen (z.B. Kosten, Erhitzung der Waffe, whatever). Das ist ein wenig schwammig, aber durch a=b lässt es sich natürlich leicht beheben, falls du das nicht willst.

Modulo Rechenfehler, die du bitte falls vorhanden selbst korrigierst, gilt:

Seien § p_0, p§ Anfangsposition und der anvisierte Punkt (in dieser Reihenfolge) wobei §y_{p_0}, y_{p}§ jeweils die 2. Komponente der letzteren beiden bezeichnen

und

§g=\begin{pmatrix}0\\-9.81\\0\end{pmatrix}§

der Vektor der Schwerkraft ist (beides davon ausgehend, dass "y" die Hoch-Achse ist, ggf. anpassen)

dann ist

§t^4 + \frac{4(9.81(y_p-y_{p_0})-|v|^2)}{9.81^2} t^2 + \frac{4|p-p_0|^2}{9.81^2} = 0§

Es stellt sich heraus dass die quadratische Gleichung nur dann reelle Lösungen hat, wenn §|v_0|§ groß genug war um die Erdanziehung lange genug zu überwinden um p überhaupt zu erreichen. Die Mindestgeschwindigkeit §|v_0|_{\min}§ ist gegeben durch:

§|v_0|^4 - 2 \cdot 9.81(y_p-y_{p_0}) |v_0|^2 + 9.81^2((y_p-y_{p_0})^2-|p-p_0|^2)=0§

Vorgeschlagenes Vorgehen:

  1. §|v_0|_{\min}§ ausrechnen
  2. Wenn §|v_0|_{\min}>b§ aufgeben, sonst §|v_0|=\min(b,\max(a, 1.1\cdot|v_0|_{\min}))§
    Die 1.1 ist die größte "Sünde" in der ganzen Betrachtung. Wenn §a \neq b§ fänd ich es halt langweilig immer nur die Minimalgeschwindigkeit zu verwenden. 10% Spaßfaktor oben drauf sollten drin sein. Siehe auch Beschreibung von a und b.
  3. t ausrechnen
  4. §v_0§ ausrechnen
  5. Feuern.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Mastermind« (16.07.2011, 09:53)


Werbeanzeige