http://blog.csdn.net/janeky/article/details/17272625

今天我们来谈谈关于Unity中的旋转。主要有三种方式。变换矩阵,四元数和欧拉角。

定义

  • 变换矩阵

可以执行任意的3d变换(平移,旋转,缩放,切边)并且透视变换使用齐次坐标。一般比较少用到。Unity中提供了一个Matrix4x4矩阵类

  • 四元数

“四元数是最简单的超复数。 复数是由实数加上元素 i 组成,其中i^2 = -1。 相似地,四元数都是由实数加上三个元素 i、j、k 组成,而且它们有如下的关系: i^2 = j^2 = k^2 = ijk = -1 , 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi + cj + dk,其中a、b、c 、d是实数”。这些概念很难懂吧。只要先记得Unity中的Quaternion有4个组件(x,y,z,w)

  • 欧拉角

“用来确定定点转动刚体位置的3个一组独立角参量,由章动角θ、旋进角(即进动角)ψ和自转角j组成”
在Unity中,Quaternion.eulerAngles 返回旋转的角度,绕z轴旋转euler.z角度,绕x轴旋转euler.x度,绕y轴旋转euler.y度

转换

  • 1.四元数到变换矩阵
  1. Quaternion q = Quaternion.LookRotation(new Vector3(0,0.5,1));
  2. Matrix4x4 rot = new Matrix4x4();
  3. rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));
  • 2.变换矩阵到四元数
  1. Matrix4x4 rot = new Matrix4x4();
  2. rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));
  3. Vector4 vy = rot.GetColumn(1);
  4. Vector4 vz = rot.GetColumn(2);
  5. Quaternion newQ = Quaternion.LookRotation(new Vector3(vz.x,vz.y,vz.z),new Vector3(vy.x,vy.y,vy.z));

常用的函数
function ToAngleAxis (out angle : float, out axis : Vector3) : void
绕axis轴旋转angle,创建一个旋转

static function Angle (a : Quaternion, b : Quaternion) : float
返回a和b两者之间的角度。

var eulerAngles : Vector3
返回表示旋转的欧拉角度。表示旋转的角度,绕z轴旋转euler.z度,绕x轴旋转euler.x度,绕y轴旋转euler.y度(这样的顺序)。

function SetFromToRotation (fromDirection : Vector3, toDirection : Vector3) : void
把物体的fromDirection旋转到toDirection

function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
建立一个旋转使z轴朝向view y轴朝向up

static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
从from 转换到to,移动距离为t

static function Lerp (a : Quaternion, b : Quaternion, t : float) : Quaternion
跟Slerp相似,且比Slerp快,.但是如果旋转角度相距很远则会看起来很差

比较

  • 变换矩阵

可以做各种复杂的变换,但是学习曲线比较大,使用的内存也比较多,因为存储的数据量比较大。

  • 欧拉角

简单理解,尤其是对美术和策划的同事。运算速度和消耗内存比较少。可能存在万向锁的问题(两个轴的旋转重合)

  • 四元数

避免了万向锁的问题。理解起来不是那么直接。
有任何问题欢迎一起探讨ken@iamcoding.com

Unity手游之路<四>3d旋转-四元数,欧拉角和变幻矩阵的更多相关文章

  1. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  2. Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发

    http://blog.csdn.net/janeky/article/details/17151465 开发一款网络游戏,首先要考虑的是客户端服务端之间用何种编码格式进行通信.之前我们介绍了Unit ...

  3. Unity手游之路<八>自动寻路Navmesh之入门

    http://blog.csdn.net/janeky/article/details/17457533 在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能会 ...

  4. Unity手游之路<十>自动寻路Navmesh之跳跃,攀爬,斜坡

    http://blog.csdn.net/janeky/article/details/17598113 在之前的几篇Blog总,我们已经系统学习了自动寻路插件Navmesh的相关概念和细节.然而,如 ...

  5. Unity手游之路<十三>手游代码更新策略探讨

    http://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了.最近在项目开发上线过程中 ...

  6. Unity手游之路<六>游戏摇杆之Easy Touch 3教程

    之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...

  7. Unity手游之路手游代码更新策略探讨

    版权声明: https://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙.加上家里事情也多,所以blog更新一直搁置了. 近期在项 ...

  8. Unity手游之路自动寻路Navmesh之入门

    http://blog.csdn.net/janeky/article/details/17457533 现在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能 ...

  9. Unity手游之路游戏摇杆之Easy Touch 3教程

    之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...

随机推荐

  1. sql 中的运算符级别 如and or not

    写了这么多简单的sql,很多东西忘记得差不多了,差点连最基本sql运算符优先级都忘了.平时最常用到and or的优先级都忘了 and的优先级高于or的优先级 举个例子 select * from us ...

  2. JavaScript排序算法——堆排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. python 多线程学习

    多线程(multithreaded,MT),是指从软件或者硬件上实现多个线程并发执行的技术 什么是进程? 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据.它们只有在被读取到内存中,被操作系 ...

  4. ReSharper 配置及用法(转)

    1:安装后,Resharper会用他自己的英文智能提示,替换掉 vs2010的智能提示,所以我们要换回到vs2010的智能提示 2:快捷键.是使用vs2010的快捷键还是使用 Resharper的快捷 ...

  5. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  6. UTF-8-BOM

    https://www.zhihu.com/question/20167122 知乎 「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个? http://b ...

  7. golang笔记——包

    1.包简述 GO本身没有项目的概念,只有包,包括可执行包和不可执行包,而不管什么包,都应该包含在 $GOPATH/src 目录下,GO命令和编译器会在 $GOPATH/src 目录下搜索相应的包.比如 ...

  8. 大熊君大话NodeJS之------Net模块

    一,开篇分析 从今天开始,我们来深入具体的模块学习,这篇文章是这个系列(大熊君大话NodeJS)文章的第三篇,前两篇主要是以理论为主,相信大家在前两篇的学习中, 对NodeJS也有一个基本的认识,没事 ...

  9. 深度剖析:如何实现一个 Virtual DOM 算法

    本文转载自:https://github.com/livoras/blog/issues/13 目录: 1 前言 2 对前端应用状态管理思考 3 Virtual DOM 算法 4 算法实现 4.1 步 ...

  10. 利用CSS实现带相同间隔地无缝滚动动画

    说明:因为在移动上主要利用CSS来做动画,所以没有考虑其他浏览器的兼容性,只有-webkit这个前缀,如果需要其他浏览器,请自行补齐. 首先解释一下什么是无缝滚动动画, 例如下面的例子 See the ...