gpt4 book ai didi

javascript - 使用 Angular 弹性二维球碰撞

转载 作者:行者123 更新时间:2023-11-29 19:26:28 25 4
gpt4 key购买 nike

是的,这方面有一些线索,但使用 Angular 并不多,我真的想通过这种方式解决问题,我现在坚持为圆圈设置新的速度 Angular 。我一直在看: http://www.hoomanr.com/Demos/Elastic2/作为引用,但我现在卡住了。

任何人都可以解释一下吗?

cx/cy/cx2/cy2 = 球 1 和 2 的中心 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..
}

这是代码笔链接:

http://codepen.io/anon/pen/MwbMxX

最佳答案

几个方向:

• 如评论中所述,仅使用弧度(不再是 *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

• 旋转一个向量,首先计算它的范数,然后只用新的 Angular 投影它:

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);

• 当碰撞已经发生时您正在检测碰撞,因此两个圆圈重叠,但您没有解决碰撞,这意味着圆圈可能在下一次迭代时仍然重叠,从而导致新的碰撞并且采取的新方向,...未解决等。-->> 解决碰撞后,您需要确保两个圆不再碰撞。

• 最后一个问题,但不是一个小问题,是如何计算 Angular 。抱歉,没时间陪你了,但是构建一个(多个)方案来展示你如何计算 Angular 对你和我们都有帮助。

在这里更新(但不工作)代码笔:

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);

关于javascript - 使用 Angular 弹性二维球碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30497287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com