gpt4 book ai didi

algorithm - 2个运动物体的碰撞算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:06 25 4
gpt4 key购买 nike

这是一个 2d 游戏的数学问题。

Given 2 object ( 2 car, 2 tank, 2...), for each object i know: 
1. X, Y
2. Actual Speed
3. Degree of movement (or radiant)

如何计算碰撞对 2 物体的“影响”

附言:

我在“游戏循环”的每个滴答中用这个简单的公式“移动”对象:

ychange = Math.Sin(radiant) * ((carspeed / xVar));
xchange = Math.Cos(radiant) * ((carspeed / xVar));

(其中 xVar 是一个“乘数”,可以让我的车在屏幕上显示得更慢)

对于发生碰撞的“第一个”对象,如果我在该公式前面添加一个“减号”(-),我可以模拟第一个对象的良好“反弹”..但不是第二个。

所以我的问题是关于计算第二个对象的良好(不完美!)和更现实的“影响效果”的方法。

谢谢你的帮助

最佳答案

几个月前,我实现了一个斯诺克游戏。我使用以下代码使两个球发生碰撞。请注意,它们不是边界框。

此方法根据每个物体的质量、速度和角度计算最终的速度和角度。

它在我的游戏中就像一个魅力。

 float   dx = b1->x - b2->x, dy = b1->y - b2->y;
float d = sqrt(sqr(dx) + sqr(dy));
float vp1, vp2, vx1, vx2, vy1, vy2;
vx1 = ballSpeedX(b1);
vx2 = ballSpeedX(b2);
vy1 = ballSpeedY(b1);
vy2 = ballSpeedY(b2);
vp1 = vx1 * dx / d + vy1 * dy / d;
vp2 = vx2 * dx / d + vy2 * dy / d;

float distance = sqrt(sqr(dx) + sqr(dy));

// Unit vector in the direction of the collision.
float ax = dx / distance, ay = dy / distance;

// Projection of the velocities in these axes.
float va1 = vx1 * ax + vy1 * ay, vb1 = -vx1 * ay + vy1 * ax;
float va2 = vx2 * ax + vy2 * ay, vb2 = -vx2 * ay + vy2 * ax;

// New velocities in these axes (after collision): edmass / b2->mass);
float vaP2 = va2 + (1.0 + D_BALL_ELASTIC_COEFFICIENT) * (va1 - va2) / (1.0 + b2->mass / b1->mass);

// Undo the projections.
vx1 = vaP1 * ax - vb1 * ay; vy1 = vaP1 * ay + vb1 * ax; // new vx,vy for ball 1 after collision.
vx2 = vaP2 * ax - vb2 * ay; vy2 = vaP2 * ay + vb2 * ax; // new vx,vy for ball 2 after collision.

b1->speed = sqrt(sqr(vx1) + sqr(vy1));
b1->angle = acos(fabs(vx1 / b1->speed));

b2->speed = sqrt(sqr(vx2) + sqr(vy2));
b2->angle = acos(fabs(vx2 / b2->speed));

此代码是用纯 C 语言编写的。我存储运动数据的方式和你的一样。变量 b1 和 b2 是球。

我相信代码本身并不难理解,但物理原理并不简单。

希望对您有所帮助!

关于algorithm - 2个运动物体的碰撞算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056281/

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