2016-04-19 17 views
1

Ich versuche eine Kugel mit Benutzerkontrolle zu drehen.Benutzergesteuerte Quaternion Slerp?

void RotateGlobe() { 
    SetLock(); 

    if (Input.GetMouseButton(0)) 
    { 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     userInput.x = Input.GetAxis("Mouse X"); 
     userInput.y = Input.GetAxis("Mouse Y"); 

     if (userInput.magnitude > 0 & Physics.Raycast(ray, Mathf.Infinity, LayerMask.NameToLayer("UI"))) 
     { 
      Vector2 movement = new Vector2(Mathf.Sign(userInput.x), Mathf.Sign(userInput.y)); 

      globe.transform.rotation = 
       Quaternion.Slerp(globe.transform.rotation, 
       Quaternion.Euler(0, movement.y * 90, movement.x * 180 + globe.transform.rotation.eulerAngles.x), 
       Time.time * speed); 
     } 
    } 

    RemoveLock(); 
} 

Ich verstehe nicht ganz, Quaternionen (dann wieder, wer wirklich der Fall ist), aber nicht nur die Kugel nicht richtig auf Benutzereingaben reagiert, wird es auf der x-Achse stecken zu bleiben. Ich nehme an, dass es wahrscheinlich den kürzesten Weg von 180 nach -180 nimmt, indem ich mich nicht bewege.

Ich denke an diesem Punkt bin ich völlig bereit, diesen Code zugunsten einer besseren Methode (nicht Slerp) zu ändern, aber ich bin völlig stecken geblieben und frühere Methoden waren gleichermaßen schwierig und abgehackt.

Wie würden Sie vorschlagen, dass ich diese Kugel rotiere?

Als Bonus, wenn ich eine Achse beschränken könnte, wäre das toll. Ich möchte nicht wirklich weiter als 90 oder -90 drehen.

+0

niemals Quaternionen aus irgendeinem Grund verwenden, Anders. Sie können alle Winkel mit localEulerAngles oder eulerAngles einstellen, oder noch besser ** einfach drehen ** oder vielleicht ** drehenAround ** – Fattie

+0

Ich schätze die Stimmung dahinter, weil ich sie auch hasse, aber Slerp und Lerp sind einfach so glatt und optimiert ... Plus RotateAround ist in 5.4 veraltet. –

+0

RotateAround ist nicht veraltet, Sie verwenden nur die alte: google http://answers.unity3d.com/answers/540399/view.html – Fattie

Antwort

2

einfache Lösung - Sie verwenden können, Unity RotateAround, die eine ihrer nützlichsten Anrufe ist

http://docs.unity3d.com/ScriptReference/Transform.RotateAround.html

Hinweis, dass es einige verwirrende Kommentare online, dass RotateAround ist veraltet; Tatsächlich ist es nur eine alte Version, die veraltet ist. Es ist einer der häufigsten Anrufe, die Sie in Unity verwenden. Genießen!

zweitens.

Beachten Sie, dass Sie tatsächlich die Euler-Winkel berechnen! oder mögliche localEulerAngles. können Sie einfach zwischen ihnen slerp !!!!

so etwas wie ....

Vector3 fromEulers = blah; 
Vector3 toEulers = blah; 

transform.localEulerAngles = .. slerp .. fromEulers toEulers; 

schließlich. Beachten Sie, dass die "lerp-like" -Funktionen Äquivalente wie MoveTowards haben, die Sie "in Ihrem eigenen Schritt" verwenden können.

SmoothStep ist eigentlich über den nützlichsten Anruf in aller Einheit!