Javascript - 圆圈碰撞问题

时间:2014-04-07 17:49:37

标签: javascript html5 canvas physics collision

我在HTML5,Canvas中制作游戏,这是我解决两个移动圈之间碰撞的代码:

function resCCCol(a, b) {
    var dx = a.x - b.x;
    var dy = a.y - b.y;

    var dist = dx * dx + dy * dy;

    var vx = b.vx - a.vx;
    var vy = b.vy - a.vy;

    var dot = dx * vx + dy * vy;

    if (dot > 0) {
        var scale = dot / dist;

        var cx = dx * scale;
        var cy = dy * scale;

        var mass = a.r + b.r;

        var cw1 = 2 * b.r / mass;
        var cw2 = 2 * a.r / mass;

        a.vx += cw1 * cx
        a.vy += cw1 * cy
        b.vx -= cw2 * cx
        b.vy -= cw2 * cy
    }
}

如果我设置坐标以使圆圈重叠但速度仍为0,则圆圈不会相互推出,这就是问题所在。我该如何解决这个问题?

编辑:小提琴:http://jsfiddle.net/yP7xf/2/,点击“故障!”看到故障,你看他们不会分开。

3 个答案:

答案 0 :(得分:2)

我不确定dot的目的是什么(也许我在这里缺少一些数学知识),但如果dist < sum(radii)发生两个圆圈碰撞。如果发生这种情况,您应该偏转圆圈,但要确保它们至少有一些小的速度以确保它们分开。

答案 1 :(得分:2)

如果两个圆圈没有速度重叠,则resCCCol()方法将无效,因为dot0。即使您更改if语句以在dot >= 0上执行,您仍然可以保持0速度。

if (dot > 0) { //dot === 0
    var scale = dot / dist; //scale === 0

    var cx = dx * scale; //cx === 0
    var cy = dy * scale; //cy === 0

    var mass = a.r + b.r;

    var cw1 = 2 * b.r / mass;
    var cw2 = 2 * a.r / mass;

    a.vx += cw1 * cx // 0
    a.vy += cw1 * cy // 0
    b.vx -= cw2 * cx // 0
    b.vy -= cw2 * cy // 0
}

您应该在dot === 0时处理案件。最简单的方法是在速度为0时简单地给它们设定速度:

if (dot > 0) { 
    ... 
} else {
    a.vx = 1;
    a.vy = 1;
    b.vx = -1;
    b.vy = -1;
}

当然,这只会将它们推向彼此远离屏幕的对角,但你可以很容易地实现更好地遵守物理定律的东西(忽略了两个物体无法占据物理定律的事实)相同的空间)。

答案 2 :(得分:0)

目前还不完全清楚处理这个问题的最佳方法是什么,我认为最好先确保你不会在这种情况下结束(通过确保它们不会与零速度重叠),但快速而肮脏的修复方法是检查dot === 0,如果是,请给它们一些速度。例如:

if (dot === 0) {
    // numbers pulled completely out of thin air...
    a.vx = 0.5;
    a.vy = 0.5;
    b.vx = -0.5;
    b.vy = -0.5;
}

http://jsfiddle.net/yP7xf/5/

现在你应该给他们什么样的速度?这是你需要解决的问题。可能你想让它们分开,这样你就可以根据从一个中心到另一个中心的直线来计算一些向量,然后沿着那个向量发送一个方向,另一个沿着你认为的速度向另一个方向发送。适当。但如果它们完全相互叠加(中心位于同一点),那么你也需要考虑到这种情况。