我在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/,点击“故障!”看到故障,你看他们不会分开。
答案 0 :(得分:2)
我不确定dot
的目的是什么(也许我在这里缺少一些数学知识),但如果dist < sum(radii)
发生两个圆圈碰撞。如果发生这种情况,您应该偏转圆圈,但要确保它们至少有一些小的速度以确保它们分开。
答案 1 :(得分:2)
如果两个圆圈没有速度重叠,则resCCCol()
方法将无效,因为dot
为0
。即使您更改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;
}
现在你应该给他们什么样的速度?这是你需要解决的问题。可能你想让它们分开,这样你就可以根据从一个中心到另一个中心的直线来计算一些向量,然后沿着那个向量发送一个方向,另一个沿着你认为的速度向另一个方向发送。适当。但如果它们完全相互叠加(中心位于同一点),那么你也需要考虑到这种情况。