具有受限的旋转速度和可调的移动速度的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情况下正常工作:
找到以下三个点所在的平面:
- 目标点。
- AI单元在上一帧中的位置。
- AI单元的当前位置。
您可以使用该平面以二维方式计算速度。您只需要将点从其3d值转换为嵌入在其公共平面上的2d值即可。
您可能要使用此:
如何将平面上的3D点转换为UV坐标?