2012-03-01 112 views
0

所以我有一个通常工作的碰撞球的系统,除了当他们碰撞相似的方向,相隔不到90度。球碰撞问题

Diagram of colliding balls problem

这是因为上述球试图碰撞黄线,其是假想碰撞面,但它发送它从错误的方向,并且它“跟随”其他球。为碰撞的一般算法是:

dot = direction.surface; 
parallel = surface * dot; 
perpendicular = direction - parallel; 
direction = perpendicular - parallel; 

哪个否定垂直于表面法线平行于表面法线,其垂直于碰撞平面的方向的分量,并且部分是不变的。

有没有人知道这个问题的解决办法?我做错了什么?

编辑:所以现在我说:

average = (ball1.velocity + ball2.velocity)/2; 
ball1.velocity -= average; 
ball2.velocity -= average; 

做上面的计算之前和之后:

ball1.velocity += average; 
ball2.velocity += average; 

要获得正确的参照系,根据@贝塔的答案。现在的问题是球的速度没有得到保持,因为它们都具有相同的速度和质量,但是在碰撞之后它们是不同的。我不认为这应该发生,或者是吗?

+0

此方法适用于动量中心框架。这是否清理了一些东西,还是我们应该多解释一下? – Beta 2012-03-01 02:06:32

+0

你介意解释一下吗?网上有这么多的例子使用这种方法,但它并不总是工作? – slartibartfast 2012-03-01 02:11:48

+0

这是一个长时间的解释。您是否熟悉改变参考框架的想法? – Beta 2012-03-01 02:28:30

回答

2

考虑从墙上弹起一个球的一维问题。简单。

现在看着我在飞行中的一架喷气式飞机的前舱壁上弹起一个球。球以252米/秒的速度向北移动,舱壁以250米/秒的速度向北移动。答案并不明显。但转入我的坐标系(通过减去舱壁的速度,250米/秒,从一切),问题是微不足道的。解决它,然后将结果移回地面框架(由添加 250米/秒的一切),你就完成了。

现在,球的二维问题以一定角度从墙上反弹。简单。 (但请确认你的代码是否正确。)

现在两个球与相等和相反的动量碰撞(我认为它们现在具有相同的质量)。你可以想象碰撞飞机上的黄色墙壁,答案很容易。

现在两个球碰撞,但与没有加起来的速度。仍然有一堵黄墙,但它正在移动。那么,通过从所有东西中减去球的速度(总和/ 2)的平均值,转移到墙的框架中,解决更简单的问题,然后通过将相同的速度添加回所有事情,然后完成。

+1

很好,谢谢。只有一个问题:如果两个球具有相同的速度,它们的速度也将在碰撞后相同,对吧? – slartibartfast 2012-03-01 06:26:48

+0

不一定。使用动量中心框架是一项很棒的技术,它可以帮助我们避免大量的神秘代数。除非你对这种技术感到满意,否则不要试图采取更进一步的捷径。 – Beta 2012-03-01 15:36:13

+0

但是我现在设置它的方式是它有一个方向单位矢量和一个速度变量,而我只在方向矢量上执行碰撞物理。这就是为什么它会很好,如果他们总是有相同的速度,所以方向矢量总是一个单位矢量... – slartibartfast 2012-03-01 18:27:17