2012-04-29 117 views
1

我需要通过圆弧实现二维碰撞检测。我有玩家(黑点)和敌人(红点)。玩家可以在任何方向进行攻击,他的命中区域为120度(绿色线条显示)和某个半径(黑色曲线)。圆弧中的二维碰撞检测

My art

如何实现这个检测?

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

+0

曲线和绿线长度之间是否有任何关系? – 2012-04-29 14:08:09

+0

绿线只显示角度。曲线是实际的半径 – 2012-04-29 14:08:39

+0

是的,但玩家可以旋转这个弧线 – 2012-04-29 14:10:02

回答

2

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

问题很简单,如果由于您使用笛卡尔坐标,因此通过转换为径向坐标,这个问题变得简单,如果一个正方形的区域。

随着新的信息

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

检查向量B的长度不是太长。 (| A·B |/| A || C |)

如果该角度小于60度(半的120),那么敌人是在范围ACOS:

然后,向量之间的角度由下式给出。

+0

感谢你的方法是非常清晰,那么我的。有用。 – 2012-04-29 14:29:06

1

首先玩家必须有一个方向,例如2D矢量。简而言之,它与第一条绿线成角度=与另一条绿线成角度。

您应该执行两项检查:

  1. 检查如果敌人和玩家之间的距离小于半径,如果不是,移动到下一个敌人,如果是,那么
  2. 绘制虚拟并且计算这条线和玩家的方向之间的角度,如果它小于命中角区域的一半(在你的例子中,如果它小于60),那么玩家可以击中敌人,如果不移动到下一个。

这应该是足够的想法,希望有帮助。

1

假设你有单位长度的向量指向“向前”。假设你有单位长度矢量指向潜在目标。如果目标在方舟内,那么;

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

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

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