四元数和欧拉角
四元数
四元数可用于表示GameObject的方向或旋转。四元数表示法内部包含四个数字(x,y,z,w),但是这些数字并不表示角度或轴,因此通常不需要直接访问它们。
欧拉角
欧拉角是一种以角度的形式描述物体在三个轴上旋转的方法,通常用三个值表示,分别代表绕X轴、Y轴和Z轴的旋转角度。在Unity中,这些角度可以以度数或弧度表示。
欧拉角可以使用Transform组件的rotation属性来访问和修改。Unity在内部将欧拉角表示为四元数(Quaternion),但在面板中显示和操作时,使用的是欧拉角,以提供更直观和易于理解的方式进行操作。
需要注意的是,使用欧拉角旋转时可能会出现万向锁(Gimbal Lock)的问题。当两个轴的旋转角度非常接近时,可能会导致无法准确描述物体的旋转。为了避免万向锁问题,可以使用四元数表示旋转,它可以提供更稳定和精确的旋转操作,但在面板中不直观。
欧拉角更加直观,可以直接看到旋转角度。取值范围:[0,360]
旋转属性rotation
Unity面板中的旋转属性(rotation)使用欧拉角(Euler Angles)来表示物体的旋转。
获取游戏物体的欧拉角值:transform.eulerAngles.y 获取游戏物体的四元数值: transform.rotation.y
图例:
欧拉角和四元数的转换
-
从欧拉角到四元数: 可以使用Quaternion.Euler方法将欧拉角转换为四元数。例如,如果有一个欧拉角表示为Vector3(30, 45, 60),可以将其转换为四元数表示如下:
iniVector3 eulerAngle = new Vector3(30, 45, 60); Quaternion quaternion = Quaternion.Euler(eulerAngle);
-
从四元数到欧拉角: 可以使用Quaternion.eulerAngles属性将四元数转换为欧拉角(以度数为单位)。例如,如果有一个四元数表示为Quaternion(0.5f, 0.3f, 0.1f, 0.9f),可以将其转换为欧拉角表示如下:
iniQuaternion quaternion = new Quaternion(0.5f, 0.3f, 0.1f, 0.9f); Vector3 eulerAngle = quaternion.eulerAngles;
3.局部坐标和世界坐标
js
Debug.LogFormat("局部坐标: x:{0},y:{1},z:{2}", transform.localPosition.x, transform.localPosition.y, transform.localPosition.z);
Debug.LogFormat("世界坐标: x:{0},y:{1},z:{2}", transform.position.x, transform.position.y, transform.position.z);
4.Vector3 Unity采用的是左手坐标系:
前:Vector3.forward (z轴正方向)
后:Vector3.back (z轴负方向)
左:Vector3.left (x轴负方向)
右:Vector3.right (x轴正方向)
上:Vecto3.up (y轴正方向)
下:Vector3.down (y轴负方向)
5.Quaternion: Unity提供了将欧拉角转换为四元数的方法,可以使用Quaternion.Lerp()方法来完成,这是一种插值旋转方法,所以旋转速度会越来越慢,适合模拟减速效果:
js
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, 90), 0.05f);
Quaternion方法:
makefile
Quaternion.RotateTowards():插值旋转至与目标角度相同
Quaternion.LookRotation():插值旋转看向目标
可以通过上面两种方法完成看向目标,或与目标角度一致,具体用法可以为:
ini
//与target保持一样的角度
transform.rotation = Quaternion.RotateTowards(transform.rotation,target.rotation,2f);
//看向目标
transform.rotation = Quaternion.LookRotation(target.position);
6.游戏物体移动至目标点
js
transform.position = Vector3.Lerp(transform.position, endTransform.position, Time.deltaTime*10f);
transform.rotation = Quaternion.LookRotation(endTransform.position);