C# 角的界问题

C# 角的界问题,c#,unity3d,euler-angles,C#,Unity3d,Euler Angles,提醒:尽管这个问题是在我使用Unity时出现的,但它与Unity无关,更多的是关于编程逻辑,所以请不要回避 我正在使用Unity并通过脚本旋转一个对象。问题是,如果我把它旋转到,比如说,180度,物体就不会旋转到那个程度,而是倾向于停在179到181度之间。所以,为了检查旋转是否完成,我检查旋转角度是否为targetAngle+/-1,这是有效的 我使用 if (transform.eulerAngles.z > lowerLimit && transform.eulerA

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

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

我使用

if (transform.eulerAngles.z > lowerLimit && transform.eulerAngles.z < upperLimit)
现在,当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)
根据需要使用的频率,检查某些情况可能会消除不必要的开销。例如,只有当输入为正时,才需要wrapNumber中的最终%360。如果你每分钟打十次电话,可能没关系。如果每秒调用它100次,您可能需要检查它在这种情况下的性能。

您可以

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)

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

这可能是一个旧线程,但在查看了许多不同的代码片段后,我发现Unity有一个很好的内置函数,可以简单地处理业务,至少在我的例子中,我需要的最终结果是一个lerp,所以我只需要将它更改为LerpAngle,它返回一个可靠的结果

马瑟夫·勒庞是你的朋友。。用弹出等方式解决了我所有的问题


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

马瑟夫·勒庞是你的朋友。。用弹出等方式解决了我所有的问题


啊,很好。在这个特定的例子中,我不需要旋转超过180次,所以我想我会使用这个。谢谢我在这方面仍然遇到一个问题。如果targetAngle为0,则下限为359,上限为361。但当从180旋转到与360相同的0时,旋转停止在359左右。因此,在本例中,我正在检查359+360>359&&359+360<361请尝试最后一次编辑。我100%确信这可以通过巧妙地使用模数和根据需要增加360来解决。如果仍然不是这样,恐怕我需要在调试环境中看到这一点才能完全解决它。既然我现在要走了,我会在今晚或明天再看一遍,如果你发布你的进度,除非你或其他人在那之前把它修好。啊,很好。在这个特定的例子中,我不需要旋转超过180次,所以我想我会使用这个。谢谢我在这方面仍然遇到一个问题。如果targetAngle为0,则下限为359,上限为361。但当从180旋转到与360相同的0时,旋转停止在359左右。因此,在本例中,我正在检查359+360>359&&359+360<361请尝试最后一次编辑。我100%确信这可以通过巧妙地使用模数和根据需要增加360来解决。如果仍然不是这样,恐怕我需要在调试环境中看到这一点才能完全解决它。既然我现在要走了,我会在今晚或明天再看一遍,如果你发布你的进度,除非你或其他人在那之前修复了它。
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)