【发布时间】: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.stackexchange.com