1

我需要通过弧实现二维碰撞检测。我有玩家(黑点)和敌人(红点)。玩家可以向任何方向攻击,他的命中范围是120度(绿线表示)和一定的半径(黑色曲线)。

我的艺术品

如何实现这种检测?

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

4

3 回答 3

2

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

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

有了新信息

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

检查向量 B 的长度是不是太长。

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

如果角度小于 60 度(120 度的一半),则敌人在射程内。

于 2012-04-29T14:08:00.210 回答
1

首先玩家必须有一个方向,例如一个二维向量。简单地说,它与第一条绿线的角度=它与另一条绿线的角度。

您应该执行两项检查:

  1. 检查敌人与玩家之间的距离是否小于半径,如果不是,则移动到下一个敌人,如果是则
  2. 在玩家和敌人之间画一条虚拟线,并计算这条线与玩家方向之间的角度,如果它小于 hit-area-angle 的一半(在你的例子中,如果它小于 60)那么玩家可以击中敌人,如果没有移动到下一个。

这应该足够一个想法,希望这会有所帮助。

于 2012-04-29T14:15:40.530 回答
1

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

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

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

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

于 2012-04-29T14:28:41.310 回答