为AI找到达到目标的正确速度


10

我有一艘以最大速度行驶maxSpeed并且rotationSpeed每秒可以转度的船。船舶始终沿其面向的方向移动,这意味着船舶行驶的速度越快,其转弯半径就越大。

我知道我的位置,以及旋转和目标的位置。

我想弄清楚的是,目标物体是否在此速度下或者更好的旋转半径内,所以我能以最大速度行驶是为了在不不断绕转目标的情况下转向目标。

有没有一种有效的方法来做到这一点?

到目前为止,这是我在想的事情:因为我知道每步走了多远,每步旋转了多少,所以我可以弄清楚接下来两帧中的位置。我当前的位置是p1,我的下一个位置是p2,然后是p3。我可以取(p1,p2)和(p2,p3)的垂直平分线。他们的交点将给我一个圆心。然后,我可以测试目标是否在该圈子中。

我不确定这是否可以在3D模式下工作(我不确定如何使用输入来计算球体)。此解决方案也无法找到合适的行进速度,也无济于事,我不得不尝试几次以不同的速度找到合理的行进速度。

任何人都可以提出更好的解决方案吗?

Answers:


17

具有受限的旋转速度和可调的移动速度的AI控制单元可以通过两种方式达到目标。

首先,让我们考虑一下我们面临的挑战,以便我们可以更好地理解它:

在此处输入图片说明

如果玩家尝试以恒定速度移动和旋转,同时尝试达到其右侧或左侧的目标,则它将永远绕圈运动,永远不会面对目标。玩家将圈出的两个区域在上方标记为红色。

标记为红色的圆形区域可以这样计算:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

这将导致红色圆圈的位置和半径。我们可以使用它来确定某个目标是否继续朝着目标方向前进,是否超出了AI控制单元的范围。

要确定某项是否在其中一个圆内,我们只需计算与圆心的距离即可:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

有两种可能的解决方案:

1。

保持一定距离,直到目标在红色圆形区域之外,然后以类似掉头的方式掉头。这很简单,让设备继续移动,直到检查返回目标不在该圆内为止。然后,您可以转身。

在此处输入图片说明

另一个选项需要更多的工作来计算:

我们在AI单元和目标之间画了一条假想的线。使用它们之间的角度:

angle = Math.atan2(goalY - unitY, goalX - unitX);

现在,您需要执行以下操作以计算正确的速度:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

在此处输入图片说明

为了使其在3d情况下正常工作:

找到以下三个点所在的平面:

  1. 目标点。
  2. AI单元在上一帧中的位置。
  3. AI单元的当前位置。

您可以使用该平面以二维方式计算速度。您只需要将点从其3d值转换为嵌入在其公共平面上的2d值即可。

您可能要使用此:

如何将平面上的3D点转换为UV坐标?


完善!正是我所希望的答案!感谢您的详细解释,我想我可以对此进行推断并在3D中使用它。
weichsem 2014年

@weichsem我更新了答案。我建议的想法是找到他们共享的共同2d平原,并使用它来计算正确的速度。
AturSams 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.