今天想实现自转的效果,顺便看到了公转……还看到好多方法,里面的四元数和欧拉角都不清楚概念…… 之后推荐文章里面又涉及了朝向问题,想到项目后面也确实用得到……最后就决定把这些知识整理一下! (不过Quaternion相关的内容有点多,朝向问题留到下一篇来整理好啦~) 先说旋转:
transform.RotateAround(Vector3 point, Vector3 axis, float angle);
public GameObject Axis;//轴,用于选择围绕中心 public float RotateSpeed;//旋转速度 void Update () { this.transform.RotateAround (Axis.transform.position, Vector3.up,RotateSpeed); }第一个参数是需要旋转的方向+速率,(可以用Vector3向量或者单独的x,y,z值表示); 第二个参数是指旋转选择的中心(第二个参数可省略,默认以自己为中心)
transform.Rotate(vector3,Space.Self):以自身坐标系为参考 transform.Rotate(vector3,Space.World):以世界坐标系为参考 transform.Rotate(x,y,z):省略第二个参数,以自身坐标系为参考,分别以x度y度z度绕X轴、Y轴、Z轴匀速旋转
参考文章:Unity3D如何用脚本旋转物体(多种方式旋转)
public float RotateSpeed;//旋转速度 void Update () { transform.Rotate(Vector3.down* RotateSpeed,Space.World); }这种方法需要在Update函数中使得向量的值每帧变化来进行赋值。 这一类方法也可以分成rotation和eulerAngles两类,区别于local(相对于父级的变换)和世界坐标系下的变换。 通过第二大类和第一大类方法的比较,也能理解Rotate()和.rotation的区别。
为了更好的区别和理解这四种方法,需要了解transform组件变量。
transform变量属性说明position世界坐标系中,transform的位置localPosition相对于父级的变换的位置eulerAngles旋转作为欧拉角度localEulerAngles相对于父级的变换的旋转欧拉角度rotation世界坐标系中,物体旋转的角度(作为Quaternion存储)localRotation相对于父位置的旋转scale世界坐标系中的缩放localScale相对于父级的缩放parent返回物体变换的父级root返回最高层次的(在Unity的Inspector面板中,显示的transform组件的值都是相对于父位置的,也就是local的值) 下图通过实验清晰地显示出了世界坐标和local坐标之间的关系: 图片参考自:Unity3d中Transform组件Rotate()和rotation变量详解
至于rotation和eulerAngle的区别,改变transform.rotation中的值,则是改变eulerAngle的值。
以上就是基础的旋转操作啦 – “为什么一个旋转的实现就有这么多方法啊”(哀怨) “欧拉角可能会导致万向节死锁,四元数和旋转矩阵的方法就可以解决这个问题” – “万向节死锁……好像听说过……” “万向节死锁(Gimbal Lock)问题 这个文章清晰易懂” –(顺便这个博主好厉害) – 四元数与欧拉角 这篇文章也已经很清晰了