gpt4 book ai didi

c# - 角度边界问题

转载 作者:太空宇宙 更新时间:2023-11-03 22:10:50 25 4
gpt4 key购买 nike

注意:尽管这个问题是在我使用 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)

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

编辑

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 仅在输入为正时才需要。如果您每分钟调用 10 次,这可能无关紧要。如果您每秒调用它一百次,您可能想检查它在这种情况下的表现。

关于c# - 角度边界问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6723127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com