Unity 角度与旋转(四元数与欧拉角)
在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 角度与旋转(四元数与欧拉角)相关推荐
- Unity手游之路四3d旋转-四元数,欧拉角和变幻矩阵
http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...
- eigen 编译_头条 | 使用eigen实现四元数、欧拉角、旋转矩阵、旋转向量间的转换...
点击上方蓝字,关注本公众号,获得更多资源上一篇文章介绍了四元数.欧拉角.旋转矩阵.轴角如何相互转换,本篇文章介绍如何用eigen来实现. 旋转向量 1,初始化旋转向量:旋转角为alpha,旋转轴为(x ...
- 第3讲 旋转向量、欧拉角、四元数
旋转向量 从上一篇中已经知道,旋转可以用旋转矩阵来表示,变换可以用变换矩阵来表示,那么为什么还需要旋转向量呢? 仔细想一下,矩阵表示方式至少有以下几个缺点: 的旋转矩阵有9个量,但是一次旋转只有3个自 ...
- 刚体运动中的坐标变换-旋转矩阵、旋转向量、欧拉角及四元数
坐标变换及其方法 1.转化关系图 2 换算关系 3.1 旋转矩阵换算至其他 3.2 四元数换算至其他 3.3 旋转向量转换至旋转矩阵与四元数 3.3 欧拉角转换到旋转矩阵和四元数 3 坐标变换 4 坐 ...
- 刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)
最近学习了一些关于三维空间旋转相关的知识,借此梳理一下备忘. 三维空间的旋转(3D Rotation)是一个很神奇的东东:如果对某个刚体在三维空间进行任意次的旋转,只要旋转中心保持不变,无论多少次的旋 ...
- Unity踩坑-多级四元数旋转(多级骨骼)
Unity踩坑-多级四元数旋转(多级骨骼) 前言 当单个物体变为多级物体... 启发 旋转更正 == 仅供学习.笔记之用 ,如有错误望指正== 前言 上文讲了单个物体利用四元数进行局部或本地的旋转.如 ...
- 关于使用旋转四元数绕轴旋转θ角度时,使用参数是θ/2的理解
3D点A=(Xa,Ya,Za)绕轴N=(Nx,Ny,Nz)旋转θ角度.将点A扩展到四元数空间,则A=(0,Xa,Ya,Za),此时A点纯四元数(即第一位W分量等于0),处于四维空间中的一个超三维平面上 ...
- 【飞控理论】【惯性导航基础】二维平面的旋转如何用代数表示?三维平面的旋转如何用代数表示?什么是四元数?四元数、欧拉角、方向余弦之间有什么关系?
上一篇欧拉角 由于欧拉角在描述三维空间物体旋转问题时存在万向节死锁问题(详情戳这里),所以引入四元数概念. 目录 1.二维平面的旋转 2.三维平面的旋转(什么是四元数) 3.<捷联惯性导航> ...
- 【Unity3D 灵巧小知识点】☀️ | Unity 四元数、欧拉角 与 方向向量 之间转换
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...
- unity中的四元数,欧拉角,方向向量之间的相互转换方法。
四元数: 到欧拉角:quaternion.eulerAngles 到方向向量:(quaternion * Vector3.forward).normalized 欧拉角: 到四元数:Quaternio ...
最新文章
- error: RPC failed; curl 18 transfer closed with outstanding read
- n!的位数的快速确定(斯特林公式)
- Linux网络子系统
- maven多模块项目部署到服务器,GitHub - baxias/foweb: 一个基于 Spring+SpringMVC+Mybatis 的Maven多模块项目。(实现前后端分离的服务器端)...
- 更自由的阿里云API工具JCLI
- Jquery第二篇【选择器、DOM相关API、事件API】
- 用python画漂亮图-大部分人都不知道-Python竟能画这么漂亮的花,帅呆了
- IO编程——文件复制操作
- word给图片插入题注并在文中交叉使用
- android虚线边框_Android自定义View之绘制虚线
- 使用国内镜像安装pyqt5
- intellij IDEA 中,.properties文件unicode转中文
- html网页组织结构,使用HTML和CSS编码创建组织结构图
- su PK sudo
- 电脑硬件:cpu后边数字及字母的意思
- 【CocosBuilder 开发系列之一】cocos2dx使用CocosBuilder完成骨骼动画
- 云计算与虚拟化技术详解
- bed vcf 文件 GRCH37转 GRCH38 hg19 转hg38
- windows 使用cmd命令调用pesq.exe测量噪声语音及增强语音MOS评分
- 融云通信云发力教育行业 助在线教育风口继续腾云