【问题标题】:collision detection. 2 rectangles intersect: place source rectangle outside area碰撞检测。 2个矩形相交:将源矩形放在区域外
【发布时间】:2014-07-08 22:33:35
【问题描述】:

我正在用 as3 编写一个碰撞检测系统。它旨在简单:我有一些移动矩形和一些静态矩形。当一个移动的矩形与另一个矩形发生碰撞时,我想将源(碰撞)矩形移动到碰撞区域之外,但仍尽可能靠近(基于源的轨迹)。

在每一帧上,我都会更新移动矩形的位置并检查所有矩形之间的接触。

下图代表如下:

a:框 #1 以 45 度角向静态矩形 (#2) 移动。

b:在几次“滴答”之后,我们看到 Rectangle #1 移动到 Rectangle #2 的空间(静态空间)。这是第一次检测到撞击的点。

c:现在——我真正想做的事! - 将源 Rectangle #1 移动到 Rectangle #2 碰撞区域的外围。

...所以给定 Rectangle #1 的移动角度,并且知道 Rectangle #1 和 #2 的整体区域和位置,是否有一个公式可以为 Rectangle # 提供最接近的 x 和 y 坐标1 被移动到(这样我们就不再完全碰撞,正如我们在阶段'b'中看到的那样)。

显然,我想要一个可以在任何移动角度和各种矩形形状下工作的解决方案。

在此先感谢您抽出宝贵时间 :)

【问题讨论】:

  • 速度是否保证低于任何矩形的宽度?我问是因为这大大增加了难度
  • 还有,这些盒子是否旋转了?如果其中任何一个是正确的,那么您就是在冒险进入游戏引擎领域,这对于一个问题来说太宽泛了
  • 否 - 没有旋转。并且速度可能大于矩形的宽度或高度。谢谢!

标签: actionscript-3 collision-detection


【解决方案1】:

假设你的绿色方块与红色方块碰撞,速度小于其宽度。

这个速度限制的重要性在于,这样你只需要检查碰撞点 a、b、d,只要你在“右上角”移动。此速度限制可避免碰撞点“越过”其目标并错过碰撞。假设“a”将移动到点“p”。

即:

//check if p is inside the red box
if (p.x > f.x && p.x < g.x && p.y > i.y && p.y < f.y)
{
    //calculate the intersection of |if| with |aP|
    var x:Number = f.x;
    var y:Number = a.y + ((f.x - a.x) / (p.x - a.x)) * (p.y - a.y);
}

【讨论】:

  • 感谢您回复马顿。我不确定我是否完全遵循 - 我担心我一直不清楚:我知道拦截已经发生。我已经能够达到步骤'b'了。我遇到的困难是在矩形 #2 的周边找到正确的 xy 以放置矩形 #1(步骤'c')。
  • |if| 的交集和 |ap|是碰撞“发生”的地方
  • 啊,是的!这是向前迈出的一大步。我的模型需要考虑更多角度以及绿色矩形的 1-4 个点位于红色矩形内的可能性。如果有一个完整的通过,我可以忍受碰撞被“错过”。谢谢马顿!
  • 只需遍历这些点并检查它们中的每一个...要确定它击中哪个“边”,请检查“a”将准确击中“f”的角度。上面的任何东西都会命中|if|,下面的任何东西都会命中|fg|
【解决方案2】:

假设您的矩形从未旋转,您可以使用内置方法检查实际碰撞,Rectangle.intersects()

var rectangleA:Rectangle = objectA.getRect(objectA.parent);
var rectangleB:Rectangle = objectB.getRect(objectB.parent);

if(rectangleA.insersects(rectangleB))
{
    // Collision.
}

至于将矩形移回其碰撞对象的外侧,您可以将其轨迹添加 180 度并返回,直到矩形不再相交。

如果您想要更逼真的碰撞和旋转矩形,请使用 Box2D 等物理引擎。

【讨论】:

  • 谢谢。我正在寻找一种不涉及增量备份和重新检查冲突的解决方案。
  • 为了速度。许多这些过程可能在每一帧上进行。我想要一个干净的公式 - 我相信有一个几何解决方案,我只是找不到它:)
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-10-12
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多