2017-02-15 10 views
0

これを簡単に保つために、オイラー角と度を使用します。時間の経過に伴う回転補間

私は45度の角度を持っていると言います。そして、時間の経過とともに角度を315に変更したいと思います。これは、目標角度を得るために最短経路を取る必要があります。これは、最短パスの上の場合は315度になるために0度を通過することになります。私はすでに以下の関数の基礎を持っています。しかし、これは角度に対しては機能しません。

public static final float approach(float current, float goal, float delta) { 

    final float difference = goal - current; 

    if (difference > delta) return current + delta; 
    if (difference < -delta) return current - delta; 

    return goal; 

} 

ここに、問題をより明確にするための画像があります。 https://drive.google.com/file/d/0B4AZGzr3HML0cThORExNMHFEYlE/view

答えて

0

私はあなたが何を求めているかを理解しています。
したがって、

 approach()
の場合、パラメータ "current"は現在の角度を示します。パラメータ「目標」は、所望の角度を示す。パラメータ「デルタ」は、角度が「目標」に到達しなければならない時間(秒を想定)を示す。今

、あなたは、単にこのような何かを行うことができます角度への最短経路を計算するために:私たちはあなたの必要な値(現在= 45、目標を取る場合ので、私たちが実際に動作することをテストすることができ

if(current + (360 - goal) <= 180) // If goal is 180° away it will rotate to the right automatically. 
    // ... Rotate to the right 
else 
    // ... Rotate to the left 

を= 315)、上記の計算を正しく実行する必要があります。

45 + (360 - 315) <= 180 
45 + 45 <= 180 
90 <= 180, true. 
We turn it right. 

デルタに基づいてローテーション量を計算するだけです。これはかなり簡単です。
"totalAngle"を変数として宣言し、現在の角度と目的地の角度の差を記録します。この変数はif/elseコードブロックに割り当てます。また、私は回転する必要がある方向を追跡するのに役立つブール値を宣言します。

boolean rotateRight; 
float totalAngle; 

if(current + (360 - goal) <= 180) { 
    totalAngle = current + (360 - goal); 
    rotateRight = true; 
} 
else { 
    totalAngle = goal - current; 
    rotateRight = false; 
} 

は、今では1秒に1回回転すると仮定すると、私はtotalAngleを取り、(別名「デルタ」パラメータ)渡された秒数で割ります。次に、私は "現在の"パラメータを変更し、それを返します。

public static float approach(float current, float goal, float delta) { 
    boolean rotateRight; 
    float totalAngle; 

    if(current + (360 - goal) <= 180) { 
     totalAngle = current + (360 - goal); 
     rotateRight = true; 
    } 
    else { 
     totalAngle = goal - current; 
     rotateRight = false; 
    } 

    current -= rotateRight ? (totalAngle/delta) : -(totalAngle/delta); 
    return current; 
} 

編集:

current -= rotateRight ? (totalAngle/delta) : -(total/delta); 

エンド機能は、次のようになります最短経路が実際に最長であれば、と仮定し "現在 - (360 - 目標)< = 180" があります左回転、右ではありません&逆です。

+0

ありがとうございます!これはほとんどの部分で機能します!申し訳ありませんが、私はapproach()関数を非常に明確にしませんでした。関数のデルタパラメータは、実際に目標角度に向かって回転させたい角度です。しかし、あなたの実装はこのために調整するのが簡単です。 – ASasseCreations

+0

問題ありません!お役に立てて嬉しいです :) – Nepromine

関連する問題