1. 程式人生 > >【小松教你手遊開發】【unity實用技能】角色頭部跟隨鏡頭旋轉

【小松教你手遊開發】【unity實用技能】角色頭部跟隨鏡頭旋轉

這個在端遊上比較場景,在角色展示的時候,當攝像頭在角色身邊上下左右旋轉時,角色頭部跟隨鏡頭旋轉。如天涯明月刀等。

這個在手遊上比較少見,不過實現也沒什麽區別。

首先一般情況下,找到模型的頭部節點,直接用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;  

這些都是方法。

因為是公司項目,具體就不方便展示了。
歡迎討論

【小松教你手遊開發】【unity實用技能】角色頭部跟隨鏡頭旋轉