In einem 2D-Spiel möchte ich einfach die Flugbahn eines Pfeils im Flug zeichnen. Mit dem folgenden Code sieht die Flugbahn (die Parabel) richtig aus, nicht aber der Winkel (oder die Drehung) oder der Pfeil.
float g = -9.8f;
float x = (launchVelocity * time);
float y = (launchVelocity * time) + (0.5f * g * (float)Math.Pow(time, 2));
float angle = (float)Math.Tanh(y / x);
Was vermisse ich? Vielen Dank.
projectile-physics
Martin
quelle
quelle
Antworten:
Arctanh
gibt dir den tangens für die hyperbolische kurve! Soweit ich weiß, ist Ihre Parabel keine Hyperbel.Aber wir haben eine gute Nachricht: Es ist einfacher, die Tangente für Ihre Parabel zu finden. Die Gleichung lautet
Wo ist dein
launchVelocity
. Jetzt ist die Steigung Ihres Pfeils:Sie können
Arctan
jetzt die Sicherheit verwenden, wenn Sie möchten.Einige zusätzliche Informationen zur Physik:
Die ungefähre Flugbahn, die Sie simulieren, gilt für den Schwerpunkt Ihres Pfeils. Wenn Sie "Position" (x, y) sagen, sprechen Sie von der Position des Massenschwerpunkts. Der Massenmittelpunkt eines Pfeils ist vom Mittelpunkt aus leicht nach vorne gerichtet, und Sie sollten dies berücksichtigen, wenn Sie den Pfeil zeichnen möchten.
Denken Sie daran, dass Sie das Trägheitsmoment des Pfeils (das beim Abfeuern eines riesigen Ballistas sehr unterschiedlich sein kann) und die Fluiddynamik des Pfeils nicht berücksichtigen: Der Bogen-Pfeil-Flug folgt keinem parabolischen Pfad!
quelle
Sie möchten den Winkel des Pfeils zu jedem Zeitpunkt. Sie haben sich daran erinnert, dass es zum Berechnen eines Winkels eine Tangente gibt. Aber hier begann Ihr Denken schief zu gehen:
Wenn Sie also die Luftreibung vernachlässigen, ist die x-Geschwindigkeit des Pfeils eine Konstante.
Zerlegen Sie zunächst die Geschwindigkeit in x- und y-Komponenten. Sie könnten in einem Winkel von 45 Grad oder 60 Grad fotografieren. Sie brauchen also launchVelocity und einen Winkel, es ist kein Skalar.
Zweitens: Berechnen Sie alles als double, nicht als float. Sie sind nicht numerisch ausgereift genug, um zu wissen, wann ein Abrundungsfehler Sie nicht umbringt. Versuchen Sie es also nicht. Es ist auf keinen Fall eine große Zeitersparnis.
Drittens, verwenden Sie Math.pow nicht, es ist langsam und nicht so genau wie das Multiplizieren nach ganzzahligen Potenzen. Sie können auch viel Zeit sparen, indem Sie das Horner-Formular verwenden (siehe unten).
Wenn Sie verzweifelt nach Leistung streben, können Sie sogar 0,5 * g vorberechnen, aber der obige Code bringt Sie zu 90% dorthin, ohne etwas zu Verrücktes zu tun. Wenn Sie das 10 Millionen Mal machen, ist es zwar nicht sehr viel Zeit, aber prozentual gesehen ist es ziemlich groß - Bibliotheken sind in Java sehr langsam
Wenn Sie also den Winkel möchten, in dem der Pfeil verlaufen soll, ist das, was Sie möchten
Und in diesem Fall würde das funktionieren, weil dx eine Konstante ist. Im Allgemeinen kann dx aber auch Null sein, weshalb Sie normalerweise Folgendes verwenden möchten:
Diese Funktion wurde speziell für diesen Job entwickelt.
Aber wie gesagt, Bibliotheksfunktionen in Java sind schrecklich langsam, und in diesem Fall gibt es eine bessere Möglichkeit, ohne @FxIII darauf hinzuweisen.
Wenn die horizontale Geschwindigkeit immer v0x ist und die vertikale Geschwindigkeit ist:
dann ist dein Delta: vx, vy
Du brauchst den Winkel nicht. Wenn Sie einen Pfeil zeichnen möchten, verwenden Sie nominell Folgendes:
Diagramm (x, y, x + vx, y + vy);
Ich weiß nicht, was Sie zeichnen. Wenn Sie also den Winkel zum Drehen benötigen (wie bei JOGL), verwenden Sie diesen Winkel.
Vergessen Sie nicht, wenn Sie opengl verwenden, um den Winkel wieder in Grad umzuwandeln, da ATAN2 Radiant zurückgibt:
quelle
Tanh () (hyperbolischer Tangens ) nimmt einen Winkel als Parameter, aber Sie haben das Verhältnis der Seiten angegeben.
Was Sie wirklich wollen, ist die Verwendung des hyperbolischen Arkustangens , der das Seitenverhältnis als Parameter verwendet und den Winkel zurückgibt. (Die Benennung kann "atanh", "atanh2", "arctanh" oder etwas ähnliches sein; scheint zwischen den verschiedenen Mathematikbibliotheken sehr zu variieren.)
quelle