我正在使用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);
答案 0 :(得分:2)
可能是Math.atan(y/x)
。您需要处理一些特殊情况,而您通常希望使用Math.atan2(y,x)
。
请参阅Math.atan()和Math.atan2()文档。
答案 1 :(得分:1)
如果你对物理或数学知之甚少,这是一个令人惊讶的难题。
你需要了解牛顿的运动定律。这些是几个微分方程,所以你需要知道如何解决它们。
如果你认为某些事情对你感兴趣的行为不重要,问题会更容易:刚性与可变形的球体,摩擦和其他因素。
答案很大程度上取决于你想做什么。
快速浏览一下您发布的代码表明,您可以期望的最佳方案是您拥有正确但不是最佳的实施方案。很可能你不能很好地理解物理和数学来自己解决它。
我使用您选择的语言为Google提供物理引擎,并使用其他人已经编码的理想化。