欧拉角增加超过360度

时间:2017-01-06 05:44:08

标签: c# unity3d

我对Unity关于Euler角度的一些文档感到有点困惑。我只是想知道我是否不理解差异,或者样本没有遵循最佳实践。文档here 规定:

  

仅使用此变量读取并将角度设置为绝对值。不要增加它们,因为当角度超过360度时它会失败。改为使用Transform.Rotate。

同时,代码示例似乎使用可能超过360度的增量:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public float yRotation = 5.0F;
    void Update() {
        yRotation += Input.GetAxis("Horizontal");
        transform.eulerAngles = new Vector3(10, yRotation, 0);
    }
    void Example() {
        print(transform.eulerAngles.x);
        print(transform.eulerAngles.y);
        print(transform.eulerAngles.z);
    }
}

如果变量超过360度,不会递增变量然后使用该变量设置值绝对仍会超过360度吗?

2 个答案:

答案 0 :(得分:2)

当您使用欧拉角旋转对象时,当它达到360并尝试进一步超越时,它变为(减)-360并逐渐从-359增加到-1。

执行以下代码后,您的值不会超过360,并保持正值。

float rotateAngle = rotateObject.transform.localEulerAngles.y;
// Convert negative angle to positive angle
rotateAngle = (rotateAngle > 180) ? rotateAngle - 360 : rotateAngle;
rotateObject.transform.localEulerAngles = new Vector3(rotateObject.transform.localEulerAngles.x, rotateAngle, rotateObject.transform.localEulerAngles.z);

答案 1 :(得分:1)

存在差异。在做的时候:

transform.eulerAngles.y += 1F;

您正在调用+=中的Vector3运算符。

但是,当您以这种方式设置eulerAngles时:

float newY = transform.eulerAngles.y + 1F;
transform.eulerAngles = new Vector3(.., newY, ..);

您正在Transform中调用一个setter,在此setter中,它可能包含更新Transform.rotation的操作。

不同之处在于Unity可以在Transform类而不是Vector3类中实现更新逻辑,这在那里更有意义。

我们可以在documentation

下面进一步验证
  

不要单独设置一个eulerAngles轴(例如,eulerAngles.x =   10; )因为这会导致漂移和不希望的旋转。什么时候   如上所示,将它们设置为新值会立即设置它们。的统一   将角度转换为存储的旋转角度   Transform.rotation