Unity中的角度与旋转

四元数和欧拉角

四元数

四元数可用于表示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

图例:

欧拉角和四元数的转换

  1. 从欧拉角到四元数: 可以使用Quaternion.Euler方法将欧拉角转换为四元数。例如,如果有一个欧拉角表示为Vector3(30, 45, 60),可以将其转换为四元数表示如下:

    ini 复制代码
    Vector3 eulerAngle = new Vector3(30, 45, 60);
    Quaternion quaternion = Quaternion.Euler(eulerAngle);
  2. 从四元数到欧拉角: 可以使用Quaternion.eulerAngles属性将四元数转换为欧拉角(以度数为单位)。例如,如果有一个四元数表示为Quaternion(0.5f, 0.3f, 0.1f, 0.9f),可以将其转换为欧拉角表示如下:

    ini 复制代码
    Quaternion 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);
相关推荐
Thomas_YXQ12 天前
Unity3D项目为什么要使用FairyGUI
开发语言·unity·游戏引擎·unity3d·游戏开发
nicepainkiller12 天前
Flutter 内嵌 unity3d for android
flutter·unity3d
Thomas_YXQ1 个月前
Unity3D ngui和ugui区别与优缺点详解
服务器·游戏·unity·unity3d·游戏开发
Thomas_YXQ1 个月前
Unity3D Lua如何支持面向对象详解
开发语言·游戏·junit·性能优化·lua·unity3d
Thomas游戏开发1 个月前
Unity3D 逻辑服的Entity, ComponentData与System划分详解
前端框架·unity3d·游戏开发
大眼睛姑娘1 个月前
unity运行状态下移动、旋转、缩放控制模型
unity3d
lin zaixi()1 个月前
手把手教你写Unity3D飞机大战(2)天空盒布置
unity3d
Thomas_YXQ2 个月前
Unity3D中管理Shader效果详解
开发语言·游戏·unity·unity3d·游戏开发
羊羊20352 个月前
线性代数:Matrix2x2和Matrix3x3
线性代数·数学建模·unity3d
天人合一peng2 个月前
Unity hub登录时一直无法进入license
unity3d