检查值是否介于两个旋转值之间



我正在尝试检查对象的z旋转值是否介于两个给定值之间。如下所示,要检查的值介于-1和+1之间。当我的对象处于负值(例如-0.5(时,它永远不会被调用。适用于0以上的正值,但在0以下时从不调用。

void Update () {
if (transform.eulerAngles.z <= 1 && transform.eulerAngles.z >= -1) {
Debug.Log ("object is in between");
}
}

好的,所以我发现了问题,当我添加Debug.Log (transform.eulerAngles.z);时小于0的值从360开始,而不是打印负值。我该如何修复它?

eulerAngles在某些情况下通常有点不可靠。

原因是Unity内部不存储这些,而是将旋转存储为Quaternion。然而,如何在欧拉空间中表示Quaternion有多种方法,而eulerAngles恰好决定了最佳的人类可读性。

读取.eulerAngles属性时,Unity会将旋转的四元数内部表示转换为Euler角度。因为,使用欧拉角表示任何给定旋转的方法不止一种,所以您读取的值可能与指定的值大不相同。

在我看来,根本不考虑旋转角度会更容易。

一种同样简单的基于向量的检查方法是检查全局Vector3.up向量和本地transform.up之间的Vector3.Angle是否在您的阈值内

if(Vector3.Angle(Vector3.up, transform.up) <= 1f)
{
Debug.Log ("object is in between");
}

由于Unity中的欧拉角是这样工作的(小于0基本上小于360(,我将代码更改为:

if ((transform.eulerAngles.z >= 0 && transform.eulerAngles.z <= 1f) || (transform.eulerAngles.z >= 358f && transform.eulerAngles.z <= 360f)) {
Debug.Log("object is in between");
}

最新更新