Java 组合速度大于初始速度
我在用爪哇做台球游戏。我使用指南来解决冲突。在测试过程中,我注意到碰撞后两个碰撞的台球之间有更多的速度。额外速度的数量似乎是0%-50%。在直射时约为0%,在极宽射程时约为50%。我假设组合速度将保持不变。是我的代码还是我对物理的理解错了Java 组合速度大于初始速度,java,game-physics,physics,Java,Game Physics,Physics,我在用爪哇做台球游戏。我使用指南来解决冲突。在测试过程中,我注意到碰撞后两个碰撞的台球之间有更多的速度。额外速度的数量似乎是0%-50%。在直射时约为0%,在极宽射程时约为50%。我假设组合速度将保持不变。是我的代码还是我对物理的理解错了 private void solveCollision(PoolBall b1, PoolBall b2) { System.out.println(b1.getMagnitude() + b2.getMagnitude()); // ve
private void solveCollision(PoolBall b1, PoolBall b2) {
System.out.println(b1.getMagnitude() + b2.getMagnitude());
// vector tangent to collision point
float vTangX = b2.getY() - b1.getY();
float vTangY = -(b2.getX() - b1.getX());
// normalize tangent vector
float mag = (float) (Math.sqrt((vTangX * vTangX) + (vTangY * vTangY)));
vTangX /= mag;
vTangY /= mag;
// get new vector based on velocity of circle being collided with
float NVX1 = b1.getVector().get(0) - b2.getVector().get(0);
float NVY1 = b1.getVector().get(1) - b2.getVector().get(1);
// dot product
float dot = (NVX1 * vTangX) + (NVY1 * vTangY);
// adjust length of tangent vector
vTangX *= dot;
vTangY *= dot;
// velocity component perpendicular to tangent
float vPerpX = NVX1 - vTangX;
float vPerpY = NVY1 - vTangY;
// apply vector to pool balls
b1.setVector(b1.getVector().get(0) - vPerpX, b1.getVector().get(1) - vPerpY);
b2.setVector(b2.getVector().get(0) + vPerpX, b2.getVector().get(1) + vPerpY);
System.out.println(b1.getMagnitude() + b2.getMagnitude());
}
并不是所有的解释都是严格围绕这个主题的,我将假设最小的先见之明,以适应未来的潜在用户-不幸的是,一些人可能会因此觉得它迂腐
速度不是一个守恒量,因此碰撞前的速度之和不一定等于碰撞后的速度之和 这对于非弹性碰撞更为直观,特别是当你考虑一个场景,比如小行星撞击地球的月球时,一个典型的撞击速度是每秒10到20公里的量级。如果标量速度在这种情况下是守恒的——即使是在45°(最有可能的)的“宽”撞击角下——月球产生的速度将足以将其从地球轨道上弹射出去 很明显,对于非弹性碰撞,标量速度不一定守恒。弹性碰撞不那么直观 正如你所注意到的,这是因为在一个场景中,完美弹性碰撞中的标量速度是守恒的(直接碰撞),而非弹性碰撞永远不会守恒速度2。这造成了不可接受的不一致 要纠正这一点,我们必须将速度视为一个向量,而不是一个标量。考虑两个球之间最简单的弹性碰撞:静止的一个球,第二个球击中第一个“直”(冲击角为90°)。第二个球将静止,第一个球将以与第二个球的初始速度相等的速度离开碰撞。速度是守恒的——前后速度之和相等——一切都很好 但是,对于90°以外的碰撞角,情况并非如此,因为幅值和无法考虑抵消的矢量分量。例如,假设你有一个球再次静止,第二个球以45°击打它。然后,两个球将以与第二个球的初始移动方向3成45°的角度离开碰撞。然后,两个球也将具有与初始运动方向平行的相同速度分量,并且相等但相反垂直速度分量。取矢量和时,两个垂直分量将相消,两个平行分量的和将恢复初始速度矢量。但是,每个球产生的速度向量的大小将大于第二个球的初始速度的大小-因为大小是通过平方值的总和计算的,因此不考虑相反的分量 当然,最好的方法不是看速度,而是看动量——正是动量守恒决定了上述行为,就动量而言,解释非常简单:它规定在完全弹性碰撞中,质心的速度不得改变
1更大的一个——因为地球最近捕获了一颗行星 事实上,这是非弹性碰撞定义的一部分
3有关计算偏离角的更多背景信息,请参见。不要使用浮动。用双倍来代替。@FredK好的,但是为什么?两个球的组合速度不一定等于单个球的初始速度-唯一必须守恒的量是能量和动量。为了在高入射碰撞中保持动量守恒,两个球的动量向量的垂直分量必须相等且相反。这就产生了两个速度向量,它们的大小和可能大于碰撞前第一个球的速度大小。@WilliamMiller我使用了碰撞前后两个球的大小和,而不仅仅是一个球和两个球的大小和。我理解这一点,但在这两种情况下,相加的是大小而不是向量,这个量值不一定是守恒的。有关原因的详细解释,请参见我的答案