解決unity rotate旋轉物體 限制物體旋轉角度的大坑
今天可是遇到一個很簡單的需求,但是卻讓我蛋疼瞭半天。
滑動屏幕控制物體旋轉,但是旋轉的角度要在-60到60之間。
乍一聽這簡直是小兒科啊。
判斷一下角度不就行瞭。相比這四元數,歐拉角雖然有時會出現萬向鎖,但是簡潔明瞭啊。
這不,我就中瞭一個簡潔明瞭的大坑。
圖中,如果你以為transform.eulerAngles =(-1,0,90)
那就大錯特錯瞭。
因為對於旋轉來說。360度是一個循環。-1° 也可以算是就是359°
而且unity就是這樣認為的。面板上雖然顯示的是-1。但是他運行時是359。
這就讓我的判斷出瞭問題。
if(angle>60) transform.eulerAngles = new Vector3(60, transform.eulerAngles.y, transform.eulerAngles.z); if(angle<-60) transform.eulerAngles = new Vector3(-60, transform.eulerAngles.y, transform.eulerAngles.z);
這樣你就會發現 你的物體處並不受控制,有時候還會出現一種奇葩的狀態。
因為當x的值小於0後,他又變回359瞭。這樣又走到第一個if裡面瞭。
那要怎麼辦呢。解決方法就是:你不是負數 我把你變成負數。
public float CheckAngle(float value) { float angle = value - 180; if (angle > 0) return angle - 180; return angle + 180; }
通過這個方法,將他的角度在變回負數。
可以看到 圖中 x的值是-26但是輸出實際上是333。經過方法的轉換才能成為顯示的值。
這樣就可以計算瞭。
2011年就有人提出這個問題瞭。在官方論壇下2016年還有回答。看來真是坑瞭不少人。
補充:Unity RotateAround固定旋轉
當前顯示的為本地坐標系
//旋轉視野 void rotateVeiw() { float x=Input.GetAxis("Mouse X"); float y=Input.GetAxis("Mouse Y"); //函數參數(旋轉點,旋轉軸,旋轉量)
旋轉效果相當於旋轉軸平移到旋轉點上後 沿此軸旋轉相應的量。
例上圖,如果沿本地坐標的Y軸旋轉 則會出現旋轉偏移到地下的情況。
必須使用下式 沿世界坐標的y軸旋轉
transform.RotateAround(plear.position,Vector3.up,x);
當單純的左右旋轉時,x軸都為固定的,所以沒有區別。
但當左右移動後,本地坐標的x軸和世界坐標的x軸有出入。
例如:此時如果選用世界坐標x軸,則左右移動後的x軸還是固定的,左右移動移動一定的量後
世界就會開始傾斜:如下圖所示:
所以此時我們應采用 本地坐標軸x
transform.RotateAround(plear.position, transform.right, y); }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found