前言

本文梳理了Unity中常用的旋转方法,涉及两大类:Transform、Quaternion。

Transform 类

Rotate()

此方法重载多,易理解,在连续动态旋转中较为常用。

  1. /*
  2. objsTrans[]为多物体的Transform组件,下标从1开始
  3. direction为(0,0,36)、Speed为1;
  4. 初始时,1、2、4物体的rotation=(0,0,0),3、5、6物体的rotation=(180,0,0),其余均为默认值
  5. */
  6. // Rotate(Vector3 eulerAngles):以欧拉角旋转
  7. objsTrans[1].Rotate(direction * Speed * Time.fixedDeltaTime);
  8. // Rotate(Vector3 axis, float angle):绕axis轴,旋转angle度
  9. objsTrans[2].Rotate(Vector3.forward, 36 * Speed * Time.fixedDeltaTime);
  10. // Rotate(Vector3 eulerAngles, Space relativeTo):以欧拉角旋转,但参照的是本地坐标系
  11. objsTrans[3].Rotate(direction * Speed * Time.fixedDeltaTime, Space.Self);
  12. // Rotate(float xAngle, float yAngle, float zAngle):绕各轴旋转 X angle度
  13. objsTrans[4].Rotate(0, 0, 36 * Speed * Time.fixedDeltaTime);
  14. // Rotate(Vector3 axis, float angle, Space relativeTo):绕axis轴,旋转angle度,但参照的是本地坐标系
  15. objsTrans[5].Rotate(Vector3.forward, 36 * Speed * Time.fixedDeltaTime, Space.Self);
  16. // Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo):绕各轴旋转 X angle度,但参照的是本地坐标
  17. objsTrans[6].Rotate(0, 0, 36 * Speed * Time.fixedDeltaTime, Space.Self);

RotateAround()

  1. // RotateAround(Vector3 point, Vector3 axis, float angle):绕穿过世界坐标中的 point 的 axis 旋转 angle 度
  2. objsTrans[1].RotateAround(Vector3.zero, Vector3.forward, 36 * Speed * Time.fixedDeltaTime);

eulerAngles

以欧拉角表示的旋转(以度为单位),是一个 Vector3类型的属性

  1. // 设定物体的欧拉角(本质为四元数)为 (0,0,90)
  2. objsTrans[1].eulerAngles = new Vector3(0, 0, 90);

LookAt()

这是比较常用的一个旋转类的函数,比如敌人、场景的AI等。其功能是 旋转物体、使其z轴始终指向目标物体。target、worldPosition参数为目标物体信息,worldUp参数较为特殊,涉及旋转时自身坐标系与世界坐标系的约束问题(见下图对比)。

  1. LookAt(Transform target);
  2. LookAt(Vector3 worldPosition);
  3. LookAt(Transform target, Vector3 worldUp = Vector3.up);
  4. LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);

Quaternion 类

四元数用于表示旋转,所有的 rotation都为Quaternion类型,没有Vector3类型的 eulerAngles 直观,但其不受万向锁影响,可以轻松插值运算。

eulerAngles

四元数的欧拉角形式,原有的转换为欧拉角的方法如ToEuler()、ToEulerAngle()已被弃用。。

  1. Quaternion quaternion = new Quaternion { eulerAngles = new Vector3(0, 0, 90) };
  2. objsTrans[1].rotation = quaternion; // 直接设定物体的rotation(即四元数)为 (0,0,90)

AngleAxis

用法非常类似上述对rotation赋值,其本质是 函数创建并返回一个四元数,进行赋值

  1. //Quaternion AngleAxis(float angle, Vector3 axis):绕 axis轴,旋转 angle 度
  2. objsTrans[1].rotation = Quaternion.AngleAxis(90, Vector3.forward);

SetLookRotation()

功能类似Transform.LookAt(),但注意,此处View参数不是目标物体的坐标,而应是两者的矢量差(当前物体指向目标物体的矢量)。up含义同上文所提的worldUp。

  1. // SetLookRotation(Vector3 view);
  2. // SetLookRotation(Vector3 view, Vector3 up= Vector3.up);
  3. Quaternion quaternion = Quaternion.identity;
  4. quaternion.SetLookRotation(objsTrans[2].position-objsTrans[1].position);
  5. objsTrans[1].rotation = quaternion; //使物体1看向物体2

LookRotation()

用法及含义同SetLookRotation()

  1. // LookRotation (Vector3 forward, Vector3 upwards= Vector3.up);
  2. Quaternion quaternion = Quaternion.LookRotation((objsTrans[2].position - objsTrans[1].position), Vector3.up);
  3. objsTrans[1].rotation = quaternion;

SetFromRotation()

