概要 在3D应用旋转通常是两种方式中的一种代表,四元数与欧拉角。每个人都有自己的用途和缺点。Unity使用四元数内,但显示等效的欧拉角的值在督察让您轻松编辑。 欧拉角和四元数之间的差异欧拉角有一个简单的欧拉角表示,即三角值为X,Y和Z,应用顺序。应用欧拉旋转到一个特定的对象,每个旋转值依次应用,在相应的轴旋转。 - 利益:欧拉角有人直观的“可读”的格式,由三角。
- 利益:欧拉角可以代表通过转动超过180度从一个方向到另一个旋转
- 限制患:欧拉角万向节锁。当应用三旋转,反过来,将导致第三轴指向同一个方向上的轴作为第一或第二旋转是可能的。这意味着“自由度”已经失去了,因为第三的旋转值不能被应用在一个独特的轴。
四元数Quaternions can be used to represent the orientation or rotation of an object. This representation internally consists of four numbers (referenced in Unity as x, y, z & w) however these numbers don’t represent angles or axes and you never normally need to access them directly. Unless you are particularly interested in delving into the 数学班, you only really need to know that a Quaternion represents a rotation in 3D space and you will never normally need to know or modify the x, y & z properties. 在一个向量可以表示一个位置或方向相同的方式(这里的方向是从原点测量),一个四元数可以表示一个方向或旋转,旋转是由旋转的“起源”或“测量身份“。因为它的旋转是以这种方式测量从一个方向到另一个,一个四元数不能代表一个旋转超过180度。 - 利益:四旋转不遭受万向节锁。
- 限制:一个数不能代表一个旋转超过180度的任何方向。
- 限制:一个四元数的数字表示不直观易懂。
在统一所有游戏物体旋转的内部存储为四元数,因为利益大于限制。 在变换督察然而,我们显示使用欧拉角的旋转,因为这是比较容易理解和编辑。新的价值观进入一个游戏物体的旋转检查员转换“引擎盖下”为对象的一个新的四元数旋转值。
一个游戏物体的旋转显示和编辑为欧拉角的督察,但内部存储为一个四元数作为一个副作用,它在检查输入值是可能的,说,X:0,0,:365,Z:一个游戏对象的旋转。这是一个价值不可能代表一个数,所以当你打起你会看到旋转对象的值的变化X:0,0,:5,Z:(左右)。这是因为旋转转化为四元数不具有“全旋转360度加5度”的概念,而只是被设置为相同的旋转的结果。 对脚本当处理脚本处理旋转,你应该使用的四类及其函数来创建和修改旋转值。在某些情况下,它是有效利用欧拉角,但你应该记住: -你应该使用的四类函数处理欧拉角 检索,修改和重新应用欧拉值从一个旋转可导致意外。 创建和操作数直接统一的四类有很多功能,允许你创建和操纵的旋转而不需要在所有使用欧拉角。例如: 创建: - quaternion.lookrotation
- quaternion.angleaxis
- quaternion.fromtorotation
manipulating: - 四元插值。
- 逆元。
- quaternion.rotatetowards
- 旋转变换。 & transform.rotatearound
然而有时需要在脚本中使用欧拉角。在这种情况下,重要的是要注意,你必须保持你的角度变量,只有使用他们申请他们为欧拉角你旋转。而检索欧拉角是可能的从一个四元数,如果你检索、修改和重新申请,会出现问题。 这里是一些例子错误通常采用试图绕X轴的物体以每秒10度的旋转一个假设的例子。这是你应该避免: - <font size="4" face="楷体, 楷体_GB2312" color="#0000ff // rotation scripting mistake #1
- // the mistake here is that we are modifying the x value of a quaternion
- // this value does not represent an angle, and will not produce desired results
-
- void Update () {
-
- var rot = transform.rotation;
- rot.x += Time.deltaTime * 10;
- transform.rotation = rot;
-
- }
- // rotation scripting mistake #2
- // the mistake here is that we are reading, modifying then writing the Euler
- // values from a quaternion. Because these values calculated from a Quaternion,
- // each new rotation may return very different Euler angles, which may suffer from gimbal lock.
-
- void Update () {
-
- var angles = transform.rotation.eulerAngles;
- angles.x += Time.deltaTime * 10;
- transform.rotation = Quaternion.Euler(angles);
- }</font>
复制代码
这里是在脚本中使用欧拉角为例正确地: - <font size="4" face="楷体, 楷体_GB2312" color="#0000ff // rotation scripting with Euler angles correctly.
- // here we store our Euler angle in a class variable, and only use it to
- // apply it as a Euler angle, but we never rely on reading the Euler back.
-
- float x;
- void Update () {
-
- x += Time.deltaTime * 10;
- transform.rotation = Quaternion.Euler(x,0,0);
- }</font>
复制代码
对动画的含义许多三维制作软件包,而且统一的内部动画窗口,允许你使用欧拉角旋转过程中指定一个动画。 这些旋转值常常超过范围的可表达性四元数。例如,如果一个对象可以旋转720度的地方,这可以通过欧拉角X代表:0,Y 720,Z 0。但这不是由一个四元数值表示。 Unity的动画窗口统一的动画窗口内,有选项,允许您指定如何转动应使用四元数和欧拉插值插值。通过指定欧拉插值你告诉统一要由指定的运动的全方位角。用四元数旋转而你说你只想要旋转结束在一个特定的方向,统一使用四元插值和旋转在短距离到那里。看到利用动画曲线关于这方面的更多信息。 外部动画源进口从外部来源的动画时,这些文件通常包含在欧拉格式的动画旋转关键帧。统一的默认行为是重采样这些动画生成的一种新的四元每帧动画关键帧,以避免任何情况下关键帧之间的旋转可能会超过四元数的有效范围。 例如,想象两关键帧,6帧外,值为X 0在第二帧的第一帧和270。没有重采样,这两个关键帧之间的四元插值会旋转90度,在相反的方向,因为那是从第一方向的第二方向的捷径。然而通过重采样和添加的每一帧,一帧,现在只有45度旋转关键帧之间,将正常工作。 还有一些情况下,甚至与重采样-进口动画的四元数表示可能不符合原来的不够紧密,因此,在统一的5.3起有选择关闭动画重采样,这样就可以在运行时使用原始动画关键帧,而欧拉。有关更多信息,参见动画曲线的进口欧拉旋转。
|