2D障碍物碰撞

2D obstacle collision

提问人:Rex 提问时间:8/26/2017 最后编辑:BorgleaderRex 更新时间:8/26/2017 访问量:218

问:

嗨,我正在尝试进行 2d 碰撞,但我没有让它工作 我正在做:

if (collider.posX + collider.sizeX >= obstacle.posX && obstacle.posX + obstacle.sizeX >= collider.posX && collider.posY + collider.sizeY >= obstacle.posY)

障碍物不能在 y 轴上移动,所以这就是为什么我只检查

collider.posY + 50 >= obstacle.posY

碰撞有效,但只有当障碍物在碰撞器中一半时才会开始

C++ 检测冲突

评论


答:

0赞 Jonny Henly 8/26/2017 #1

你遇到逻辑错误,如以下代码所示:

collider.posX + collider.sizeX >= obstacle.posX

假设两个碰撞的物体是圆,它们的位置是它们的中心点。第一个物体沿正 X 方向移动,而第二个物体是静止的(静止的)。您需要检查第一个对象的 X 位置加上其半径(而不是直径)是否与第二个对象的 X 位置减去其半径接触。

示例代码:

collider.posX + (collider.sizeX / 2) >= obstacle.posX - (obstacle.sizeX / 2)

注意:上述不等式假设 表示 的直径。collider.sizeXcollider

大概稍后您还需要检查第一个对象是否传递了第二个对象。由于上述不等式仅解释了第一个对象具有递增的 X 位置,并且其 X 位置小于第二个对象的 X 位置。

2赞 arturx64 8/26/2017 #2

怎么样:

if( obstacle.posX >= collider.posX && 
    obstacle.posX <= collider.posX + collider.sizeX &&
    obstacle.posY >= collider.posY && 
    obstacle.posY <= collider.posY + collider.sizeY
  )

此代码应检查障碍点是否与碰撞体矩形相交。
这是更好的解决方案,因为它可以检测 2 个矩形之间的重叠:

if ( obstacle.posX <= collider.posX + collider.sizeX &&
     obstacle.posX + obstacle.sizeX >= collider.posX &&
     obstacle.posY <= collider.posY + collider.sizeY &&
     obstacle.posY + obstacle.sizeY >= collider.posY )