在Unity中,角度与旋转是一个比较复杂的事情,其实现方式也是有很多,但是使用的规则是比较复杂的,所以需要选择对应的方式来实现需要的效果

一、Unity角度的表示方式

在Unity中表示角度的方式主要有两种,四元数与欧拉角,两者的表示方式有很大的不同,需要深刻理解两者,才能更好的应用:

四元数(Quaternion):

  • 四元数可用于表示GameObject的方向或旋转。该表示法内部包含四个数字(在Unity中称为x,y,z和w),但是这些数字并不表示角度或轴,因此通常不需要直接访问它们。除非您对四元数的数学特别感兴趣,否则您只真正需要知道四元数表示3D空间中的旋转,并且通常不需要知道或修改x,y和z属性

欧拉角(EulerAngles):

  • 欧拉角相对于四元数更加直观,可以直接看到旋转的角度,欧拉角的取值范围在0到360度,我们通常对于具体的角度的旋转使用欧拉加是简单方便的一种方式。

二、检查器(Inspector)面板Rotation

在我们创建一个3D物体时,Transfrom组件上就会有Rotation这个属性,Untiy官方手册解释为围绕X、Y或者Z轴进行的旋转,当我们在Sence面板对物体进行旋转,同样就会在Transform组件在看到数字的变化。反之,我们在面板调整数字,同样Sence窗口物体也会做出旋转。

但是当我们在脚本调用Rotation并输出,Debug输出发现与Tansform组件中显示的数字并不相同,而是一个四元数,并且每个数字都是从-1到1,这是为什么呢。其实Rotation并不是和检查面板显示的那样,Rotation是一个四元数,而其数值的正负值往往代表的是旋转方向,而其数值大小0到1则对应0到180度的对应:

所以说,与其说在Transform面板Rotation是一个四元数,不如将其理解为欧拉角,这样便于直观的使用角度。

三、持续旋转

Rotate

持续旋转是比较常用的旋转方式,不注重旋转角度,更注重旋转的速度,比如车轮旋转、摩天轮旋转等等,这样的可以使用transform.Rotate()来完成。而Rotate()就相当于获取一个旋转速度

使用方式:
public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);

  • eulers:旋转角度的三维数

Rotate:

  • 使用Transform.Rotate以多种方式旋转GameObject。旋转通常以欧拉角而不是四元数提供
  • Rotate将Vector3参数作为欧拉角。第二个参数是旋转轴,可以将其设置为局部轴(Space.Self)或全局轴(Space.World)。旋转是欧拉量

具体使用方法的几种案例:

         //1,相对于世界坐标transform.Rotate(Vector3.left, Space.World);//2,相对于局部坐标,也就是自身坐标transform.Rotate(Vector3.forward, Space.Self);//3,基本用法float speed = 1f;Vector3 v3 = new Vector3(10, 10,10);transform.Rotate(v3*speed*Time.deltaTime);

四,角度转换到目标角度

eulerAngles:

Transform.eulerAngles表示世界空间中的旋转。在检查器中查看GameObject的旋转时,您可能会看到与此属性中存储的角度值不同的角度值。这是因为Inspector显示本地旋转,可以使用Transform.localEulerAngles来查看本地的角度显示。

关于Transform.eulerAngles

  • 最需要注意的一点是欧拉角的读取数值是介于0到360度的,所以无论读写,可能数值与Transform面板数值不同,同时,最重要的一点,由于这种特性,对其数值的累加可能出错

虽然累加可能出错,尽量不要尝试使用eulerAngles来实现旋转,但是也是可以通过累加来实现对于物体的旋转控制的,虽然累加之后并不是按照数值的递增,但是最终呈现的实物效果还是在旋转状态的:

private Vector3 v3;private void Start(){v3 = new Vector3(0, 0, 0);}// Update is called once per framevoid Update(){v3 += new Vector3(0, 1, 0);transform.eulerAngles = v3;Debug.Log(transform.eulerAngles);

测试结果为:

虽然其数值与Inspector面板不同,使用起来也比较麻烦,但是相对起来它是求物体转换到固定角度的最佳方法了,只是转换时要对数值敏感,选择合适的数值才能起到好的效果。

Quaternion:

Unity提供了将欧拉角转换为四元数的方法,可以使用Quaternion.Lerp()方法来完成,这是一种插值旋转方法,所以旋转速度会越来越慢,适合模拟减速效果:


transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, 90), 0.05f);

Quaternion方法:

  • Quaternion.RotateTowards():插值旋转至与目标角度相同
  • Quaternion.LookRotation():插值旋转看向目标

可以通过上面两种方法完成看向目标,或与目标角度一致,具体用法可以为:

        //与target保持一样的角度transform.rotation = Quaternion.RotateTowards(transform.rotation,target.rotation,2f);//看向目标transform.rotation = Quaternion.LookRotation(target.position);

五、总结

关于角度是Unity中比较难理解的知识,需要对于几种方法有所区分,并选择合适的来应用,虽然有些功能另外的方法也可以使用,但是用起来会很复杂且难以扩展,有一定局限,所以应用前应该做好选择

