【Unity编程】Unity中的欧拉旋转

版权声明:本文为博主原创文章,欢迎转载。请保留博主链接:http://blog.csdn.net/andrewfan

欧拉角之定义

在形容就首博客之前,我寻找了网上广大有关欧拉角之概念,发现多数引用自维基百科的定义,我此为引用一下:

维基百科定义


莱昂哈德·欧拉用欧拉角来讲述刚体在三维欧几里得空间的自由化。对于任何条件,一个刚体的趋势,是遵照顺序,从即极,做三独欧拉比的团团转而设定的。所以,刚体的动向可以据此三只主导盘矩阵来控制。换句话说,任何关于刚体旋转的转矩阵是由于三单着力盘矩阵复合而成为的。
对在三维空间里之一个规则,任何坐标系的取向,都可就此三个欧拉角来呈现。参考系又叫做实验室参考系,是静止不动的。而坐标系则一定给刚体,随着刚体的转而旋转。参阅下图。设定xyz-轴为极的参考轴。三单欧拉角:
(αβγ),蓝色之轴是xyz-轴,红色的轴是XYZ-坐标轴。称xy-平面与XY-平面的交为交点线(绿色),用英文字母(N)代表。
zxz顺规的欧拉角可以静态地这样定义:

  • α是x-轴与交点线的夹角,
  • β是z-轴与Z-轴的夹角,
  • γ是交点线与X-轴的夹角。
    766游戏网官网 1

怪惋惜地,对于混合角的次第及标志,夹角的蝇头独轴的指定,并从未其它正规。科学家对这个没有上共识。每当用到欧拉角时不时,我们不能不明确的象征来夹角的逐条,指定其参考轴。
实在,有好多方可以设定两个坐标系的相对方向。欧拉角道才是内的一律栽。此外,不同的作者会为此不同组合的欧拉角来讲述,或因故不同的讳表示无异的欧拉角。因此,使用欧拉角前,必须事先做好醒目的概念。


顺规

每当经典力学里,时常为此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游戏网官网 2

  • 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](http://www.google.cn/chrome/browser/desktop/index.html)或者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游戏网官网 3

那,我们随Unity定义之顺规,先实行Z轴旋转90过。

766游戏网官网 4

它们的旋轴是开的+z轴,轨迹记录了此次旋转划喽的岗位。接着是纠缠X轴旋转90渡过。

766游戏网官网 5

它的旋转轴也是开端的+X轴,接着是纠缠Y轴转动90过。

766游戏网官网 6

她的团团转轴也是初步的+Y轴。最终我们沾了(90,90,90)这同样组欧拉旋转的末尾结果,与图A的结果同样。可以看,它的确是顺着初始的固定轴向以进展按Z、X、Y顺序的旋转。

总结

末段,我们总一下Unity中的欧拉旋转。它是沿着Z、X、Y顺规执行之旋转,一组欧拉旋转过程中,相对的轴向不见面发生变化。Transform.Rotate(new
Vector3(90,60,30)),代表履行了一如既往组欧拉旋转,它相对的凡转前之一对坐标朝向。

幸亏这种顺规和轴向的概念,它导致了“万向节死锁”的自形成。
且听下回分解…

发表评论

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