2016-05-18 38 views
-1

我很團結一點,並以創建非game2D應用程序的特殊方式使用它所以我只使用UI元素工作。我正在處理一些我想要做的事情。我有哪個輪之後的手指(或鼠標),但對象不能走出「區域」的對象這裏是我的代碼現在:限制Z軸上物體旋轉的問題

using UnityEngine; 
using System.Collections; 
public class SteeringWheel : MonoBehaviour 
{ 
    public float angleMax = 90.0f; 
    private float baseAngle = 0.0f; 
    void OnMouseDown() 
    { 
     Vector3 pos = Camera.main.WorldToScreenPoint(transform.position); 
     pos = Input.mousePosition - pos; 
     baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg; 
     baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg; 
    } 

    void OnMouseDrag() 
    { 
     Vector3 pos = Camera.main.WorldToScreenPoint(transform.position); 
     pos = Input.mousePosition - pos; 
     float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle; 
     Debug.Log("ang1 : " + ang); 
     ang = Mathf.Clamp(ang, -90, 90); 
     if (transform.eulerAngles.z >= 89 && transform.eulerAngles.z <= 271) 
     { 
      transform.rotation = new Quaternion(transform.rotation.x, transform.rotation.y, 0.7f, transform.rotation.w); 
      return; 
     }  
     transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);   
    } 
} 

,這裏是一個問題的GIF:

http://img15.hostingpics.net/pics/324271Animation.gif

+0

你不小心使用「四元」。在Unity中不要使用「四元數」。只需簡單地設置eulerAngles即可。或者,更容易,只需使用「旋轉」(「RotateAround」也非常方便。)Cordialement, – Fattie

+0

四元數對於3D​​旋轉非常有用,因此使用它們沒有任何問題。至於旋轉問題,我真的不明白爲什麼你用一個固定的Z值創建一個新的四元數。除非你知道如何正確使用它們,否則你不應該用你自己的X,Y,Z和W值創建你自己的四元數,因爲它們不是歐拉值。嘗試用你已經做過的Angleaxis交換,但用transform.rotation.eulerangles代替 –

+0

@PatrickDahlin我這樣做是因爲如果我不這樣做,當我的光標比90°更遠(在左邊)時,「滑塊」在右側以270°的角度 –

回答

0

謝謝您的回答:) 我問團結回答我的問題,有人回答我 我解決我的問題是這樣的:

public class SteeringWheel : MonoBehaviour 
{ 
    public float angleMax = 90.0f; 
    private float baseAngle = 0.0f; 

    void OnMouseDown() 
    { 
     Vector3 pos = Camera.main.WorldToScreenPoint(transform.position); 
     pos = Input.mousePosition - pos; 
     baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg; 
     baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg; 
    } 

    void OnMouseDrag() 
    { 
     Vector3 pos = Camera.main.WorldToScreenPoint(transform.position); 
     pos = Input.mousePosition - pos; 
     //float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle; 
     float ang = Mathf.Atan2(Mathf.Max(pos.y, 0), pos.x) * Mathf.Rad2Deg - baseAngle; 
     Debug.Log("ang1 : " + ang); 
     ang = Mathf.Clamp(ang, -90, 90);   
     transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward); 
    } 
} 
0

與baseAngle而不是事後刪除if語句,並在它的一切,並把Mathf.Clamp呼叫之前減法。

  • if語句是錯誤的,因爲它會檢查設置前變換旋轉 。無論以前的輪換是什麼, 如果你只是要改變它。
  • 底角是在運行時計算的,所以將其限制在預定範圍內沒有任何意義。無論如何,夾緊範圍似乎更適合baseAngle減法之前的值。

我沒有看到您的代碼有任何問題,這兩個更改不會修復。

(我假設,順便說一句,這是baseAngle在車輪的中心。如果沒有,你應該相應地改變你的範圍。)

乾杯!