修复碰撞检测渗透

时间:2014-03-03 12:14:48

标签: java game-engine physics collision game-physics

我正在游戏中实现碰撞检测,并且在理解如何计算矢量以在碰撞时修复我的形状重叠时遇到了一些麻烦。

比方说,我有两个正方形。 squareAsquareB。对于他们两个人,我知道他们的xCoyCowidthheightsquareA正在移动,因此他的速度为magnitude,速度为angle。让我假装我每秒更新一次游戏。我已经说明了下面的情况。

shapes before movement

shapes after movement

现在,我需要一个公式来获取向量来修复重叠。如果我将此向量应用到红色方块(squareA)上,它们不应再重叠。这就是我希望实现的目标。

enter image description here

任何人都可以帮我找出计算向量的公式吗?

如果使用Java构建奖励积分。

如果您输入答案而不是链接到碰撞检测教程,则可获得奖励积分。

谢谢你们!

另外,如何计算新的速度magnitudeangle?我希望sqaureA继续沿x轴移动(沿蓝色方块的顶部滑动)

2 个答案:

答案 0 :(得分:0)

我的功能看起来像这样:

Position calculateValidPosition(Position start, Position end)
    Position middlePoint = (start + end) /2

    if (middlePoint == start || middlePoint == end)
        return start 

    if( isColliding(middlePont) )
        return calculateValidPosition(start, middlePoint)
    else
        return calculate(middlePoint, end)

我刚刚制作了这段代码,因此会有很大的改进空间......首先不要让它递归。

当检测到碰撞时,将调用此函数,将参数作为参数传递给对象的最后一个有效位置,以及当前的无效位置。 在每次迭代中,第一个参数始终有效(无碰撞),第二个参数无效(存在碰撞)。

但我认为这可以让您了解可能的解决方案,因此您可以根据自己的需要进行调整。

答案 1 :(得分:0)

您提出的问题需要答案才是您的整个申请。但是一个简单的答案很容易提供。

  1. 您需要使用四叉树划分空间
  2. 您似乎表示在检测到碰撞时只会移动一个对象。 (对于多个互穿对象的情况,只需更正集合中的每对对象,直到没有重叠。)
  3. 弹性碰撞和非弹性碰撞都不是理想的行为。你想要一个水平速度(方形A)的简单投影,所以Vx(t-1)= Vx(t + 1),Vy(t-1)是无关的,Vy(t + 1)= 0。这是碰撞的时间。
  4. 方形A的重新定位很简单。
    • 将Cn定义为从A的质心到顶点n的向量(其中顶点的标记是任意的)。
    • 将A(t-1)定义为A的前一个方向。
    • 将Dn定义为A(t-1)和向量Cn
    • 的点积
    • 将Rn定义为沿Cn测量的A的宽度(并沿相反方向延伸越过质心)。
    • 将Sn定义为B的半径为Rn的扩张。
    • 设j为具有最高y值的B的顶点。
    • 设k是最接近A前角的顶点[在直观意义上,Dn的值表示Ck最接近于A(t-1)]。
    • 令K为A的对映边或顶点,相对于k。
  5. 最后,翻译A使k和j重合,K与Sk重合。