Unity 角度与旋转(四元数与欧拉角)相关推荐

  1. Unity手游之路四3d旋转-四元数,欧拉角和变幻矩阵

    http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...

  2. eigen 编译_头条 | 使用eigen实现四元数、欧拉角、旋转矩阵、旋转向量间的转换...

    点击上方蓝字,关注本公众号,获得更多资源上一篇文章介绍了四元数.欧拉角.旋转矩阵.轴角如何相互转换,本篇文章介绍如何用eigen来实现. 旋转向量 1,初始化旋转向量:旋转角为alpha,旋转轴为(x ...

  3. 第3讲 旋转向量、欧拉角、四元数

    旋转向量 从上一篇中已经知道,旋转可以用旋转矩阵来表示,变换可以用变换矩阵来表示,那么为什么还需要旋转向量呢? 仔细想一下,矩阵表示方式至少有以下几个缺点: 的旋转矩阵有9个量,但是一次旋转只有3个自 ...

  4. 刚体运动中的坐标变换-旋转矩阵、旋转向量、欧拉角及四元数

    坐标变换及其方法 1.转化关系图 2 换算关系 3.1 旋转矩阵换算至其他 3.2 四元数换算至其他 3.3 旋转向量转换至旋转矩阵与四元数 3.3 欧拉角转换到旋转矩阵和四元数 3 坐标变换 4 坐 ...

  5. 刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

    最近学习了一些关于三维空间旋转相关的知识,借此梳理一下备忘. 三维空间的旋转(3D Rotation)是一个很神奇的东东:如果对某个刚体在三维空间进行任意次的旋转,只要旋转中心保持不变,无论多少次的旋 ...

  6. Unity踩坑-多级四元数旋转(多级骨骼)

    Unity踩坑-多级四元数旋转(多级骨骼) 前言 当单个物体变为多级物体... 启发 旋转更正 == 仅供学习.笔记之用 ,如有错误望指正== 前言 上文讲了单个物体利用四元数进行局部或本地的旋转.如 ...

  7. 关于使用旋转四元数绕轴旋转θ角度时,使用参数是θ/2的理解

    3D点A=(Xa,Ya,Za)绕轴N=(Nx,Ny,Nz)旋转θ角度.将点A扩展到四元数空间,则A=(0,Xa,Ya,Za),此时A点纯四元数(即第一位W分量等于0),处于四维空间中的一个超三维平面上 ...

  8. 【飞控理论】【惯性导航基础】二维平面的旋转如何用代数表示?三维平面的旋转如何用代数表示?什么是四元数?四元数、欧拉角、方向余弦之间有什么关系?

    上一篇欧拉角 由于欧拉角在描述三维空间物体旋转问题时存在万向节死锁问题(详情戳这里),所以引入四元数概念. 目录 1.二维平面的旋转 2.三维平面的旋转(什么是四元数) 3.<捷联惯性导航> ...

  9. 【Unity3D 灵巧小知识点】☀️ | Unity 四元数、欧拉角 与 方向向量 之间转换

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  10. unity中的四元数,欧拉角,方向向量之间的相互转换方法。

    四元数: 到欧拉角:quaternion.eulerAngles 到方向向量:(quaternion * Vector3.forward).normalized 欧拉角: 到四元数:Quaternio ...

最新文章

  1. error: RPC failed; curl 18 transfer closed with outstanding read
  2. n!的位数的快速确定(斯特林公式)
  3. Linux网络子系统
  4. maven多模块项目部署到服务器,GitHub - baxias/foweb: 一个基于 Spring+SpringMVC+Mybatis 的Maven多模块项目。(实现前后端分离的服务器端)...
  5. 更自由的阿里云API工具JCLI
  6. Jquery第二篇【选择器、DOM相关API、事件API】
  7. 用python画漂亮图-大部分人都不知道-Python竟能画这么漂亮的花,帅呆了
  8. IO编程——文件复制操作
  9. word给图片插入题注并在文中交叉使用
  10. android虚线边框_Android自定义View之绘制虚线
  11. 使用国内镜像安装pyqt5
  12. intellij IDEA 中,.properties文件unicode转中文
  13. html网页组织结构,使用HTML和CSS编码创建组织结构图
  14. su PK sudo
  15. 电脑硬件:cpu后边数字及字母的意思
  16. 【CocosBuilder 开发系列之一】cocos2dx使用CocosBuilder完成骨骼动画
  17. 云计算与虚拟化技术详解
  18. bed vcf 文件 GRCH37转 GRCH38 hg19 转hg38
  19. windows 使用cmd命令调用pesq.exe测量噪声语音及增强语音MOS评分
  20. 融云通信云发力教育行业 助在线教育风口继续腾云

热门文章

  1. 光盘安装服务器找不到硬盘,安装系统找不到硬盘怎么办实测解决
  2. tpadmin的坑收集 nginx下配置tp5失败
  3. tpadmin隐藏index.php,百度云服务器tp5框架布署,隐藏路径中的index.php
  4. aspx repeate控件多级关联
  5. 串联和并联拓扑PI控制器
  6. 字节跳动Java大数据工程师面试题、笔试题(含答案)
  7. [Ansys Workbench] 平面对称斜拉桥的模态分析
  8. Unity分屏之使用TUIO实现互动投影
  9. 操作系统实验一实验报告
  10. 图像的数字化(以某化探异常图为例——地球物理)