如何检测球是否正在远离墙壁?

时间:2010-08-29 16:00:31

标签: collision-detection

球被定义为具有半径,位置和速度的圆,其是2D矢量。墙由起点和终点定义。

我能够检测到球与墙之间的碰撞,并知道如何反映正常情况。然而,可以检测到相同的碰撞,并且反复翻转方向的改变,这意味着球基本上停止移动。

所以真的需要一个简单的方法来说明球已经远离线路,所以我可以忽略任何额外的碰撞。

4 个答案:

答案 0 :(得分:3)

您需要在墙上有一个法线向量才能知道它的方向。在球速度矢量和墙法线之间取一个点积。如果点积的结果大于零,则球移离墙壁。如果它为零,则球平行移动,如果小于零,则球向墙壁移动。

补充说明:2010-08-29 18:17

关于墙壁支撑两侧碰撞的情况,已经出现了一个问题。为了正确处理碰撞,你必须回答两个问题:墙的哪一侧是当前球(“内部”或“外部”)以及它相对于墙壁正常移动的方式?上面回答了如何确定第二个问题的答案。

要回答关于球是在球的“内部”还是“外部”的问题,首先要计算从球到墙壁的矢量(墙上的一个点 - 球的中心)。将该向量的点积与壁法向量相乘。如果结果小于零,则球在墙外“。墙上等于零,墙内“大于零”。

然后,您可以回答两个问题。球是否位于墙内“内部”或“外部”,目前是否正朝着墙的“内部”或“外部”移动。

答案 1 :(得分:1)

Hitesh的答案实际上是错误的,因为线的法线可以指向垂直于线的任一方向。这是我首先想到的解决问题的方法,但很快就意识到不会起作用。

球:xb, yb, radius, vx, vy

Walls:x1, y1, x2, y2

float Ang1 = atan2(y1-yb, x1-xb);
float Ang2 = atan2(y2-yb, x2-xb);
float AngB = atan2(vy, vx);

//Catch cases where the wall straddles the change from 2pi radians to 0 radians
//and revolve all the angles around by pi to avoid the problem
//Can only happen in a specific region, this can be done easily by adding 2pi to
// any negative angles.

Ang1 = (Ang1 < 0) ? Ang1 + 2 *PI : Ang1;
Ang2 = (Ang2 < 0) ? Ang2 + 2 *PI : Ang2;
AngB = (AngB < 0) ? AngB + 2 *PI : AngB;

AngU = max(Ang1, Ang2);
AngL = min(Ang1, Ang2);

bool Towards = (AngL < AngB && AngB < AngU) ? true : false;

答案 2 :(得分:0)

也许不是最好的方法,但是你可以将球放在离墙很小的地方......否则我觉得了解你的设计会更好......

答案 3 :(得分:0)

只是一个想法..如果你知道球已经撞到了墙上 - 那么使用某种标志就是如此。一旦检测到碰撞 - 将此标志设置为true。 更具体地说 - 如果你有一些墙壁,并且球不能相互碰撞 - 在每个球上添加一系列布尔值,代表天气或不与每个墙相撞。将其初始化为全部错误。一旦检测到碰撞 - 将相应墙的值设置为true,这样您就不会发现同一个球与同一墙碰撞。一旦检测到球与另一面墙发生碰撞 - 将阵列的所有值设置为false,除了碰撞的最后一面墙。显然,在撞到另一面墙之前,球不能与同一墙碰撞两次(再次,假设墙是直的,球不会相互碰撞,并且球是朝着直线方向前进的......不要假设那些需要更多的工作:) )

这是你在找什么或者我没有得到你的问题?