【问题标题】:physics: determine velocities of 2 spheres after collision物理学:确定碰撞后 2 个球体的速度
【发布时间】:2011-04-04 05:05:20
【问题描述】:

我正在使用Physics for Games Programmers 开发一个简单的基于物理的游戏。

我需要计算弹性碰撞后两个球体的最终速度。第 6 章中的书本示例假设第二个球体是静止的,因此一些方程被简化为 0。当两个物体都在运动时,我需要进行数学运算。

我尝试将书中的示例转换为代码,并弄清楚第二个球体的作用线和正常的 V2p 和 V2n 应该发生什么。我的代码有点工作,但偶尔速度会突然加快并失去控制。显然我的数学有问题。

这是我正在使用的。代码在 Java 中,“s1”和“s2”是球体。

    double e = 1d;

    // distance of sphere centers
    double dX = s2.getCenterX() - s1.getCenterX();
    double dY = s2.getCenterY() - s1.getCenterY();

    double tangent = dY / dX;
    double angle = Math.atan(tangent);

    // v1 line of action
    double v1p = s1.getVelocityX() * Math.cos(angle) + s1.getVelocityY() * Math.sin(angle);

    // v1 normal
    double v1n = -s1.getVelocityX() * Math.sin(angle) + s1.getVelocityY() * Math.cos(angle);

    // v2 line of action
    double v2p = s2.getVelocityX() * Math.cos(angle) + s2.getVelocityY() * Math.sin(angle);

    // v2 normal
    double v2n = -s2.getVelocityX() * Math.sin(angle) + s2.getVelocityY() * Math.cos(angle);


    double v1massScale = (s1.getMass() - (e * s2.getMass())) / (s1.getMass() + s2.getMass());
    double v2massScale = ((1 + e) * s1.getMass()) / (s1.getMass() + s2.getMass());

    // compute post-collision velocities
    double v1pPrime = v1massScale * v1p + v2massScale * v2p;
    double v2pPrime = v2massScale * v1p + v1massScale * v2p;

    // rotate back to normal
    double v1xPrime = v1pPrime * Math.cos(angle) - v1n * Math.sin(angle);
    double v1yPrime = v1pPrime * Math.sin(angle) + v1n * Math.cos(angle);

    double v2xPrime = v2pPrime * Math.cos(angle) - v2n * Math.sin(angle);
    double v2yPrime = v2pPrime * Math.sin(angle) + v2n * Math.cos(angle);

【问题讨论】:

标签: math physics collision


【解决方案1】:

可能是Math.atan(y/x)。您需要处理一些特殊情况,通常希望使用Math.atan2(y,x)

请参阅 Math.atan()Math.atan2() 文档。

【讨论】:

    【解决方案2】:

    如果您对物理或数学知之甚少,这是一个非常困难的问题。

    您需要了解牛顿运动定律。这些是偶微分方程,因此您需要知道如何求解。

    如果您假设某些事情对于您感兴趣的行为并不重要:刚性与可变形球体、摩擦力和其他因素,问题就会变得更容易。

    答案很大程度上取决于您想做什么。

    快速浏览一下您发布的代码,您可以看到最好的结果是您有一个正确但不是最佳的实现。您可能无法充分理解物理和数学,无法自行解决。

    我会用你选择的语言在 Google 上搜索物理引擎,并使用其他人已经编码的理想化。

    【讨论】:

    • 是的,你说过。上次我使用这种数学+物理是大约 18 年前。 :-) 这本书让我走了大约 80% 的路。我也尝试使用 AndEngine(该应用程序将在 Android 上运行),但 1)在弄清楚如何使用通用物理引擎(例如,我不打算使用 OpenGL)和 2)看起来有相当大的认知负担他们与 Box2D 集成的方式有些骇人听闻。
    • 顺便说一句,并没有对 AndEngine 人员的不尊重——我知道他们有充分的理由按照自己的方式做事,但这与我目前的目标并不相符。虽然我还没有完全排除,但我想看看我是否可以先简单地做一些事情。
    • 让像台球这样的“简单”问题变得困难的是,在撞击点,您需要转换到一个坐标系,该坐标系在球的中心和另外两个中心之间具有一个单位向量与其正交。您计算该坐标系中的速度分量,然后将它们转换回您知道和喜爱的 (x, y, z) 坐标。因此,如果您使用向量和适当的变换来计算每个分量,您的公式将会有所帮助。这不是微不足道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2015-02-10
    • 2016-05-14
    • 2013-12-24
    • 2015-10-31
    • 2017-08-15
    相关资源
    最近更新 更多