3D 应用程序中的旋转通常以两种方式之一表示:四元数或欧拉角。每种方式都有自己的用途和缺点。Unity 在内部使用四元数表示,但在 Inspector 中显示等效的欧拉角值以便于进行编辑。
欧拉角由按顺序应用的 X、Y 和 Z 三个角度值来表示。要将欧拉旋转应用于特定游戏对象,则依次应用每个旋转值,作为围绕其对应轴的旋转。
四元数可用于表示游戏对象的方向或旋转。此表示方式在内部由四个数字组成(在 Unity 中称为 x、y、z 和 w),但是这些数字不代表角度或轴,您通常不需要直接访问它们。除非特别想深入研究四元数的数学原理,否则只需要知道四元数代表 3D 空间中的旋转即可,通常不需要知道或修改 x、y 和 z 属性。
与矢量可以表示位置或方向(从原点测量方向)的方式相同,四元数可以表示方向或旋转:从旋转“原点”或“Identity”测量旋转。由于旋转的这种测量方式(从一个方向到另一个方向),因此四元数不能表示超过 180 度的旋转。
Unity 在内部将所有游戏对象旋转存储为四元数,因为这种表示方式的好处超过了局限性。
Transform Inspector 会使用欧拉角显示旋转,因为这种形式更容易理解和编辑。Unity 将 Inspector 中输入的用于旋转游戏对象的新值转换为该游戏对象的新四元数旋转值。
此外还有一个副作用,在 Inspector 中可以输入游戏对象的旋转值,例如 X:0,Y:365,Z:0。但是,该值不能表示为四元数,所以进入运行模式时会看到该游戏对象的旋转值变为 X:0,Y:5,Z:0。这是因为 Unity 将旋转转换为四元数,而四元数没有“完整的 360 度旋转加 5 度”的概念,而是设置为与旋转结果相同的方向。
要了解有关使用 Quaternion 类编写脚本的更多信息,请参阅四元数用户手册页和四元数脚本参考
许多 3D 制作包以及 Unity 自己的内部 Animation 窗口均允许使用欧拉角来指定动画期间的旋转。
这些旋转值通常可能超过四元数可表示的范围。例如,如果一个游戏对象旋转 720 度,这可以用欧拉角“X:0,Y:720,Z:0”表示。但这不能通过四元数值来表示。
在 Unity 自己的动画窗口中,有一些选项允许指定如何进行旋转插值:使用四元数插值还是欧拉插值。通过指定欧拉插值,即告诉 Unity 您希望使用角度指定全范围运动。但是,使用四元数旋转,即表示仅希望旋转以特定方向结束,因此 Unity 会使用四元数插值并在最短距离内旋转到达该位置。请参阅使用动画曲线以了解与此有关的更多信息。
导入来自外部的动画时,这些文件通常包含欧拉格式的旋转关键帧动画。默认情况下,Unity 会重新采样这些动画,并为动画中的每个帧生成一个新的四元数关键帧,从而避免任何关键帧之间的旋转可能超过四元数的有效范围的情况。
例如,假设有两个关键帧,相隔 6 帧,X 的值在第一个关键帧上为 0,在第二个关键帧上为 270。如果不重新采样,这两个关键帧之间的四元数插值将在相反方向上旋转 90 度,因为这是从第一个方向到第二个方向的最短路径。但是,通过在每个帧上重新采样和添加关键帧,关键帧之间现在只有 45 度,因此旋转可以正常工作。
不过,仍然存在一些情况,即使使用重新采样,导入动画的四元数表示可能还是与原来不够匹配,因此,在 Unity 5.3 及更高版本中,可选择关闭动画重新采样,这样就可以在运行时改用原始的欧拉动画关键帧。想了解更多相关信息,请参阅欧拉曲线旋转的动画导入。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.