首页 > 解决方案 > 矩形c ++之间的块移动(碰撞完成)

问题描述

我有两个矩形,其中一个是静止的。每当我尝试将一个移向另一个时,我希望它“滑动”而不是卡住而无法移动。我使用定向边界框并且代码经过了相当的测试,但我不知道如何避免它们卡住。

两个矩形之间的碰撞

目前我做的是这样的:

o1 = o;

vector2df vxy = o.V;

o1.Pos += vxy;

if(o1.overlaps(o2)){

  o1 = o;
  o1 += vector2df(0.f, vxy.y);

  if(o1.overlaps(o2)){
    vxy.y = 0;
  }

  o1 = o;
  o1 += vector2df(vxy.x, 0.f);

  if(o1.overlaps(o2)){
    vxy.x = 0;
  }

}

o1.V = vxy

这是相当“脏”的,因为它只是检查移动是否可以在 X 和 Y 中完成,如果单独碰撞则禁用它。

速度是一个浮点数,所以稍后它会添加它。

我曾想过做一个while循环,直到它不碰撞,留下它不会碰撞的较小值,但它要么不起作用,要么陷入无限循环......

标签: c++collision

解决方案


我猜要做的第一件事就是倒带移动框的运动,使其不再与固定框发生碰撞。现在你的盒子可能处于碰撞状态,因此是无限循环。

然后,至于确定移动框的新速度,您可能希望从移动框碰撞的固定框获取边缘的方向并将其设置为新速度。

您可能还想在某个时候将这个新速度乘以您的初始速度和新方向的点积,这样当移动框垂直于固定框的边缘时,它基本上会停止,但如果它的速度非常快角度它不会失去太多的速度。

所有这些都描述了一种过于简单的方法,如果您想要更清晰的结果,您可能需要阅读更多关于基本游戏引擎/物理/碰撞检测的信息。

希望这可以帮助。


推荐阅读