解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑
今天可是遇到一個很簡單的需求,但是卻讓我疼了半天。
滑動屏幕控制物體旋轉(zhuǎn),但是旋轉(zhuǎn)的角度要在-60到60之間。
乍一聽這簡直是小兒科啊。
判斷一下角度不就行了。相比這四元數(shù),歐拉角雖然有時會出現(xiàn)萬向鎖,但是簡潔明了啊。
這不,我就中了一個簡潔明了的大坑。

圖中,如果你以為transform.eulerAngles =(-1,0,90)
那就大錯特錯了。
因為對于旋轉(zhuǎn)來說。360度是一個循環(huán)。-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);
這樣你就會發(fā)現(xiàn) 你的物體處并不受控制,有時候還會出現(xiàn)一種奇葩的狀態(tài)。
因為當x的值小于0后,他又變回359了。這樣又走到第一個if里面了。
那要怎么辦呢。解決方法就是:你不是負數(shù) 我把你變成負數(shù)。
public float CheckAngle(float value)
{
float angle = value - 180;
if (angle > 0)
return angle - 180;
return angle + 180;
}
通過這個方法,將他的角度在變回負數(shù)。


可以看到 圖中 x的值是-26但是輸出實際上是333。經(jīng)過方法的轉(zhuǎn)換才能成為顯示的值。
這樣就可以計算了。
2011年就有人提出這個問題了。在官方論壇下2016年還有回答??磥碚媸强恿瞬簧偃恕?/p>
補充:Unity RotateAround固定旋轉(zhuǎn)

當前顯示的為本地坐標系
//旋轉(zhuǎn)視野
void rotateVeiw()
{
float x=Input.GetAxis("Mouse X");
float y=Input.GetAxis("Mouse Y");
//函數(shù)參數(shù)(旋轉(zhuǎn)點,旋轉(zhuǎn)軸,旋轉(zhuǎn)量)
旋轉(zhuǎn)效果相當于旋轉(zhuǎn)軸平移到旋轉(zhuǎn)點上后 沿此軸旋轉(zhuǎn)相應(yīng)的量。
例上圖,如果沿本地坐標的Y軸旋轉(zhuǎn) 則會出現(xiàn)旋轉(zhuǎn)偏移到地下的情況。
必須使用下式 沿世界坐標的y軸旋轉(zhuǎn)
transform.RotateAround(plear.position,Vector3.up,x);
當單純的左右旋轉(zhuǎn)時,x軸都為固定的,所以沒有區(qū)別。
但當左右移動后,本地坐標的x軸和世界坐標的x軸有出入。

例如:此時如果選用世界坐標x軸,則左右移動后的x軸還是固定的,左右移動移動一定的量后
世界就會開始傾斜:如下圖所示:

所以此時我們應(yīng)采用 本地坐標軸x
transform.RotateAround(plear.position, transform.right, y); }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C# 7.0之ref locals and returns(局部變量和引用返回)
這篇文章主要介紹了C# 7.0之ref locals and returns,即局部變量和引用返回,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
使用快捷鍵在Unity中快速鎖定和解鎖Inspector右上角的鎖功能
這篇文章主要為大家介紹了使用快捷鍵在Unity中快速鎖定和解鎖Inspector右上角的鎖功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
C#讀取xml節(jié)點數(shù)據(jù)方法小結(jié)
這篇文章主要介紹了C#讀取xml節(jié)點數(shù)據(jù)的方法,實例總結(jié)了C#針對XML文件節(jié)點操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06
C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
本文通過例子,講述了C++調(diào)用C#的DLL程序的方法,作出了以下總結(jié),具有一定的參考價值,下面就讓我們一起來學習吧2015-10-10
c#中SAPI使用總結(jié)——SpVoice的使用方法
最近使用C#重做了點名系統(tǒng)(要用到TTS,讓計算機點名)使用了SAPI,在這里總結(jié)一下SpVoice的使用方法。2011-10-10

