3Dゲームを製作しています。
マウスのスワイプに応じて画面上のオブジェクトを滑らかに90度ずつ回転させたいです。
いくつか思いつく方法を試したのですが、どれもうまくいきませんでした。
瞬間的でなく滑らかに、目標の角度と小さい誤差で回転させる方法をご教授願いたいです。
<試したこと>
IEnumerator RotateAxisY()
{
var currentRotation = rotatingAxis.transform.localEulerAngles; var newRotation = currentRotation + new Vector3(90, 0, 0); Debug.Log(currentRotation); Debug.Log(newRotation); for (float t=0;t<0.5f;t+=Time.deltaTime) { Vector3 rotation = Vector3.Lerp(currentRotation, newRotation, t * 2); //rotatingAxisは回転させるオブジェクト rotatingAxis.transform.localEulerAngles = rotation; yield return null; } //ちょうど90度刻みになるように調整 rotatingAxis.transform.localEulerAngles = newRotation; }
上記のコルーチンをスワイプ入力時に呼び出す方法では、3回転目以降に回転方向が逆になってしまい、うまくいきませんでした。
差し込んであるDebug.Logで回転前と回転後予定のrotation値を見たところ、3回転目までは(0,0,0)、(90,0,0)、(180,0,0)と進んでいたのが、3回転目で急に(0,180,180)となっていたのでこれが原因だと思います。
今回のような実装ではオイラー角を使うべきではないんでしょうか?
iTweenのRotateAddも試したのですが、なぜか回転のたびに無視できない大きさの誤差が生じてしまいました。
これについては以前teratailで質問させてもらったのですが、原因はわからずでした。
ーーー
目標の角度まで滑らかに回転させるには、Update内やコルーチンで秒数をカウントする必要があり、それだと現実時間と違ってゲーム内時間はフレームごとに断続的に進む以上どうしても小さくない誤差が生じてしまいます。
その誤差をできるだけ小さくするには結局Transformに目標の角度を代入する行程が必須だと思うのですが、上記の通り、オイラー角の仕様?にひっかかってうまくいきません。
そもそものスクリプトの書き方や実装方法の認識に間違いがあれば指摘していただけると助かります。
回答よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。