2016-06-11 13 views
2

Ich habe zwei Informationen: ein 2D-Vektor, der die Geschwindigkeit relativ zu einem Gitter und einen Winkel (180 bis minus 180 Grad) darstellt den Blickwinkel des Spielers darstellt auch relativ zu diesem Raster, und ich bin dabei, herauszufinden, welche Tasten (W, A, S, D) der Spieler mit dieser Information drückt.Herauszufinden, welche Tasten ein Spieler basierend auf relative Geschwindigkeit und Winkel

Die Sache, die mir Probleme gibt, ist die Tatsache, dass sich der Spieler in Bezug auf den Betrachtungswinkel bewegt. Wenn also der Spieler 35 Grad relativ zu unserem Gitter sieht und vorwärts drückt (W), bewegt sich der Spieler um 35 Grad vorwärts, was der Geschwindigkeit eine Mischung aus vorwärts und rechts (D) verleiht. Zu beachten ist, dass die maximale Geschwindigkeit, die ein Spieler durch Drücken einer Taste erreicht, 250 Einheiten/s in dieser Richtung beträgt. Aber der Vektor wird in eine Berechnung mit dem Blickwinkel gebracht, der die endgültige Bewegungsgeschwindigkeit ergibt, und deshalb stelle ich diese Frage.

Ich möchte im Grunde den Einfluss des Winkels auf den Geschwindigkeitsvektor ausgleichen.

Dazu habe ich versucht, eine Rotation-Matrix-Lösung unter Verwendung der folgenden Formel:

x' = x*cos(angle) - y*sin(angle) 
y' = x*sin(angle) + y*cos(angle) 

aber das hat mir nicht gute Ergebnisse, es scheint, wie sie Art der gleiche wie der ursprüngliche Geschwindigkeit sind Vektor.

Weiß jemand, was ich hier falsch mache? Sollte ich diese Werte nicht einfach mit einer Rotationsmatrix berechnen können?

+0

Sie kann nicht nur die Geschwindigkeit haben - Sie müssen auch die Beschleunigung (für Zustandsänderungen) –

+0

@willywonkadailyblah Warten Sie, warum? Was meinst du mit staatlichen Veränderungen? – Tokfrans

+0

Sorry Richtung ändert sich, also Schlüsselzustand ändert –

Antwort

1

Zuerst müssen wir mehr über die Physik wissen, wie:

  1. ist es Trägheit vorhanden (Bewegung und/oder Rotation)?

    Geschwindigkeit/Richtung ändert sich sofort oder langsam in der Zeit?

  2. Tasten fahren Beschleunigung oder Geschwindigkeit?

    Geschwindigkeit/Richtung ändert sich sofort oder kontinuierlich in der Zeit mit der Taste drücken/halten/loslassen?

  3. Gibt es Reibungen?

    Objekt stoppt, wenn keine Taste nach der Zeit oder sofort oder nie gedrückt wird?

Nun, wie diese

Zuerst sehen

, die in der Regel für die Aktualisierung der Objektposition/Richtung/Geschwindigkeit verwendet werden, zum Angriff . Von daher ist der Rest einfach ...

Zum Beispiel nehmen wir an Tasten Beschleunigung, Trägheit ist vorhanden, keine Reibungen, und Sie haben nur die Position , Orientierung alpha und Geschwindigkeit v Informationen in 2D.

  1. so müssen Sie mit einiger dt Intervall
  2. entfernen Reibungen von v,omega einig Update-Routine wie Timer haben, falls vorhanden

    nur die Geschwindigkeit durch inverse Reibungs multiplizieren ursprüngliche Geschwindigkeit zu erhalten ... Dies muss vor der Beschleunigungsberechnung erfolgen !!!

  3. Rechen Beschleunigung a,epsilon von Geschwindigkeit v,omega

    so einfach ist, ist es nur Ableitung von Zeit:

     a(t)=( v(t)- v(t-dt))/dt 
    epsilon(t)=(omega(t)-omega(t-dt))/dt 
    

    Wo t tatsächliche Zeit ist und dt ist an der Zeit Schritt Ihrer Update-Routine. Die a(t) bedeutet tatsächlichen Wert und a(t-dt) bedeutet vorherigen Wert von der letzten Aktualisierung. Also, wenn Sie nur Position info stattdessen bekam können Sie auf ähnliche Weise tun:

    v(t)=(p(t)-p(t-dt))/dt 
    a(t)=(v(t)-v(t-dt))/dt 
        omega(t)=(alpha(t)-alpha(t-dt))/dt 
    epsilon(t)=(omega(t)-omega(t-dt))/dt 
    

    Für Winkel Delta (alpha(t)-alpha(t-dt)) Sie sollten sicherstellen, dass die abs Ergebnis ist immer kleiner oder gleich als 180 Grad, wenn nicht hinzufügen/entfernen 360 Grad, bis es ist.

  4. Entfernen Kraftfelder von a vorhanden, wenn

    wenn Sie zum Beispiel die Schwerkraft vorhanden bekam ... etc subbstract es. Das einzige, was in den Beschleunigungen gelassen werden soll, ist die Tastenanschläge angetrieben Beschleunigung

  5. Bumps dekodieren keystrokes

    , das einfach ist zum Beispiel, wenn Sie Bewegungsschema ist wie links/rechts und vorwärts/rückwärts bewegen dann extrahiere einfach die Info (+/- deine Koordinatensystemkorrekturen). Das Drehen ist direkt sichtbar in Winkelbeschleunigung epsilon:

    if (epsilon>+ang_treshold) `D` is pressed; // turn left 
    if (epsilon<-ang_treshold) `A` is pressed; // turn right 
    

    Jetzt konvertieren Sie nur Ihre Bewegung Beschleunigung a in Ausrichtung, so dass es vor Ort wurden Sie mit LCS durch Punktprodukt Objekt (lokales Koordinatensystem) axises:

    lcs_a.x=(a.x*cos(alpha  ))+(a.y*sin(alpha  )); 
    lcs_a.y=(a.x*cos(alpha-90deg))+(a.y*sin(alpha-90deg)); 
    

    Und in ähnlicher Weise die Beulen untersuchen ...

    if (lcs_a.y>+mov_treshold) `W` is pressed; // move forward 
    if (lcs_a.y<-mov_treshold) `S` is pressed; // move backward 
    if (lcs_a.x>+mov_treshold) `E` is pressed; // move right 
    if (lcs_a.x<-mov_treshold) `Q` is pressed; // move left 
    

    Wenn Sie eine Simulation durch sp angetrieben Dann werden Sie einfach Geschwindigkeit statt Beschleunigung auf die gleiche Weise untersuchen. Die Schwellenwerte sollten kleiner sein, aber nahe bei den tatsächlichen Tastenanschlag-Beschleunigungshöckern, um eine Fehlregistrierung einiger vergessener Reibung oder was auch immer zu vermeiden ...für den Anfang können Sie 0 verwenden und wenn falsch erkannt Tastenanschläge dann erhöhen Sie es ein wenig ... Am sichersten wäre ein Diagramm von a als eine Funktion der Zeit und lesen Sie die Werte aus, während der Schlüssel aktiv ist ... so dass Sie tatsächlich sehen der richtige Wert sofort statt erraten ...

+0

Es hat eine Weile gedauert, um meinen Kopf um diese zu wickeln, ich muss zugeben. Aber Ihre Antwort gab mir alle Informationen, die ich benötigte, um dies umzusetzen. Danke =) – Tokfrans