弧形中的二维碰撞检测

时间:2012-04-29 14:04:40

标签: c++ math

我需要通过弧实现2D碰撞检测。我有玩家(黑点)和敌人(红点)。玩家可以向任何方向攻击,其命中区域为120度(绿线表示)和一定半径(黑色曲线)。

My art

如何实现这种检测?

我已经完成了在玩家和敌人之间计算角度的代码,但是我无法理解如何使用玩家的方向向量来检查它是否在弧内。

3 个答案:

答案 0 :(得分:2)

计算敌人的角度和他们的距离。用它来检查它们是否在范围内。

问题很简单,如果你使用笛卡尔坐标的方形区域,那么通过转换为径向坐标,这个问题也变得简单了。

使用新信息

  • 矢量A是玩家的方向向量。
  • 计算从敌人到玩家的矢量B.

检查矢量B的长度不会太长。

然后矢量之间的角度由下式给出:acos(| A.B | / | A || B |)

如果角度小于60度(120的一半),那么敌人就在范围内。

答案 1 :(得分:1)

首先,玩家必须有方向,例如2D矢量。简单来说,它与第一条绿线的角度=它与另一条绿线的角度。

您应该执行两项检查:

  1. 检查敌人和玩家之间的距离是否小于半径,如果没有,移动到下一个敌人,如果是,那么
  2. 在玩家和敌人之间画一条虚拟线,并计算该线与玩家方向之间的角度,如果它小于击中区域角度的一半(在你的例子中,如果它小于60)然后玩家可以击中敌人,如果没有移动到下一个。
  3. 这应该足够作为一个想法,希望这有用。

答案 2 :(得分:1)

假设您有单位长度向量指向“向前”。而且假设你有单位长度向量指向潜在目标。如果目标在ark内,那么;

dot(forwardVector, targetVector) >= cosf(arcAngle/2)

如果向量不是单位长度,当然不会起作用。检查目标是否在要求的角度内。

检查它是否在要求的距离内是微不足道的,并且几乎是squaredLength(targetPosition - playerPosition) <= arkDistance*arkDistance,其中squaredLength是dot(vector, vector)