【发布时间】:2014-05-20 02:50:00
【问题描述】:
我正在用 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/,点击“小故障!”看到故障,因为你看到它们不会分开。
【问题讨论】:
-
请做一个小提琴。
-
jsfiddle.net/yP7xf/2 - 那里
-
如果您添加一些 cmets 来说明您的代码,将会有所帮助。但总的来说,如果两个圆重叠但速度为零,您希望它们做什么?它们必须在弹跳之前移动,否则将无法计算新的速度。最好先确保他们不会进入那种状态。
-
离题但有一个技巧可以根据阈值检查距离并避免平方根。你知道如果
sqrt(x) < y那么x < y*y。在您的情况下,您可以检查dx*dx+dy*dy <= (a.r+b.r)*(a.r+b.r)。您还可以预先计算(a.r+b.r)*(a.r+b.r)并且仅在其中一个半径发生变化时更新它,然后距离测试非常快(2 次乘法、1 次加法和比较 --dx*dx+dy*dy <= a_plus_b_squared)。 -
至于你的问题;你能更详细地描述你试图获得的确切行为吗?
标签: javascript html canvas physics collision