解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑
今天可是遇到一個(gè)很簡(jiǎn)單的需求,但是卻讓我疼了半天。
滑動(dòng)屏幕控制物體旋轉(zhuǎn),但是旋轉(zhuǎn)的角度要在-60到60之間。
乍一聽(tīng)這簡(jiǎn)直是小兒科啊。
判斷一下角度不就行了。相比這四元數(shù),歐拉角雖然有時(shí)會(huì)出現(xiàn)萬(wàn)向鎖,但是簡(jiǎn)潔明了啊。
這不,我就中了一個(gè)簡(jiǎn)潔明了的大坑。
圖中,如果你以為transform.eulerAngles =(-1,0,90)
那就大錯(cuò)特錯(cuò)了。
因?yàn)閷?duì)于旋轉(zhuǎn)來(lái)說(shuō)。360度是一個(gè)循環(huán)。-1° 也可以算是就是359°
而且unity就是這樣認(rèn)為的。面板上雖然顯示的是-1。但是他運(yùn)行時(shí)是359。
這就讓我的判斷出了問(wèn)題。
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);
這樣你就會(huì)發(fā)現(xiàn) 你的物體處并不受控制,有時(shí)候還會(huì)出現(xiàn)一種奇葩的狀態(tài)。
因?yàn)楫?dāng)x的值小于0后,他又變回359了。這樣又走到第一個(gè)if里面了。
那要怎么辦呢。解決方法就是:你不是負(fù)數(shù) 我把你變成負(fù)數(shù)。
public float CheckAngle(float value) { float angle = value - 180; if (angle > 0) return angle - 180; return angle + 180; }
通過(guò)這個(gè)方法,將他的角度在變回負(fù)數(shù)。
可以看到 圖中 x的值是-26但是輸出實(shí)際上是333。經(jīng)過(guò)方法的轉(zhuǎn)換才能成為顯示的值。
這樣就可以計(jì)算了。
2011年就有人提出這個(gè)問(wèn)題了。在官方論壇下2016年還有回答??磥?lái)真是坑了不少人。
補(bǔ)充:Unity RotateAround固定旋轉(zhuǎn)
當(dāng)前顯示的為本地坐標(biāo)系
//旋轉(zhuǎn)視野 void rotateVeiw() { float x=Input.GetAxis("Mouse X"); float y=Input.GetAxis("Mouse Y"); //函數(shù)參數(shù)(旋轉(zhuǎn)點(diǎn),旋轉(zhuǎn)軸,旋轉(zhuǎn)量)
旋轉(zhuǎn)效果相當(dāng)于旋轉(zhuǎn)軸平移到旋轉(zhuǎn)點(diǎn)上后 沿此軸旋轉(zhuǎn)相應(yīng)的量。
例上圖,如果沿本地坐標(biāo)的Y軸旋轉(zhuǎn) 則會(huì)出現(xiàn)旋轉(zhuǎn)偏移到地下的情況。
必須使用下式 沿世界坐標(biāo)的y軸旋轉(zhuǎn)
transform.RotateAround(plear.position,Vector3.up,x);
當(dāng)單純的左右旋轉(zhuǎn)時(shí),x軸都為固定的,所以沒(méi)有區(qū)別。
但當(dāng)左右移動(dòng)后,本地坐標(biāo)的x軸和世界坐標(biāo)的x軸有出入。
例如:此時(shí)如果選用世界坐標(biāo)x軸,則左右移動(dòng)后的x軸還是固定的,左右移動(dòng)移動(dòng)一定的量后
世界就會(huì)開(kāi)始傾斜:如下圖所示:
所以此時(shí)我們應(yīng)采用 本地坐標(biāo)軸x
transform.RotateAround(plear.position, transform.right, y); }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- Unity3D運(yùn)行報(bào)DllNotFoundException錯(cuò)誤的解決方案
- unity avprovideo插件的使用詳解
- unity里獲取text中文字寬度并截?cái)嗍÷缘牟僮?/a>
- Unity3D啟動(dòng)外部程序并傳遞參數(shù)的實(shí)現(xiàn)
- unity 如何獲取button文本的內(nèi)容
- unity 如何獲取Text組件里text內(nèi)容的長(zhǎng)度
- unity 如何使用文件流讀取streamingassets下的資源
- unity 文件流讀取圖片與www讀取圖片的區(qū)別介紹
- Unity之繞軸進(jìn)行旋轉(zhuǎn)的操作
- 詳解Unity安卓共享紋理
相關(guān)文章
解析Silverlight調(diào)用WCF/Rest異常的解決方法
本篇文章對(duì)Silverlight調(diào)用WCF/Rest異常的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Unity Shader實(shí)現(xiàn)動(dòng)態(tài)過(guò)場(chǎng)切換圖片效果
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)動(dòng)態(tài)過(guò)場(chǎng)切換圖片效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C# Winform使用擴(kuò)展方法實(shí)現(xiàn)自定義富文本框(RichTextBox)字體顏色
這篇文章主要介紹了C# Winform使用擴(kuò)展方法實(shí)現(xiàn)自定義富文本框(RichTextBox)字體顏色,通過(guò).NET的靜態(tài)擴(kuò)展方法來(lái)改變RichTextBox字體顏色,需要的朋友可以參考下2015-06-06user32.dll 函數(shù)說(shuō)明小結(jié)
這篇文章主要介紹了user32.dll 函數(shù)說(shuō)明,需要的朋友可以參考下2018-06-06C#?崩潰異常中研究頁(yè)堆布局的詳細(xì)過(guò)程
最近遇到一位朋友的程序崩潰,發(fā)現(xiàn)崩潰點(diǎn)在富編輯器 msftedit 上,這個(gè)不是重點(diǎn),重點(diǎn)在于發(fā)現(xiàn)他已經(jīng)開(kāi)啟了 頁(yè)堆,由于 頁(yè)堆 和 NT堆 的內(nèi)存布局完全不一樣,這一篇結(jié)合我的了解以及 windbg 驗(yàn)證來(lái)系統(tǒng)的介紹下 頁(yè)堆,需要的朋友可以參考下2022-10-10那些年,我還在學(xué)習(xí)C# 學(xué)習(xí)筆記
那些年學(xué)了ASP.NET后,才開(kāi)始學(xué)習(xí)C#,說(shuō)來(lái)也怪,怎么學(xué)了ASP.NET才來(lái)學(xué)習(xí)C#,其實(shí)沒(méi)有什么的2012-03-03c#使用windows服務(wù)更新站點(diǎn)地圖的詳細(xì)示例
這篇文章主要介紹了c#使用windows服務(wù)更新站點(diǎn)地圖的詳細(xì)示例,需要的朋友可以參考下2014-04-04