2016-05-01 4 views
2

Ich habe ein Schiff Rad der Spieler kann drehen. Ich nehme gerade die Winkeländerung auf, die zu einem Gesamtwinkel addiert wird. Ich kann dann herausfinden, wie oft das Schiffsrad gedreht wurde. Das alles funktioniert gut.Finden Sie den Unterschied in der Rotation, als ein Durchschnitt über die Zeit Einheit C#

void Update() 
     { 
      //Record Amount of Wheel Turns 
      currentAngle = wheelRectTransform.transform.rotation.eulerAngles.z; 
      angleChange = Mathf.DeltaAngle(currentAngle, previousAngle); 

      if ((Mathf.Abs(angle + angleChange)/360) <= wheelTurnsUntilRudderAtMaxAngle) 
      {    
       angle += angleChange;    
      } 

      totalWheelTurns = angle/360; 
      shipStats.RudderAngle = totalWheelTurns/wheelTurnsUntilRudderAtMaxAngle; 

      previousAngle = currentAngle; 
     } 

jedoch, würde Ich mag auch die durchschnittliche Winkeländerung im Laufe der Zeit aufzuzeichnen. Dann könnte ich eine genaue Vorstellung davon bekommen, ob sich das Rad nach links oder rechts dreht.

Ich habe etwas einfach versucht, wie diese

if (angleChange < 0) 
{ 
    // Going Left 
} 
else if (angleChange > 0) 
{ 
    // Going Right 
} else 
{ 
    // Not moving 
} 

In der Praxis jedoch, wenn der Spieler sehr das Rad dreht, sehr langsam die Winkeldifferenz auf dem gelegentlichen Rahmen 0 und aufgezeichnet als ‚nicht bewegt‘.

Ich glaube, die Lösung wäre, die durchschnittliche Winkeländerung über eine kurze Zeit zu finden, also versuchte ich, den Winkel auf 0 im Laufe der Zeit zu verringern.

newAngleDifference = Mathf.Lerp(angleChange, 0, Time.deltaTime * 0.2f); 

Das hat nicht funktioniert, es mir das gleiche Feedback gibt, wie ich gerade bin mit ‚angleChange‘, die ohnehin 0 sein können.

Danke!

Jim

+0

Der ganze Code ist ein Durcheinander gerade jetzt, während ich einige Bewegung prototyping bin. Aber ich habe es für dich hier hingestellt. Ich benutze gerade eine Art Lerp, um die Richtung auszuarbeiten, es ist nicht perfekt, aber es wird reichen. http://pastebin.com/kGLrUYVu – Jim

+0

Ja, z-Richtung. Kein starrer Körper. – Jim

Antwort

1

Am Ende habe ich einen Lerp verwendet, um den Durchschnitt zu erhalten.

public enum WheelDirection { Left, Right, Still } 

    [Header("Average Wheel Direction")] 
    public float lerpTime = 0.5f; // How many seconds average over 
    private WheelDirection wheelDirection; 
    private float wheelDeltaX; 
    private float wheelDirectionInterpolated; 
    private float currentLerpTime; 

void Update() 
    { 
     // Get DeltaX of objects rotation 
     // I'm interested in the Z axis, but you could change this to x/y   
     float currentAngle = transform.rotation.eulerAngles.z; 
     wheelDeltaX = (currentAngle - previousAngle); 

     // Reduce the Lerp percentage 
     currentLerpTime += Time.deltaTime; 
     if (currentLerpTime > lerpTime) 
     { 
      currentLerpTime = lerpTime; 
     } 
     float perc = currentLerpTime/lerpTime; 

     // Lerp! 
     wheelDirectionInterpolated = (Mathf.Lerp(wheelDirectionInterpolated, wheelDeltaX, perc)); 

     // Wheel has finished rotating, so reset the Lerp 
     if (wheelDirectionInterpolated == 0) currentLerpTime = 0; 

     // Store Direction in an Enum 
     if (wheelDirectionInterpolated > 0) wheelDirection = WheelDirection.Left; 
     if (wheelDirectionInterpolated < 0) wheelDirection = WheelDirection.Right; 
     if (wheelDirectionInterpolated == 0) wheelDirection = WheelDirection.Still; 

     //This should always be at the end 
     previousAngle = currentAngle; 
    } 
1

Sie brauchen nichts zu mitteln, die Richtung des Rades zu erfassen. Verwenden Sie einfach alte und neue Variable, um herauszufinden, in welche Richtung das Rad fährt.

Verwandte Themen