2016-06-30 13 views
0

メインカメラの位置と回転をスペースバーで変更しようとしています。 位置を変更するには問題はありませんが、カメラをz軸で回転させるには問題があります。 最初は回転が359.9fに設定されていますが、スペースバーを押した後の回転は179.9fに設定されていますが、元の回転(359.9f)に戻ると回転方向が異なります。変形回転(Slerp) - Unity

は、これは私のコードです:

using UnityEngine; 
using System.Collections; 

public class Untitled : MonoBehaviour { 

    //Lerp Position 
    private Vector3 start; 
    private Vector3 end; 

    //Lerp Time 
    private float lerpTime = 3f; 
    private float currentLerpTime = 0; 

    // Camera Up - Down 
    public bool up = false; 


    void Update() { 

     start = Camera.main.transform.position; 
     end = new Vector3 (Camera.main.transform.position.x, 105, Camera.main.transform.position.z); 

     //Quaternions 
     Quaternion RotationA = Quaternion.Euler (0, 0, 179.9f); 
     Quaternion RotationB = Quaternion.Euler (0,0, 359.9f); 

     // Inputs 
     if (Input.GetKey (KeyCode.Space) && Camera.main.transform.position.y < 8f) 
     { 
      up = true; 
      currentLerpTime = 0; 
      lerpTime = 3f; 
     } 

     if (Input.GetKey (KeyCode.Space) && Camera.main.transform.position.y > 103f) 
     { 
      up = false; 
      currentLerpTime = 0; 
      lerpTime = 3f; 
     } 

     // When the camera is down (Lerp/Slerp) 
     if (up == false) 
     { 

     currentLerpTime += Time.deltaTime; 

     if (currentLerpTime >= lerpTime) 
     { 
      currentLerpTime = lerpTime; 
     } 

     float Perc = currentLerpTime/lerpTime; 

     start = Camera.main.transform.position; 
     Camera.main.transform.position = Vector3.Lerp (start, new Vector3 (Camera.main.transform.position.x, 105, Camera.main.transform.position.z), Perc); 
     Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, RotationA, Perc); 

     } 


     // When the camera is up (Lerp/Slerp) 

     if (up == true) 
     { 

     currentLerpTime += Time.deltaTime; 

     if (currentLerpTime >= lerpTime) 
     { 
      currentLerpTime = lerpTime; 
     } 

     float Perc = currentLerpTime/lerpTime; 

     end = Camera.main.transform.position; 
     Camera.main.transform.position = Vector3.Lerp (end, new Vector3(Camera.main.transform.position.x, 6, Camera.main.transform.position.z), Perc); 
     Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, RotationB, Perc); 

     } 
    } 
} 

は私も回転するための別の方法を試してみましたが、何も変わっていません:

Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, Quaternion.AngleAxis(179.9f, Vector3.forward), Perc) 

Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, Quaternion.AngleAxis(359.9f, Vector3.forward), Perc) 

どのように私は修正できますか?前もって感謝します。

答えて

0

あなたのプログラムでは、球の回転の半分を占める2つの回転の間で交互に切り替わります。あなたの望む結果を達成するには、2回目の回転は0度に向けるべきです。あなたの現在のプログラムでは、360度の角度に戻ります。

どのようにそれが現在動作します: - > 179.9f(フロート減少)
2.第2の回転179.9f -
1.第一回転359.9f> 359.9f(フロートが上昇)
3(1から繰り返します。 )あなたはそれが動作するはずだと思うどのように

:>は0.0f(フロート減少し、おそらく359.9fにリセット - - > 179.9f(フロート減少)
2.第2の回転179.9f
1.第一の回転359.9f値がゼロになると)

ちょうど1つのより多くの回転を追加し、あなたのコーディングスタイルは、次のとおりです。その後、

//Quaternions 
Quaternion RotationA = Quaternion.Euler (0, 0, 179.9f); 
Quaternion RotationB = Quaternion.Euler (0,0, 359.9f); 
Quaternion RotationC = Quaternion.Euler (0,0, 0.0f); 

とRotationC

// When the camera is up (Lerp/Slerp) 

if (up == true) 
{ 
    ... 

    (Camera.main.transform.rotation, RotationC, Perc);  
} 

最後に回転がゼロになると、デフォルト値に戻すリセットを使用する他の回転を変更します。

void Update() { 
    if(Camera.main.transform.rotation == RotationC){ 
     Camera.main.transform.rotation = RotationB; 
    } 
} 
関連する問題