Unity中的欧拉旋转766游戏网官网

欧拉角的概念

在写那篇博客之前,我找找了网上广大关于欧拉角的定义,发现半数以上引用自维基百科的概念,我那边也援引一下:

维基百科定义


莱昂哈德·欧拉用欧拉角来叙述刚体在三维欧几里得空间的方向。对于其他条件,一个刚体的势头,是根据顺序,从那标准,做几个欧拉角的转动而设定的。所以,刚体的来头可以用三个要旨旋转矩阵来控制。换句话说,任何有关刚体旋转的旋转矩阵是由两个着力旋转矩阵复合而成的。
对此在三维空间里的一个原则,任何坐标系的动向,都可以用多少个欧拉角来显示。参考系又称之为实验室参考系,是静止不动的。而坐标系则一定于刚体,随着刚体的团团转而旋转。参阅下图。设定xyz-轴为基准的参考轴。多个欧拉角:
(αβγ),绿色的轴是xyz-轴,青色的轴是XYZ-坐标轴。称xy-平面与XY-平面的交接为交点线(紫色),用英文字母(N)代表。
zxz顺规的欧拉角可以静态地那样定义:

  • α是x-轴与交点线的夹角,
  • β是z-轴与Z-轴的夹角,
  • γ是交点线与X-轴的夹角。
![](https://upload-images.jianshu.io/upload_images/4039616-bd098ea52ff432ef)

欧拉角

很可惜地,对于夹角的次第和标记,夹角的五个轴的指定,并从未此外正规。地理学家对此并未已毕共识。每当用到欧拉角时,我们必须明确的意味出夹角的一一,指定其参考轴。
实则,有无数艺术可以设定八个坐标系的相对方向。欧拉角方法只是内部的一种。别的,差其他小编会用差别组合的欧拉角来讲述,或用差其余名字表示一致的欧拉角。由此,使用欧拉角前,必须先做好醒目的概念。


顺规

766游戏网官网,在经典力学里,时常用zxz顺规来设定欧拉角;照着第四个转动轴的轴名,简称为x顺规。此外,还有别种欧拉角组。合法的欧拉角组中,唯一的界定是,任何八个再而三的旋转,必须绕着差距的转动轴旋转。因而,一共有12种顺规。例如,y顺规,第一个转动轴是y-轴,时常用在量子力学、核子物工学、粒子物法学。其余,还有一种顺规,xyz顺规,是用在航空航天工程学;参阅泰特-布莱恩角。


以上两部分均源于维基百科,我所以把顺规特殊挑选出去,是因为第一段定义中选取的顺规与Unity中运用的顺规是不等同的,即便不理顺那或多或少,很不难造成混淆,那会将那多少个学Unity而查看欧拉角、万向节死锁之类小说的人带向误区。

Unity中的定义

以下内容来自Unity文档中Transform.eulerAngles的概念,自身是一个Vector3,就是一个三维矢量,
个别包罗xyz五个参数。

The x, y, and z angles represent a rotation z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis (in that order).

Only use this variable to read and set the angles to absolute values. Don't increment them, as it will fail when the angle exceeds 360 degrees. Use Transform.Rotate instead.

意思就是说:

xyz代表了三个角度,它们定义了一组有序的旋转,即围绕z轴旋转z度,然后围绕x轴旋转x度,然后围绕y轴旋转y度。
你应该只去读取或者直接设置这些数值,不要增加它们,因为当角度超过360度将会失败。应该使用Transform.Rotate去替代执行旋转操作。

解释

鉴于Unity内部选拔四元数去执行旋转,不会储存欧拉角的总共值,因而它说超越360度会破产是足以通晓的,它用四元数执行完运算之后,会更新最终对应的欧拉角数值,而以此结果欧拉角只是代表了等值的转动变化结果,却无力回天代表中间经过,由于欧拉角旋转Z轴361度与1度有一样的结果,它便最终只存储了1度,以便于大家着眼和动用。

Unity中的顺规

越发注意的是,上述文档中验证了Unity使用zxy的顺规,那与维基百科定义是例外的,因而无法使用方面那张图纸中的旋转来通晓。那么大家品尝来打探一下,Unity中的欧拉旋转终究是怎么的。

欧拉旋转的小实验

此处,我利用Unity制作了一个小实验,可以指定在x+,x-,y+,y-,z+,z-那一个轴平昔旋转一个箭头,见下图。

766游戏网官网 1

Euler Lab

  • RotateXX按钮代表旋转指定的轴向XX
  • Applied Angles代表一起的欧拉旋转角
  • Result Angles代表Unity经过四元数计算之后输出的结果欧拉角
  • Slider控制旋转的速度
  • 左边居中的空白框用来显示待旋转的推行项,每趟使用RotateXX按钮都会时有爆发一个转悠待执行项。
  • Rest用来重置
  • Allow Excute代表是都同意实施当前的待执行项。
  • Once All代表是按顺序执行这个可进行项依然具备执行项联合实施。

红绿蓝(RGB)三色分别表示XYZ轴,靠近箭头的多少个轴是一些坐标轴,有圆球的一端代表轴的正向。远离箭头的内外左右内外断开的6个半截轴代表了社会风气坐标轴。轴的正向与一些坐标相同。这便是整整最开首的情形,物体的全局坐标和一部分坐标下的欧拉角都是(0,0,0),也就是没有任何旋转的情状。

那个小程序可以参见我的Github中的UnityLab/Euler页面https://andrewfanchina.github.io/UnityLabs/Euler/,自个儿尝尝一下就能够领悟这个按钮的效能,注意要求利用援救WebGL的浏览器打开,比如Chrome只怕Firefox(360极速浏览器8.7本子以上貌似也是永葆的)。文件较大,网速慢的稍等一小会儿。
亟待注意的是,我在写小程序的时候,刻意使用了丰裕总结的欧拉角(小程序中的Applied
Angles),也就是说,你所实施的历次旋转都被添加到一个Vector3中,最后被装置到箭头的脚下欧拉角,相当于箭头被复位之后,重新履行了新式的欧拉角累计值。举例来说,累加总计的欧拉角(90,90,90)所对应的结果都是一模一样的,无论你是比照什么顺序点击多个旋转按钮。这样,那几个小程序可以效仿从上马状态经历过当前计算的欧拉旋转。

欧拉旋转的旋转轴

前述平昔未曾显然的一个题材,就是大家在围绕哪一个轴举办旋转?在Unity的法定文档上也未尝说精晓这么些难点。
精确地说,Unity中老是执行欧拉旋转,都是应用“当前轴”。
譬如在Transform的文档中:


public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);

