首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >物理学:确定碰撞后两个球体的速度

物理学:确定碰撞后两个球体的速度
EN

Stack Overflow用户
提问于 2011-04-04 04:43:40
回答 2查看 712关注 0票数 0

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

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

我试着将书中的例子转换成代码,并计算出第二个球体的行为线和normal- V2p和V2n应该发生什么。我的代码在某种程度上是可以工作的,但偶尔速度会突然加快并失控。很明显我的数学有问题。

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

代码语言:javascript
复制
    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);
EN

回答 2

Stack Overflow用户

发布于 2011-04-04 04:57:36

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-04 05:05:21

如果你对物理或数学了解不多,这是一个令人惊讶的难题。

你需要知道牛顿的运动定律。这些是一对微分方程,所以你需要知道如何解它们。

如果假设某些东西对您感兴趣的行为不重要,则问题会更容易解决:刚性球体与可变形球体、摩擦力和其他因素。

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

快速浏览一下您发布的代码就会发现,您所能期望的最好结果是您有一个正确但不是最优的实现。很可能你不能很好地理解物理和数学,不能自己解决它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5532379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档