2017-09-01 1 views
1

Hier ist eine kurze Beschreibung dessen, was die Methoden einige von euch tun sehen werden:Verlangsamen, während in Richtung bewegen

  • this.bounds: Gibt die Grenzen des Schiffes (ein Rechteck)
  • this.bounds.getCenter(): a Vector2d Kosten repräsentieren die Zentrum der Schiffsgrenzen.
  • getVelocity(): Ein Vector2d, die die Schiffsgeschwindigkeit darstellt (hinzugefügt jeden Rahmen zu positionieren)
  • new Vector2d(angle): Ein neues Vector2d, normalisiert, wenn einen Winkel (in Radiant)
  • Vector2d#interpolate(Vector2d target, double amount) gegeben: Nicht lineare Interpolation! Wenn Sie den Code interpolate sehen wollen, hier ist es (soweit in Klasse Vector2d):

    public Vector2d interpolate(Vector2d target, double amount) { 
        if (getDistanceSquared(target) < amount * amount) 
         return target; 
        return interpolate(getAngle(target), amount); 
    } 
    public Vector2d interpolate(double direction, double amount) { 
        return this.add(new Vector2d(direction).multiply(amount)); 
    } 
    

Wenn der Spieler nicht Tasten drücken, sollte das Schiff nur verzögern. Hier ist, was ich für das tun:

public void drift() { 
    setVelocity(getVelocity().interpolate(Vector2d.ZERO, this.deceleration)); 
} 

aber jetzt habe ich erkannte ich es treiben wollen, während auf ein Ziel los. Ich habe dies versucht:

public void drift(Vector2d target) { 
    double angle = this.bounds.getCenter().getAngle(target); 
    setVelocity(getVelocity().interpolate(new Vector2d(angle), this.deceleration)); 
} 

Das ist natürlich nicht immer tatsächlich Null Geschwindigkeit zu erreichen (da ich zu einem Winkelvektor bin Interpolation, die eine Größe von 1 hat). Außerdem "driftet" es nur in Richtung des Ziels, wenn es sehr langsam wird.

Irgendwelche Ideen, wie ich das erreichen kann? Ich kann es einfach nicht herausfinden. Das ist eine große Frage, also vielen Dank.

Dies ist mit einer großen Bibliothek, die ich gemacht habe, wenn Sie irgendwelche Fragen haben, was einige Sachen tun, fragen Sie bitte, ich denke, dass ich das meiste davon jedoch abgedeckt habe.

+2

Ich verstehe nicht, was Sie versuchen zu tun. Wenn Sie nur verlangsamen möchten, reduzieren Sie einfach die Länge des Geschwindigkeitsvektors. Wenn Sie [Rayleigh ziehen] (https://en.wikipedia.org/wiki/Drag_ (Physik) #Drag_at_high_velocity) annehmen, wächst die Widerstandskraft quadratisch mit der Geschwindigkeit. Im Falle von [Stokes ziehen] (https://en.wikipedia.org/wiki/Drag_ (Physik) #Very_low_Reynolds_numbers: _Stokes.27_drag), wächst es linear. Unter der Annahme einer konstanten Schiffsmasse und eines konstanten Aktualisierungszeitrahmens würden Sie etwas wie folgt tun: 'dragForce = constant * v.length() (^ 2); v = v * (1 - dragForce/v.length()) '. –

+2

Btw, bitte verlinken Sie nicht auf externen Inhalt, wenn es für Ihre Frage wesentlich ist. Soweit ich sehen kann, wird Ihre Interpolationsfunktion nur den Nullvektor zurückgeben, wenn Sie den Nullvektor eingeben (weil seine Länge kleiner ist als "Betrag * Betrag"). –

+0

@NicoSchertler Sorry, ich musste auf Pastebin schreiben, weil es hier nicht formatiert wurde, egal was ich versuchte. Die Interpolation funktioniert (ich benutze es oft). Im Moment wird das Schiff nur verlangsamt, wenn keine Taste gedrückt wird, bis es komplett stoppt, während es in die letzte Richtung geht, in der es sich bewegt. Ich möchte, dass das Schiff dasselbe tut, aber in eine bestimmte Richtung. Vorher konnte ich einfach die Geschwindigkeit gegen Null interpolieren. Aber ich weiß nicht, was ich tun soll, wenn ich möchte, dass es langsamer wird, während ich die Richtung ändern kann. Wenn es immer noch schwer zu verstehen ist, vielleicht krank einige Bilder posten, wenn das helfen könnte. – MCMastery

Antwort

1

Ihre interpolate Funktion macht seltsame Dinge. Warum nicht einfache physikalische Modelle verwenden?Zum Beispiel:

Körper hat Position (px, py) und Geschwindigkeit (vx, vy) auch Einheit Richtungsvektor (dx, dy) ist bequem

Nach (small) Zeitintervall dt ändert Geschwindigkeit bei Beschleunigung abhängig

vx = vx + ax * dt 
vy = vy + ay * dt 

Jede äußere Kraft (Kraft) verursacht Beschleunigung und verändert die Geschwindigkeit

ax = forcex/mass //mass might be 1 
ay = forcey/mass 

Trockenreibung f orce Größe hängt nicht von der Geschwindigkeit, ist es Richtung umgekehrt zu Geschwindigkeit

ax = c * mass * (-dx) 
ay = c * mass * (-dy) 

Flüssigkeitsreibungskraft Größe auf Geschwindigkeit abhängt (es gibt viele verschiedene Gleichungen für unterschiedliche Situationen), dann ist es Richtung zur Geschwindigkeit umkehren

ax = k * Vmagnitude * (-dx) 
ay = k * Vmagnitude * (-dy) 

Also für jedes Zeitintervall alle Kräfte addieren, resultierende Beschleunigung finden, resultierende Geschwindigkeit finden, Position entsprechend ändern

Verwandte Themen