Description
Applies a rotation of eulerAngles.z degrees around the z axis,
eulerAngles.x degrees around the x axis, and eulerAngles.y degrees
around the y axis (in that order).
if relativeTo is left out or set to Space.Self the rotation is applied
around the transform’s local axes. (The x, y and z axes shown when
selecting the object inside the Scene View.) If relativeTo is
Space.World the rotation is applied around the world x, y, z axes.


那些函数提供了一个可选的冲突空间坐标系参数:

  • Space.Self
    局地坐标系,意味着这次欧拉旋转以物体当前的一部分坐标朝向为底蕴出发执行旋转。
  • Space.World
    世界坐标系,意味着这次欧拉旋转以物体当前的世界坐标朝向为底蕴出发执行旋转。
    最重点的倒不是它有可选的社会风气坐标系,一般而言,常用的旋转都是相对当前部分坐标系执行的。
    最要紧的是:在此次欧拉旋转进度中,它的相对轴是始终不变的,不变的,不变的…
    诸如大家得以指定一组欧拉旋转(90,60,30),通过前述的顺规大家领略,先绕Z轴旋转30度,再绕X轴旋转90度,再绕Y轴转动60度,就算有诸如此类的相继,但是Z旋转后相对X轴、Y轴,都是履行本组欧拉旋转前的不得了轴向,它从不暴发变更,所以本身称它为“当前轴”。在Unity中的欧拉旋转就是这么定义的,不解决其余学术中欧拉旋转有不同的概念情势。因而,执行:

Transform.Rotate(new Vector3(90,60,30))

和执行

Transform.Rotate(new Vector3(0,0,30));
Transform.Rotate(new Vector3(90,0,0));
Transform.Rotate(new Vector3(0,60,0));

的结果是不均等的。第一种景况,只进行了一组欧拉旋转,第两种情状,执行了三组欧拉旋转,后两组欧拉旋转的相对轴在转动时早已发生了改观。

运用小程序验证旋转轴

上边的小程序执行的一味只有一组欧拉旋转,它每一次累计欧拉角变化之后,都一定于从开始状态重新履行一起欧拉角的旋转。由此它很不难来表明相对的转动轴向。

假如大家设定一组欧拉旋转(90,90,90),其最后的旋转结果朝向如下图A。

766游戏网官网 2

(90,90,90)

那么,大家根据Unity定义的顺规,先实施Z轴旋转90度。

766游戏网官网 3

Z轴旋转90

它的旋转轴是开首的+z轴,轨迹记录了此次旋转划过的职分。接着是绕X轴旋转90度。

766游戏网官网 4

X轴旋转90

它的旋转轴也是始于的+X轴,接着是绕Y轴转动90度。

766游戏网官网 5

Y轴旋转90

它的旋转轴也是发端的+Y轴。最后大家赢得了(90,90,90)这一组欧拉旋转的末尾结果,与图A的结果同样。可以见见,它的确是顺着初叶的固定轴向在举办按Z、X、Y顺序的转动。

总结

最后,大家计算一下Unity中的欧拉旋转。它是顺着Z、X、Y顺规执行的转动,一组欧拉旋转进度中,相对的轴向不会暴发变化。Transform.Rotate(new
Vector3(90,60,30)),代表执行了一组欧拉旋转,它相对的是旋转前的有的坐标朝向。

好在那种顺规和轴向的概念,它导致了“万向节死锁”的当然形成。
且听下回分解…

发表评论

电子邮件地址不会被公开。 必填项已用*标注