组合速度大于初速度

and*_*ett 5 java physics game-physics

我正在用 Java 制作台球游戏。我使用指南来解决冲突。在测试过程中,我注意到碰撞后两个碰撞池球之间的速度更大。额外速度的数量似乎是 0%-50%。直射约 0%,极宽射约 50%。我假设组合速度将保持不变。是我的代码还是我对物理的理解是错误的?

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

}
Run Code Online (Sandbox Code Playgroud)

Wil*_*ler 4

并非所有这些解释都将严格围绕主题,并且我将假设最少的先见之明以适应未来潜在的用户 - 不幸的是,有些人可能会因此觉得它迂腐。


速度不是守恒量,因此碰撞前的速度幅值和不一定等于碰撞后的速度幅值和。

这对于非弹性碰撞来说更为直观,特别是当您考虑小行星与月球1相撞等场景时,典型的碰撞速度约为每秒10 - 20公里。如果在这种情况下标量速度守恒,即使在 45°(最有可能)的“宽”撞击角下,月球的最终速度也足以将其从地球轨道上弹出。

显然,对于非弹性碰撞,标量速度不一定守恒。弹性碰撞不太直观。

正如您所指出的,这是因为在一种情况下,完美弹性碰撞中的标量速度是守恒的(直接碰撞),而非弹性碰撞永远不会守恒速度2。这造成了不可接受的不一致。

为了纠正这个问题,我们必须将速度视为向量而不是标量。考虑两个球之间最简单的弹性碰撞:一个球处于静止状态,第二个球“直接”撞击第一个球(冲击角为 90°)。第二个球将静止,第一个球将以等于第二个球的初始速度的速度离开碰撞。速度是守恒的——前后速度的大小和相等——一切都很好。

然而,对于 90° 以外的撞击角度,情况并非如此,因为幅度总和无法考虑抵消 的矢量分量。举例来说,您有一个球再次静止,而第二个球以 45° 击球。然后,两个球将以与第二个球的初始行进方向3成 45° 的角度离开碰撞。然后,两个球还将具有平行于初始运动方向的相同速度分量,以及相等但相反的垂直速度分量。当您求矢量和时,两个垂直分量将抵消,两个平行分量之和将恢复初始速度矢量。然而,每个球的最终速度矢量的大小将大于第二个球的初始速度的大小 - 因为该大小是通过平方值的总和计算的,因此不考虑相反的分量。

当然,最好的方法不是看速度,而是看动量 - 动量守恒控制着上述行为,就动量而言,解释非常简单:它规定在完全弹性碰撞中,速度质心不得改变。


1更大的一颗——因为地球最近捕获了第二颗真正的卫星

2事实上,这是非弹性碰撞定义的一部分。

3有关计算出发角的更多背景信息,请参见此处