欧拉角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轴的旋转,由于普通的游戏设备无
法测量纵深变化值,所以极少需要改变用到,当然可以用键盘上的按键来虚拟,略过不说。