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

Math 物理:确定碰撞后两个球体的速度,math,physics,collision,Math,Physics,Collision,我正在使用开发一个简单的基于物理的游戏 我需要计算弹性碰撞后两个球体的速度。书中第6章的例子假设第二个球体是静止的,因此一些方程被简化为0。当两个身体都在运动时,我需要数学 我试着将书中的示例转换为代码,并弄清楚第二个球体的作用线和法线(V2p和V2n)应该发生什么。我的代码可以正常工作,但偶尔速度会突然加快并失控。很明显我的数学有问题 这是我用的。代码是用Java编写的,“s1”和“s2”是球体 double e = 1d; // distance of sphere cen

我正在使用开发一个简单的基于物理的游戏

我需要计算弹性碰撞后两个球体的速度。书中第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.atan(y/x)
。您需要处理一些特殊情况,通常需要使用
Math.atan2(y,x)


请参阅和文档。

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


请参阅和文档。

如果你对物理或数学知之甚少,这是一个令人惊讶的难题

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

如果你认为某些事情对你感兴趣的行为不重要,那么问题就容易了:刚性球体与可变形球体、摩擦力和其他因素

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

快速浏览一下您发布的代码就可以看出,您所能期望的最好结果是您有一个正确但不太理想的实现。很可能你没有很好地理解物理和数学,无法独自解决它


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

如果你对物理或数学知之甚少,这是一个令人惊讶的难题

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

如果你认为某些事情对你感兴趣的行为不重要,那么问题就容易了:刚性球体与可变形球体、摩擦力和其他因素

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

快速浏览一下您发布的代码就可以看出,您所能期望的最好结果是您有一个正确但不太理想的实现。很可能你没有很好地理解物理和数学,无法独自解决它


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

也许你在这里会有更多的运气:也许你在这里会有更多的运气:是的,你说对了。我上一次使用这种数学+物理是在大约18年前这本书让我达到了80%的目标。我也尝试过使用AndEngine(该应用程序将在Android上运行),但1)在计算如何使用通用物理引擎时,需要相当大的认知负荷(例如,我不打算使用OpenGL),2)它们与Box2D集成的方式似乎有点黑客化。顺便说一句,没有对安德林人的不尊重——我知道他们有很好的理由这样做,但这与我目前的目标并不吻合。虽然我还没有完全排除这种可能性,但我想看看我是否可以先简单地做一些事情。让台球这样的“简单”问题变得困难的是,在碰撞点,你需要转换到一个坐标系,这个坐标系在球的中心之间有一个单位向量,其他两个单位向量与其正交。计算该坐标系中的速度分量,然后将它们转换回(x,y,z)坐标系,这是您所知道和喜爱的坐标系。所以,如果你使用向量和适当的变换来计算每个分量,你的公式将会得到帮助。这不是小事,是的,你说的。我上一次使用这种数学+物理是在大约18年前这本书让我达到了80%的目标。我也尝试过使用AndEngine(该应用程序将在Android上运行),但1)在计算如何使用通用物理引擎时,需要相当大的认知负荷(例如,我不打算使用OpenGL),2)它们与Box2D集成的方式似乎有点黑客化。顺便说一句,没有对安德林人的不尊重——我知道他们有很好的理由这样做,但这与我目前的目标并不吻合。虽然我还没有完全排除这种可能性,但我想看看我是否可以先简单地做一些事情。让台球这样的“简单”问题变得困难的是,在碰撞点,你需要转换到一个坐标系,这个坐标系在球的中心之间有一个单位向量,其他两个单位向量与其正交。计算该坐标系中的速度分量,然后将它们转换回(x,y,z)坐标系,这是您所知道和喜爱的坐标系。所以,如果你使用向量和适当的变换来计算每个分量,你的公式将会得到帮助。这不是小事。