【发布时间】:2014-11-19 10:48:19
【问题描述】:
我一直在开发一个需要球与球碰撞的游戏,但我似乎找不到任何解决这个问题的方法,我几乎遇到了碰撞,因为球正朝着正确的方向前进,但速度却混乱了.
一旦球相互碰撞,水平方向 (x) 的反弹非常剧烈,而垂直方向 (y) 的反弹非常轻柔。我不知道这是什么原因,我试图通过除法来降低 x 速度,但这意味着它与 y 值不成比例。
这是我的碰撞代码:
function resolveCollision(b1, b2){
var dot = function(v1, v2) {
return v1.x * v2.x + v1.y * v2.y;
};
v1x = b1.vx/2
v2x = b2.vx/2
v1y = b1.vy
v2y = b2.vy
var length = function(v) {
return Math.sqrt(v.x * v.x + v.y * v.y);
};
var delta = {x: b1.x - b2.x,
y: b1.y - b2.y};
var d = Math.sqrt((delta.x * delta.x) + (delta.y * delta.y));
var dn = {x: delta.x / d,
y: delta.y / d}
var dt = {x: dn.y,
y: -dn.x};
if (d === 0){
b2.x += 0.01;
}
var m1 = b1.m;
var m2 = b2.m;
var M = m1 + m2;
var mt = {x: dn.x * (b1.r + b2.r - d),
y: dn.y * (b1.r + b2.r - d)};
b1.x = b1.x + mt.x * m2 / M
b1.y = b1.y + mt.y * m2 / M
b2.x = b2.x + mt.x * m1 / M
b2.y = b2.y + mt.y * m1 / M
var v1 = {x: v1x, y: v1y};
var v2 = {x: v2x, y: v2y};
var v1n = {
x: dn.x * (v1.x * v1.x + dn.y * dn.y),
y: dn.y * (v1.x * v1.x + dn.y * dn.y)
};
var v1t = {
x: dt.x * (v1.x * v1.x + dt.y * dt.y),
y: dt.y * (v1.x * v1.x + dt.y * dt.y)
};
var v2n = {
x: dn.x * (v2.x * v2.x + dn.y * dn.y),
y: dn.y * (v2.x * v2.x + dn.y * dn.y)
};
var v2t = {
x: dt.x * (v2.x * v2.x + dt.y * dt.y),
y: dt.y * (v2.x * v2.x + dt.y * dt.y)
};
b1.velocity = {
x: v1t.x + dn.x * ((m1 - m2) / M * length(v1n) + 2 * m2 / M * length(v2n)),
y: v1t.y + dn.y * ((m1 - m2) / M * length(v1n) + 2 * m2 / M * length(v2n))
};
b2.velocity = {
x: v2t.x - dn.x * ((m2 - m1) / M * length(v2n) + 2 * m1 / M * length(v1n)),
y: v2t.y - dn.y * ((m2 - m1) / M * length(v2n) + 2 * m1 / M * length(v1n))
};
b1.vx = b1.velocity.x;
b1.vy = b1.velocity.y;
b2.vx = b2.velocity.x;
b2.vy = b2.velocity.y;
}
另外,如果有人能告诉我如何让球员(圆圈)在不反弹的情况下将球推得更远,那就太好了。
如果有人想看的话,这是文件,一切都在 app.js 中: https://www.mediafire.com/?d6dpqn1cmwzp756
对于那些无法理解我想要实现的目标的人来说,这就是我想要复制的:http://www.haxball.com
【问题讨论】:
-
对于那些无法理解我想要达到的目标的人来说,这就是我想要复制的:www.haxball.com
标签: javascript html html5-canvas collision-detection