我正在使用Physics for Games Programmers开发一个简单的基于物理的游戏。
我需要计算弹性碰撞后两个球体的速度。第6章中的书中的例子假设第二个球体是静止的,因此一些方程被简化为0。当两个身体都在运动时,我需要数学运算。
我试着将书中的例子转换成代码,并计算出第二个球体的行为线和normal- 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);发布于 2011-04-04 04:57:36
可能是Math.atan(y/x)的问题。您需要处理一些特殊情况,并且通常希望使用Math.atan2(y,x)。
请参阅Math.atan()和Math.atan2()文档。
发布于 2011-04-04 05:05:21
如果你对物理或数学了解不多,这是一个令人惊讶的难题。
你需要知道牛顿的运动定律。这些是一对微分方程,所以你需要知道如何解它们。
如果假设某些东西对您感兴趣的行为不重要,则问题会更容易解决:刚性球体与可变形球体、摩擦力和其他因素。
答案很大程度上取决于你想做什么。
快速浏览一下您发布的代码就会发现,您所能期望的最好结果是您有一个正确但不是最优的实现。很可能你不能很好地理解物理和数学,不能自己解决它。
我会在谷歌上搜索你选择的语言的物理引擎,并使用其他人已经编写的理想化。
https://stackoverflow.com/questions/5532379
复制相似问题