歐拉角eulerAngles在Unity3D是一個Vector3類的變量,官方約定俗成的層級關系是ZXY,即最里層是Z軸先旋轉,中間層是X軸,最外層是Y軸。
unity中的歐拉角有兩種方式可以解釋:
1,當認為順序是yxz時(其實就是heading - pitch - bank),是傳統的歐拉角變換,也就是以物體自己的坐標系為軸的。
2,當認為順序是zxy時(roll - pitch - yaw),也是官方文檔的順序時,是以慣性坐標系為軸的。后者比較直觀一些,但其實兩者的實際效果是一樣的,只是理解不一樣。
無論以何種方式旋轉三個軸,都會有出現萬向鎖的情況,萬向鎖主要在動畫里面旋轉時出現我們不希望見到的旋轉路徑,所以官方以ZXY順序來旋轉的時候可以最大程度上避免普通情況下會出現的萬向鎖。
當然最好的解決方法是使用四元數,但是由於我現在沒來得及深入學習,隨后再進行探討。
下面來說一下一些疑惑的代碼,梳理一下理解的順序:
float xm = 0, ym = 0, zm = 0; //設定三個浮點數用以保存主角的移動位置 float rh = Input.GetAxis("Mouse X"); //浮點數rh用來保存鼠標繞X軸的移動,rv用以保存繞Y軸的移動 float rv = Input.GetAxis("Mouse Y"); m_camRot.x -= rv; //攝像機每秒繞X軸旋轉的歐拉角度 m_camRot.y += rh; //攝像機每秒繞Y軸旋轉的歐拉角度
代碼的2,3行是取得鼠標繞X軸和Y軸的移動數據,m_camRot是一個歐拉角類型的變量,第4行代碼表示的是歐拉角m_camRot繞x軸旋轉的度數,第五行是繞y軸,如果不大懂可以看下圖:
鼠標上下移動(MouseY)改變的是X軸的旋轉數據,而左右移動(MouseX)改變的是Y軸的旋轉數據,至於Z軸的旋轉,由於普通的游戲設備無
法測量縱深變化值,所以極少需要改變用到,當然可以用鍵盤上的按鍵來虛擬,略過不說。