2011-07-17 25 views
1

單挑:即使這個問題出現在我使用Unity的時候,它沒有任何特定的Unity,而更多的是關於編程邏輯,所以請不要回避。問題與角度的界限

我正在使用Unity並通過腳本旋轉對象。事情是,如果我把它旋轉到180度,物體不會精確地旋轉到那麼多,並趨於停止在179到181度之間。因此,爲了檢查旋轉是否完成,我檢查旋轉角度是否爲targetAngle +/- 1,這是有效的。

我檢查使用

if (transform.eulerAngles.z > lowerLimit && transform.eulerAngles.z < upperLimit) 

其中

lowerLimit = targetAngle-1; 
upperLimit = targetAngle + 1; 

現在,當targetAngle爲0。在這種情況下,問題就出現了,我的腳本檢查,如果旋轉角度爲-1到1之間。但是,-1應該是359,因此需要檢查角度是否在359和1之間。

我該如何實現? 換句話說,我猜我在問如何實現一個環繞數字系統。

編輯

找到一個解決方法。如果targetAngle爲0,我特意處理。它有效,但不是最優雅的。

  if (targetAngle == 0.0) 
     { 
      if ((transform.eulerAngles.z > 359.0 && transform.eulerAngles.z <= 360.0) || (transform.eulerAngles.z >= 0.0 && transform.eulerAngles.z <= 1)) 
      { 
       rotate = false;    
      } 
     } 
     else 
     { 
      if (transform.eulerAngles.z > targetAngle - 1 && transform.eulerAngles.z < targetAngle + 1) 
      { 
       rotate = false;    
      } 
     } 

回答

2

你可以這樣做......

lowerLimit = (targetAngle % 360) + 359; //360 - 1; 
upperLimit = (targetAngle % 360) + 361; //360 + 1; 

if (((transform.eulerAngles.z + 360) % 360) > lowerLimit 
&& ((transform.eulerAngles.z + 360) % 360) < upperLimit) 

這使檢查遠離零,你就不會去對付正/負檢查。

EDIT

%操作者在限制targetAngle的-359旋轉至+/- 359度,所以721的目標角度將回落到1,和目標角度會回落到對於我所想的所有情況,這應該做得很好。

EDIT 2

要解決您在您的評論中提到的最後一種情況下,我想你需要同樣的包裝邏輯適用於您transform.eulerAngles.z值。也許最好把這個包裝在一個額外的功能了,所以試試這個:

int wrapNumber(int input) // replace int with whatever your type is 
{ 
    // this will always return an angle between 0 and 360: 
    // the inner % 360 restricts everything to +/- 360 
    // +360 moves negative values to the positive range, and positive ones to > 360 
    // the final % 360 caps everything to 0...360 
    return ((input % 360) + 360) % 360; 
} 

lowerLimit = wrapNumber(targetAngle) + 359; //360 - 1; 
upperLimit = wrapNumber(targetAngle) + 361; //360 + 1; 

if (wrapNumber(transform.eulerAngles.z) + 360 > lowerLimit 
&& wrapNumber(transform.eulerAngles.z) + 360 < upperLimit) 

根據您需要多長時間使用,檢查某些情況下可能會刪除不必要的開銷。例如,wrapNumber中的最後% 360僅在輸入爲正值時才需要。如果你每分鐘撥打這十次,這可能無關緊要。如果你每秒鐘調用它一百次,你可能想要檢查它在這種情況下的表現。

+0

啊,非常好。在這個特殊情況下,我不會需要超過180轉,所以我想我會採用這個。謝謝! – xbonez

+0

我仍然遇到這個問題。如果targetAngle爲0,lowerLimit爲359,upperLimit爲361.但是,當從180旋轉到0(與360相同)時,旋轉停止在359左右。因此,在這種情況下,我檢查 如果((359 + 360) > 359 &&(359 + 360)<361) – xbonez

+0

請嘗試上次編輯。我100%確定這可以通過巧妙使用模數和根據需要添加360來解決。如果仍然不是這樣,恐怕我可能需要在調試環境中看到它,才能完全掌握它。既然我現在要走了,如果你發佈你的進度(除非你或其他人修復過),我會在今晚或明天再次看到這一點。 – takrl

1

這可能是一個古老的線程,但看了很多不同的片段,都試圖處理包裝我發現,Unity有一個很好的內置函數,只是照顧業務,至少在我的情況下,我最終的結果我需要是一個lerp,所以我只需要將其更改爲LerpAngle,並返回一個穩定的結果。

Mathf.LerpAngle是你的朋友..解決了所有我的問題與彈出等。

http://docs.unity3d.com/ScriptReference/Mathf.LerpAngle.html