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);
相关推荐
北桥苏18 小时前
如何在 Unity3D 导入 Spine 动画
unity3d
Thomas游戏开发2 天前
Unity3D状态管理器实现指南
前端框架·unity3d·游戏开发
土豆宝7 天前
Unity Visual Scripting(可视化脚本) 自定义节点 踩坑教程
unity3d
Thomas游戏开发8 天前
Unity3D光照层级与动态切换指南
前端框架·unity3d·游戏开发
Thomas游戏开发19 天前
Unity3D 崩溃分析工具的集成与优化
前端框架·unity3d·游戏开发
Thomas游戏开发23 天前
Unity3D网格简化与LOD技术详解
前端框架·unity3d·游戏开发
Thomas_YXQ24 天前
Unity3D 图形渲染(Graphics & Rendering)详解
开发语言·unity·图形渲染·unity3d·shader
Thomas游戏开发1 个月前
Unity3D 图形渲染(Graphics & Rendering)详解
前端·unity3d·游戏开发
Thomas游戏开发1 个月前
Unity3D 光栅化 vs 光线追踪:技术详解
前端框架·unity3d·游戏开发
Thomas游戏开发1 个月前
Unity3D 多线程与协程优化详解
前端框架·unity3d·游戏开发