【问题标题】:How to get to an angle choosing the shortest rotation direction如何达到选择最短旋转方向的角度
【发布时间】:2014-08-26 12:59:45
【问题描述】:

我的游戏中有一个角色必须平稳旋转才能达到所需的角度。将angle 视为当前角度,将touchAngle 视为始终在0 到360 之间的所需角度。我想在每次游戏更新中为当前角度添加+1/-1 以获得所需的touchAngle。问题是首先它必须选择方向,并且必须在 0 到 360 之间。这是我的伪代码:

int touchAngle;
float angle;
public void update()
{
    if ((int)angle != touchAngle) angle += ???
}

【问题讨论】:

  • f* 堆栈交换有什么问题,人们总是投反对票。人家问问题不好吗?如果和编程没有直接关系,至少是相对相关的。

标签: java math


【解决方案1】:

由于您的值始终在区间[0 360] 内进行标准化,这应该不会太难。 您只需要区分两种不同的情况:

angle < touchAngle
angle > touchAngle

在第一种情况下,我们要逆时针旋转,因此更新必须为angle =+ 1(假设您希望每个更新周期都转为 1)。 在第二种情况下,我们想顺时针旋转,所以更新应该是angle -= 1

问题在于,这并不总是最短的旋转方式。例如,如果:

angle == 359
touchAngle == 1

我们不想一直旋转到 358、357、356...相反,我们只想逆时针旋转 2 个单位:360、1。 这可以通过比较角度abs(angle - touchAngle)之间的距离来实现。

如果这个值大于180,则意味着我们走错了路,所以我们必须绕道而行

if(angle < touchAngle) {
    if(abs(angle - touchAngle)<180)
       angle += 1;
    else angle -= 1;
}

else {
    if(abs(angle - touchAngle)<180)
       angle -= 1;
    else angle += 1;
}

当然,直到((int)angale != touchAngle)。 我可能在案例中犯了错误,但这是原则。

【讨论】:

  • 非常感谢。我没有先考虑如果。如何标准化角度,使其始终在 0 到 360 之间?
  • 感谢% 运算符,这非常容易。 stackoverflow.com/questions/1628386/…
  • 在 % 之后,我将检查负值并添加 360!非常感谢。
【解决方案2】:

通常您希望将时间带入方程,以便您可以平滑地更改time 上的角度。大多数设置都有一种方法来获取渲染前一帧所需的时间,典型的方法是说......

int touchAngle;
float angle;
float deltaTime; //Time it took to render last frame, typically in miliseconds
float amountToTurnPerSecond;
public void update()
{
    if((int)angle != touchAngle) angle += (deltaTime * amountToTurnPerSecond);
}

这将使您的角度每秒改变amountToTurnPerSecond,但在每一帧上缓慢改变正确的变化量,使其平滑。需要注意的是,大多数时候你不会均匀地以touchAngle 结束,所以检查你是否过去并改为设置为touchAngle 是个好主意。

编辑以跟进评论:

我认为获得正确转弯方向的最简单方法实际上是根本不使用角度。您需要在 2d 空间中获取从触摸到角色的相对方向。通常,您将触摸从屏幕空间带到世界空间,然后在那里进行计算(至少这是我过去所做的)。从接触世界空间开始,然后使用矢量叉积来确定方向。这看起来有点像以下......

character position = cx, cy
target position = tx, ty
current facing direction of character = rx, ry

首先我们取角色到目标位置的距离:

dx = tx - cx
dy = ty - cy

这不仅告诉我们它离我们有多远,而且本质上告诉我们,如果我们在 0、0 处,目标会在 2d 空间中的哪个象限?

接下来我们做一个叉积:

cross_product = dx * ry - dy * rx

如果这是积极的,你就走一条路,如果是消极的,你就走另一条路。之所以这样,是因为如果距离例如(-5, 2),那么我们就知道,如果我们正对着北方,那么这个点就在我们的左边 5 和前面 2。所以我们向左转。

【讨论】:

  • 我已经考虑了增量时间。问题是选择正确的旋转方向?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多