Unity基础:欧拉角、四元数

作者: Ojors | 来源:发表于2016-08-12 00:12 被阅读382次

在游戏开发中,经常会接触到旋转,常用的旋转方式有使用矩阵旋转,使用欧拉角旋转和使用四元数旋转。在本篇中,主要研究欧拉角和四元数。

欧拉角

在Unity的Transform中,Rotation属性对应的就是欧拉角,一共分为3个轴,x、y和z,而每一个数值对应的是绕对应的轴旋转的度数。

Transfrom属性

如上图所示,表示按照坐标顺序旋转,X轴旋转30°,Y轴旋转90°,Z轴旋转10°。

但欧拉角会出现一个问题:万向锁
什么是万向锁?这个不好解释,感觉只有真正遇到过的才会有所体会,有兴趣的可以搜下万向锁的相关视频感受下。

四元数

为什么要使用四元数?

原因有很多,下面是其中的两个我觉得比较重要的原因:

  • 在效率上,四元数是比矩阵变换要高效的,想想矩阵变换的乘法量,按3X3的来算,进行一个点的变换要进行3X3X3=27次乘法,而四元数可以把乘法次数降低到16次。
  • 而欧拉角刚说了会产生万向锁的情况。

四元数比较复杂,是一个高级复数,跟二维复数能表示平面上的一个点类似,四元数表示的是思维空间上的一个点,由于是一个四维空间(所以不好想象),表示方式为:
![][1]
[1]:http://latex.codecogs.com/png.latex?x=a+bi+cj+dk
其中:
![][2]
[2]:http://latex.codecogs.com/png.latex?i2=j2=k^2=-1

对一个点 p 的转换公式为,p'为转换后的点(至于具体的解释,可以参考 candycat 前辈的这篇博客):
![][3]
[3]:http://latex.codecogs.com/png.latex?p'=qpq^{-1}

在四元数中,点 p 的四元数表示方式为
![][5]
[5]:http://latex.codecogs.com/png.latex?p=((x,y,z),0)
其中x,y,z为对应坐标,w量为0方便计算(其他数值也可以,不过转换后结果不会有影响,我们只关注坐标量x,y,z)。

而旋转点所需的四元数 q 的表示方式为:
![][4]
[4]:http://latex.codecogs.com/png.latex?q=(cos\frac{\theta}{2},(x,y,z)sin\frac{\theta}{2})
其中 theta 为旋转的角度,x,y,z为旋转轴。

参考资料后,我的几何理解是:一个点p要绕一个轴旋转,如果用四元数进行变换,则要通过一个辅助轴a,轴a是原点与旋转过程中的中间点构成的向量,通过两次的四元数变换把点p变换到最终点p’(四维的量,不能单纯地把xsin(theta/2),ysin(theta/2),zsin(theta/2)理解为欧拉角的x,y,z量)。

图示

当然,四元数是可以通过欧拉角进行构建的:

Quaternion.Euler(0, 30, 0);  //通过欧拉角(0,30,0)构建

通过轴-角构建:

Quaternion.AngleAxis(30, Vector3.up);   //通过轴Vector3.up,30°角构建

当然还有其他方式,需要大家自行查询官方文档。

相关文章

  • Unity基础:欧拉角、四元数

    在游戏开发中,经常会接触到旋转,常用的旋转方式有使用矩阵旋转,使用欧拉角旋转和使用四元数旋转。在本篇中,主要研究欧...

  • 学习笔记2

    欧拉角和四元数 笔记主要摘自下列博文和回答中 如何通俗地解释欧拉角?之后为何要引入四元数? - 知乎 【Unity...

  • 学习笔记3

    Unity中的欧拉角和四元数 笔记主要参考以下的博文 Unity中的欧拉旋转 - Andrew的游戏世界 - CS...

  • Unity基础(17)-四元数与欧拉角与矩阵

    Unity中表示旋转有三种方式:四元数,欧拉角,矩阵 一、四元数 1、概念 Quaternion中存放了x,y,z...

  • Unity-万向节死锁(Gimbal Lock)问题总结

    一、欧拉角 1.1 欧拉角定义 Unity API中对Transform.eulerAngles的定义是,本身是V...

  • 翻译-在Unity3D中的旋转和方向

    概述 在3D软件中旋转通常用四元数或者欧拉角来表示,各有优缺点。Unity内部存储使用四元数,但是为了方便我们编辑...

  • Unity开发-3D数学基础

    Unity中表示旋转有三种方式:矩阵,欧拉角,四元数。 就以我几年的开发经验来说:平常使用都是封装好的API,所以...

  • unity-欧拉角

    欧拉角,就是使用三个角度来保存方位(Heading/Pitch/Roll)。不过,X和Z轴是沿着自身坐标系旋转的,...

  • 机器臂matlab篇

    1.Matlab ——旋转矩阵,四元数,欧拉角之间的转换 matlab练习程序(旋转矩阵、欧拉角、四元数互转) 2...

  • iOS SceneKit欧拉角转四元数

    使用欧拉角 使用欧拉角会造成万向锁,转成四元数就没有问题了

网友评论

    本文标题:Unity基础:欧拉角、四元数

    本文链接:https://www.haomeiwen.com/subject/bpljsttx.html