【问题标题】:Pseudocode for Swept AABB Collision扫掠 AABB 碰撞的伪代码
【发布时间】:2011-03-24 00:29:57
【问题描述】:

我认为 swept 意味着确定对象是否会在某个时刻发生碰撞,不仅仅是它们当前是否正在发生碰撞,而且如果我错了,请告诉我。

我的对象带有在轴上对齐的边界框。对象的盒子可以有不同的大小,但它们总是矩形的。

我已经尝试并试图找出一种算法来确定两个移动的 AABB 对象是否会在某个时候发生碰撞,但我真的很难。我在这里阅读了一个关于确定两个对象在某个时间点通过的时间间隔的问题,我在可视化它时没有问题,但实现它是另一回事。好像异常太多了,好像我做的不太对。

对象只能沿直线移动(虽然它们显然可以改变方向,例如转身,但它们始终在轴上。如果他们试图关闭轴,那么它就不起作用),并绑定到轴上。他们的有界框不会旋转或做任何类似的事情。速度可以改变,但这并不重要,因为该方法的目的是确定在给定对象的当前状态的情况下它们是否处于“碰撞过程”中。如果您需要更多信息,请告诉我。

如果有人能提供一些伪代码(或真实代码),那就太好了。我读了一个名为Intersection of Convex Objects: The Method of Separating Axes 的文档,但我不明白其中的一些伪代码(Union 是什么意思)?

感谢您的帮助。

【问题讨论】:

    标签: algorithm 2d collision bounding-box


    【解决方案1】:

    当发生碰撞时,盒子会接触到一侧。您可以检查它们是否会接触成对的边(LR、RL、UD、DU)。

    如果可以简化问题,您可以平移这些框,使第一个框位于原点并且不会移动。

    类似于以下代码:

    dLR = B.L - A.R;
    dRL = A.L - B.R;
    dUD = B.U - A.D;
    dDU = A.U - B.D;
    
    vX = A.xV - B.xV;
    vY = A.yV - B.yV;
    
    tLR = dLR / vX;
    tRL =-dRL / vX;
    tUD = dUD / vY;
    tDU =-dDU / vY;
    
    hY = dUD + dDU; //combined height
    hX = dLR + dRL;
    
    if((tLR > 0) && (abs(dDU + vY*tLR) < hY)) return true;
    if((tRL > 0) && (abs(dUD - vY*tRL) < hY)) return true;
    if((tUD > 0) && (abs(dRL + vX*tUD) < hX)) return true;
    if((tDU > 0) && (abs(dLR - vX*tDU) < hX)) return true;
    return false;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多