【问题标题】:2D collsion detection in arc圆弧中的二维碰撞检测
【发布时间】:2012-04-29 14:04:39
【问题描述】:

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

如何实现这种检测?

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

【问题讨论】:

  • 曲线和绿线的长度有关系吗?
  • 绿线只显示角度。曲线是实际半径
  • 可以,但是玩家可以旋转这条弧线

标签: c++ math


【解决方案1】:

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

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

有新信息

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

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

那么向量之间的角度由下式给出:acos(|A.B| / |A||B|)

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

【讨论】:

    【解决方案2】:

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

    您应该执行两项检查:

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

    这个想法应该足够了,希望对你有所帮助。

    【讨论】:

      【解决方案3】:

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

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

      如果向量不是单位长度,那当然是行不通的。这会检查目标是否在要求的角度内。

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

      【讨论】:

        猜你喜欢
        • 2017-10-02
        • 2016-08-08
        • 2011-09-12
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多