直观理解:存在物体123,物体1以自身为中心,由12的向量旋转为13的向量;就像三物体处于扇形的三个端点,物体1旋转的度数为该扇形的圆心角。注意区别于LookAt()LookAt()方法是z轴始终指向目标物体,而该方法是12、13物体间的虚拟连线的方向变更,不涉及z轴朝向谁。

  1. // SetFromToRotation (Vector3 fromDirection, Vector3 toDirection):创建一个从 fromDirection 旋转到 toDirection 的旋转
  2. Quaternion quaternion = new Quaternion();
  3. quaternion.SetFromToRotation(objsTrans[2].position, objsTrans[3].position); //设定初始和最终朝向坐标
  4. objsTrans[1].rotation = quaternion;

Slerp()

直观理解:物体1从物体2的rotation、进行插值旋转变为物体3的rotation。

  1. // Quaternion Slerp(Quaternion a, Quaternion b, float t):在 a 和 b 之间以球形方式插入 t。参数 t 被限制在 [0, 1] 范围内
  2. objsTrans[1].rotation = Quaternion.Slerp(objsTrans[2].rotation, objsTrans[3].rotation, Time.time);

参考

Unity - 旋转方法的更多相关文章

  1. android--屏幕旋转方法总结

    在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制: 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate ...

  2. iOS 图片旋转方法

    iOS 图片旋转方法 通过 CGImage 或 CIImage 旋转特定角度 UIImage可通过CGImage或CIImage初始化,初始化方法分别为init(cgImage: CGImage, s ...

  3. C#开发Unity游戏教程之Unity中方法的参数

    C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...

  4. 平衡二叉树AVL - 插入节点后旋转方法分析

    平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 首先我们知道,当插入一个节点,从此插入点到树根 ...

  5. unity 旋转两种方法

    transform.Rotate(new Vector3(0, 10, 10)*speed*Time.deltaTime); // 物体绕x轴.y轴.z轴旋转 transform.RotateArou ...

  6. Unity 自己旋转 方法

    transform.Rotate(Vector3.up * Time.deltaTime * 100);

  7. 扩展Unity的方法

    写更少代码的需求 当我们重复写一些繁杂的代码,或C#的一些方法,我们就想能不能有更便捷的方法呢?当然在unity中,我们对它进行扩展. 对unity的类或C#的类进行扩展有以下两点要注意: 1.这个类 ...

  8. Bitmap旋转方法

    最近在做一个ORC图片解析的功能,要求解析出数字 但是发现他解析只能解析横着的图片,然后我拍照的时候拍的是竖直照片,当然你也可以去旋转照相机的屏幕 但是我这里为了方便选择的是竖直拍出来 然后,旋转下咯 ...

  9. Unity关于方法事件生命周期官方文档

    http://docs.unity3d.com/Manual/ExecutionOrder.html 一.组件运行的基本顺序 下图中创建类的顺序为A,B,C,A1,二运行的结果为A1,B,C,A. 可 ...

随机推荐

  1. AspNetCore3.1_Secutiry源码解析_3_Authentication_Cookies

    系列文章目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心流程 AspNetCore3. ...

  2. SQL Server2008执行脚本

    "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\osql.exe" -E -i C:\Users\zhiheng\Des ...

  3. Spring Boot入门系列(九)如何实现异步执行任务

    前面介绍了Spring Boot 如何整合定时任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.htm ...

  4. 全国职业技能大赛信息安全管理与评估-一些细节tips

    Base64加解密: ubuntu@VM-0-5-ubuntu:~$ echo iloveyou | base64aWxvdmV5b3UKubuntu@VM-0-5-ubuntu:~$ echo aW ...

  5. Falling Squares

    2020-01-08 10:16:37 一.Falling squares 问题描述: 问题求解: 本题其实也是一条经典的区间问题,对于区间问题,往往可以使用map来进行区间的维护操作. class ...

  6. IO多路复用(IO Multiplexing)

    什么是IO多路复用 为什么要有IO多路复用 作者总结 遵循学习新知识的三部曲:是什么?为什么?怎么用? 作者前言:IO多路复用本质上是网络通信过程中的一个技术名词. 什么是IO多路复用 一个用机场管理 ...

  7. 多伦多大学&NVIDIA最新成果:图像标注速度提升10倍!

    图像标注速度提升10倍! 这是多伦多大学与英伟达联合公布的一项最新研究:Curve-GCN的应用结果. Curve-GCN是一种高效交互式图像标注方法,其性能优于Polygon-RNN++.在自动模式 ...

  8. Azure Web: 数据库的创建与数据监控

    介绍主题:Azure 大家都知道Azure云现在由于中国国策不一样,会有中国版Azure云和国际版Azure. 但是我们今天基于这个国际版的讲,因为我这个博客会比较international一点.(- ...

  9. DOM 操作成本到底高在哪儿?

    从我接触前端到现在,一直听到的一句话:操作DOM的成本很高,不要轻易去操作DOM.尤其是React.vue等MV*框架的出现,数据驱动视图的模式越发深入人心,jQuery时代提供的强大便利地操作DOM ...

  10. logstash用jdbc插件将数据库内容导入elasticsearch时间字段相差5小时

    logstash将mysql的数据导入elasticsearch之后发现时间字段的相差5个小时 解决办法: 在数据库连接配置后面加上?serverTimezone=UCT这个就OK了 logstash ...