2016-06-30 16 views
0

Ich versuche, die Position und Drehung der Hauptkamera mit der Leertaste zu ändern. Zum Ändern der Position habe ich keine Probleme, finde aber Probleme beim Drehen der Kamera auf der Z-Achse. Anfänglich ist die Drehung auf 359.9f eingestellt, nach dem Drücken der Leertaste wird die Drehung auf 179.9f gesetzt, aber wenn ich zurück zur ursprünglichen Drehung (359.9f) gehe, ist die Drehrichtung anders.Drehung umwandeln (Slerp) - Unity

Dies ist mein Code:

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); 

     } 
    } 
} 

Ich habe auch versucht eine andere Methode zur Rotation, aber nichts hat sich geändert:

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) 

Wie kann ich das beheben? Danke im Voraus.

Antwort

0

Was Ihr Programm tut, ist der Wechsel zwischen zwei Rotationen, die für die Hälfte der Rotation der Kugel verantwortlich sind. Um das gewünschte Ergebnis zu erzielen, sollte die zweite Rotation in Richtung 0 erfolgen. In Ihrem aktuellen Programm dreht es sich um 360 Grad zurück.

Wie es derzeit arbeitet:
1. erste Dreh 359.9f -> 179.9f (float abnehmend)
2. zweite Dreh 179.9f -> 359.9f (float zu erhöhen)
3. (Wiederholung von 1.

)

Wie Sie denken, sollte es arbeiten werden:
1. erste Dreh 359.9f -> 179.9f (float abnehmend)
2. zweite Dreh 179.9f -> 0.0f (float zu verringern und möglicherweise das Zurücksetzen auf 359.9f wenn der Wert null erreicht)

Ihren Programmierstil zu folgen, fügen Sie nur eine weitere Drehung:

//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); 

und dann die andere Drehung ändern RotationC

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

if (up == true) 
{ 
    ... 

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

und schließlich das Zurücksetzen wieder auf den Standardwert zu verwenden, wenn die Rotation Null erreicht:

void Update() { 
    if(Camera.main.transform.rotation == RotationC){ 
     Camera.main.transform.rotation = RotationB; 
    } 
}