是的,这里有几个主题,但使用角度并不多,我真的想通过这种方式解决这个问题, 我现在坚持为圆圈设置新的速度角度。我一直在看: http://www.hoomanr.com/Demos/Elastic2/ 作为对它的参考,但我现在被卡住了。
任何人都能解释一下吗?
对于球1和球2,cx / cy / cx2 / cy2 =中心x / y。 vx / vy / vx2 / vy2 =球1和2的x / y速度
function checkCollision() {
var dx = cx2 - cx; //distance between x
var dy = cy2 - cy; // distance between y
var distance = Math.sqrt(dx * dx + dy * dy);
var ang = Math.atan2(cy - cy2, cx - cx2);
// was displaying these in a div to check
var d1 = Math.atan2(vx, vy); //ball 1 direction
var d2 = Math.atan2(vx2, vy2); //ball 2 direction
// this is where I am stuck, and i've worked out this is completely wrong now
// how do i set up the new velocities for
var newvx = vx * Math.cos(d1 - ang);
var newvy = vy * Math.sin(d1 - ang);
var newvx2 = vx2 * Math.cos(d2 - ang);
var newvy2 = vy2 * Math.sin(d2 - ang);
if (distance <= (radius1 + radius2)) {
//Set new velocity angles here at collision..
}
这是一个代码链接:
答案 0 :(得分:3)
几个方向:
•如评论中所述,仅使用弧度(不超过* 180 / PI) •atan2将y作为第一个参数,x作为第二个参数。
var d1 = Math.atan2(vy, vx); //ball 1 direction in angles
var d2 = Math.atan2(vy2, vx2); //ball 2 direction in angles
•旋转矢量,首先计算其范数,然后仅使用新角度投影:
var v1 = Math.sqrt(vx*vx+vy*vy);
var v2 = Math.sqrt(vx2*vx2+vy2*vy2);
var newvx = v1 * Math.cos(d1 - ang);
var newvy = v1 * Math.sin(d1 - ang);
var newvx2 = v2 * Math.cos(d2 - ang);
var newvy2 = v2 * Math.sin(d2 - ang);
•您正在检测碰撞已经发生,因此两个圆都重叠,但您 NOT 解决了碰撞,这意味着圆圈在下次迭代时可能仍会重叠,从而导致新的碰撞和一个新的方向,......没有解决,等等。 - &GT;&GT;解决碰撞后,您需要确保两个圆圈不再发生碰撞。
•最后一个问题,但不是一个小问题,是你计算角度的方法。再也没有时间对不起了,但是对于你和我们来说,构建一个(几个)方案来展示你如何计算角度会很有帮助。
此处更新(但不能正常工作)codepen:
http://codepen.io/anon/pen/eNgmaY
祝你好运。编辑:
您在codepen.io/anon/pen/oXZvoe的代码简化了这一点:
var angle = Math.atan2(dy, dx),
spread = minDistance - distance,
ax = spread * Math.cos(angle),
ay = spread * Math.sin(angle);
vx -= ax;
vy -= ay;
vx2 += ax;
vy2 += ay;
你正在从速度中减去两个圆圈之间的差距。由于之后您将速度添加到位置,这将进行空间分离(=>不再发生碰撞) 我想要理解vx- = ax意味着什么,我们必须记住牛顿:v = a * t,其中a是加速度,所以基本上做vx = -ax意味着施加一个力,两个中心之间的方向作为方向,并且两个圆圈作为强度碰撞(扩散)的量。这个数量显然是随机的,因此您看到的数值不稳定性:有时效果很小,有时候很大。
在这里查看恒定打孔版本:
http://codepen.io/anon/pen/WvpjeK
var angle = Math.atan2(dy, dx),
spread = minDistance - distance,
ax = spread * Math.cos(angle),
ay = spread * Math.sin(angle);
// solve collision (separation)
cx -= ax;
cy -= ay;
// give a punch to the speed
var punch = 2;
vx -= punch*Math.cos(angle);
vy -= punch*Math.sin(angle);
vx2 += punch*Math.cos(angle);
vy2 += punch*Math.sin(angle);