

オブジェクトを回転させた後に綺麗に回転を初期値に戻す方法がわからないので質問させていただきます。

例えば車のハンドルオブジェクトがあるとして

  1. ハンドルを90°回転させる。(ハンドルの初期位置は0°とします)
  2. そのハンドルを初期値0°に徐々に戻していく処理を書く。

コード:

[code]

    void rotate()
    {
          // -180～180の範囲に変換
          float rotateY = (transform.eulerAngles.y > 180) ? transform.eulerAngles.y - 360 : transform.eulerAngles.y;
    
          // 0.2は遊び値
          if (rotateY <= -0.2f)
          {
              transform.eulerAngles += new Vector3(0.0f, 20.0f, 0.0f) * Time.deltaTime;
          }
          else if (rotateY >= 0.2f)
          {
              transform.eulerAngles -= new Vector3(0.0f, 20.0f, 0.0f) * Time.deltaTime;
          }
    }
    
[/code]

このような感じで90°オブジェクトを回転させた後に初期の回転値戻しているのですが、  
このままでは正確には初期値に戻りませんし、戻すときの回転速度が速いと遊び値を抜けてしまいます。

こう言った処理を書くときに何か定石のような方法はあるのでしょうか？


CC BY-SA 3.0
2016-03-03T01:24:48.260
22749
2016-03-04T03:50:32.260
2016-03-03T04:35:21.840
2599
13465
question
unity3d
オブジェクトを一定方向回転させた後に綺麗に初期値に戻す方法。


差分を累積してゆくとどうしても誤差が生じるので、一般的な定石としては、各時刻における変位を都度計算します。

例えば時刻T0で角度φだけ回転していて、それを時刻T1で0になるように一定角速度で戻したいのであれば、各フレームにおいてそのフレームの時刻Tから
(擬似コードでロジックだけ示します)

[code]

    if (T >= T1)
      angle = 0
    else
      angle = φ * (T1 - T)/(T1 - T0)
    
[/code]

といった具合です。現実の実装では戻しアニメーションの起点となるT0やφをアニメーション終了まで一時的に覚えておく必要があります。(「実行中のアニメーション」を表現する一時的なオブジェクトを作る、等)。


CC BY-SA 3.0
2016-03-04T03:50:32.260
22784
2016-03-04T03:50:32.260
5258
22749
answer