您好,登錄后才能下訂單哦!
這個在端游上比較場景,在角色展示的時候,當攝像頭在角色身邊上下左右旋轉時,角色頭部跟隨鏡頭旋轉。如天涯明月刀等。
這個在手游上比較少見,不過實現也沒什么區別。
首先一般情況下,找到模型的頭部節點,直接用lookAt指向camera就可以了,不過一般需求不會這么簡單。
比如說,超過頭部扭動極限,頭部需要插值回到原始點;當鏡頭從外部回到極限內,需要插值回來。這時候lookat就沒法使用。
更有情況,頭部本身坐標系不在世界坐標軸上, 可能旋轉了90多或者輸出的prefab就是歪的等等,這些情況都沒辦法使用lookAt。
所以還是自己來寫吧。
這里有兩個選擇,一個用四元數rotation,一個用歐拉角localEulerAngles。
兩者就像網上所說,各有好壞
歐拉角的值就是在unity上inspector的值,非常直觀。
但是最大的問題就是會死鎖。并且這個沒什么方法解決。
如果使用的話方式是這樣,直接賦值
SceneCameraObject.transform.localEulerAngles = tar;
第二種就是選擇用四元數取旋轉。
這里使用的方式是
mHead.rotation = Quaternion.AngleAxis(rot.x -180, -mHead.right) * mHead.rotation;//傳遞過來的數據多了180,所以需要剪掉
mHead.rotation = Quaternion.AngleAxis(rot.y, mHead.forward) * mHead.rotation;
在上下左右兩個方向上,旋轉給定的角度。
這個好處也很明顯,給定角度按軸旋轉。
*這里看到上面注釋了一個180度相關,這個等下再講。
我們選擇的是第二種,四元數旋轉
所以關鍵就是有偏移角度
這個主要看你的數據來源,既然是做頭部跟隨鏡頭旋轉,一般就是由于你的手指拖動導致鏡頭旋轉,
所以我們取得是手指拖動的數據后的坐標,減去原始坐標的x,y。取得橫向縱向的角度偏移值。傳過來。
正常來說這樣就可以旋轉了。
接下來是要插值移動,讓頭部轉動的更加真實。
插值無非是調用Vector3.SmoothDamp或者Mathf.SmoothDamp。定義幾個變量,這里可以看我另一篇文章
【小松教你手游開發】【unity實用技能】unity 更漂亮的位移
http://blog.csdn.net/chrisfxs/article/details/50436738
但是這里會出現一個很嚴重的問題。就是由于0度就是360度。假如你從10度減到負數,會自己換算成360度時,就是本來從10插值到-10.結果變成從10插值到350。。。
這時候能想象到,本來向左轉的過程中,突然頭部反向旋轉360度。。。
所以就出現了上面的-180這個數。
因為我發現,0度這個臨界值在我的正前方。而按照需求,我的正后方我是不需要旋轉的。所以我只要把臨界值放到后面就好了。
真是機智如我啊
所以在傳過來的值中,每個橫向的拖動差值我都加了180度。
float degressX = angle2.x - angle1.x;
float degressY = angle2.y - angle1.y + 180;//加180是為了把臨界點放在身子后面,好處理
Vector3 vec = new Vector3(degressX,degressY,0);
GameSystemBase.GameModelSys.RotateHead(vec);
所以在最后旋轉的時候就要減回來。
完美實現。
*中間可以還有一些負數什么的問題,盡量都讓他成正數去解決
如
float value = tar.y > 0 ? tar.y % 360 : 360 + tar.y% 360;
mCurrVec3.x = mCurrVec3.x < 0 ? mCurrVec3.x + 360 : mCurrVec3.x;
這些都是方法。
因為是公司項目,具體就不方便展示了。
歡迎討論
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。