AABB扫描碰撞 - 轴上的鬼碰撞

时间:2015-03-09 21:44:01

标签: collision-detection

我已经设置了一个简单的AABB物理引擎,它使用连续碰撞检测,这里是算法,它在JS中,无论如何都很容易为任何程序员阅读:

var fTime = 0;
var lTime = 1;
var oTime = new Vec();

for (var i = 0; i < 2; i++) {
    var d = "xy".charAt(i);

    if (vel[d] < 0) {
        if (bMax[d] < aMin[d]) return false;
        if (aMax[d] < bMin[d]) fTime = Math.max((aMax[d] - bMin[d]) / vel[d], fTime);
        if (bMax[d] > aMin[d]) {
            oTime[d] = (aMin[d] - bMax[d]) / vel[d];
            lTime = Math.min(oTime[d], lTime);
        }
    } else if (vel[d] > 0) {
        if (bMin[d] > aMax[d]) return false;
        if (bMax[d] < aMin[d]) fTime = Math.max((aMin[d] - bMax[d]) / vel[d], fTime);
        if (aMax[d] > bMin[d]) {
            oTime[d] = (aMax[d] - bMin[d]) / vel[d];
            lTime = Math.min(oTime[d], lTime);
        }
    }

    if (fTime > lTime) return false;
}

fTime是firstTime,lTime是lastTime,oTime是每个轴上的overlapTime,所以我以后可以用它来计算hitNormal。 d是维度。而vel显然是相对速度。

此视频显示了该问题:https://vid.me/FZwL

正如您所看到的,当创建另一个移动框时,它会在与静态框相同的y轴上发生碰撞,为什么会发生这种情况,如何解决?

在算法中,取自Christer Ericsons关于实时碰撞检测的书,如果轴上的速度是0,它不会处理吗?

我试过把&lt; =和&gt; ='s但是它们会更加失败。

导致这些“幽灵碰撞”的原因是什么?如何修复它们?

0 个答案:

没有答案