关于角度边界的问题

本文关键字:问题 边界 于角度 | 更新日期: 2023-09-27 18:02:24

提醒:尽管这个问题是在我使用Unity时出现的,但它与Unity无关,更多的是关于编程逻辑,所以请不要回避。

我使用Unity并通过脚本旋转对象。问题是,如果我把它旋转,比如说,180度,这个物体不会旋转那么多它会停在179到181度之间。因此,为了检查旋转是否完成,我检查旋转角度是否为targetAngle +/- 1,这是有效的。

我用

检查
if (transform.eulerAngles.z > lowerLimit && transform.eulerAngles.z < upperLimit)

,

lowerLimit = targetAngle-1;
upperLimit = targetAngle + 1;

现在,当targetAngle为0时,问题就出现了。在本例中,脚本检查旋转角度是否在-1和1之间。但是,-1实际上应该是359,所以它需要检查角度是否在359和1之间。

我如何实现这个?换句话说,我想我是在问如何实现一个环绕数字系统。

编辑

找到了一个解决方法。如果targetAngle为0,我将其特殊处理。它可以工作,但不是最优雅的。

         if (targetAngle == 0.0)
        {
            if ((transform.eulerAngles.z > 359.0 && transform.eulerAngles.z <= 360.0) || (transform.eulerAngles.z >= 0.0 && transform.eulerAngles.z <= 1)) 
            {
                rotate = false;            
            }
        }
        else
        {
            if (transform.eulerAngles.z > targetAngle - 1 && transform.eulerAngles.z < targetAngle + 1)
            {
                rotate = false;            
            }
        }

关于角度边界的问题

你可以…

lowerLimit = (targetAngle % 360) + 359; //360 - 1;
upperLimit = (targetAngle % 360) + 361; //360 + 1;
if (((transform.eulerAngles.z + 360) % 360) > lowerLimit
 && ((transform.eulerAngles.z + 360) % 360) < upperLimit)

这将检查从0移开,您将不必处理正/负检查。

编辑

targetAngle上的%操作符将旋转限制为+/-359度,因此目标角721将降至1,目标角-359将降至1。

编辑2

要修复你在评论中提到的最后一个案例,我想你需要将相同的包装逻辑应用于你的transform.eulerAngles.z值。现在最好把这个包装放在一个额外的函数中,所以试试这个:

int wrapNumber(int input) // replace int with whatever your type is
{
  // this will always return an angle between 0 and 360:
  // the inner % 360 restricts everything to +/- 360
  // +360 moves negative values to the positive range, and positive ones to > 360
  // the final % 360 caps everything to 0...360
  return ((input % 360) + 360) % 360;
}
lowerLimit = wrapNumber(targetAngle) + 359; //360 - 1;
upperLimit = wrapNumber(targetAngle) + 361; //360 + 1;
if (wrapNumber(transform.eulerAngles.z) + 360 > lowerLimit
 && wrapNumber(transform.eulerAngles.z) + 360 < upperLimit)

根据您需要使用它的频率,检查某些情况可能会消除不必要的开销。例如,只有在输入为正时,wrapNumber中才需要最终的% 360。如果你每分钟打十次这个电话,这可能无关紧要。如果你每秒调用它100次,你可能想检查一下它在这种情况下的表现。

这可能是一个旧的线程,但在看到许多不同的片段都试图处理包装后,我发现Unity有一个很好的内置函数,简单地处理业务,至少在我的情况下,我需要的最终结果是一个lerp,所以我只需要将其更改为LerpAngle,它返回了一个坚实的结果。

Mathf。LerpAngle是你的朋友…解决了我所有的弹出等问题。

http://docs.unity3d.com/ScriptReference/Mathf.LerpAngle.html