физика: определить скорости двух сфер после столкновения - PullRequest
0 голосов
/ 04 апреля 2011

Я использую Физика для программистов игр , чтобы разработать простую физическую игру.

Мне нужно вычислить результирующие скорости для двух сфер после упругого столкновения.В примере книги для этого в главе 6 предполагается, что 2-я сфера неподвижна, и поэтому некоторые уравнения упрощены до 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);

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Это может быть Math.atan(y/x).Вам нужно разобраться с некоторыми особыми случаями, и вместо этого вы обычно хотите использовать Math.atan2(y,x).

См. Math.atan () и Math.atan2 () Docs.

1 голос
/ 04 апреля 2011

Это удивительно сложная проблема, если вы мало знаете о физике или математике.

Вам нужно знать о законах движения Ньютона. Это пара дифференциальных уравнений, поэтому вам нужно знать, как их решить.

Проблема становится проще, если вы предполагаете, что определенные вещи не важны для интересующего вас поведения: жесткие и деформируемые сферы, трение и другие факторы.

Ответ во многом зависит от того, что вы хотели бы сделать.

Быстрый взгляд на размещенный вами код показывает, что лучшее, на что вы можете надеяться, это то, что у вас правильная, но не оптимальная реализация. Вероятно, вы не в состоянии понять физику и математику достаточно хорошо, чтобы решить ее самостоятельно.

Я бы запустил Google для физического движка на выбранном вами языке и использовал бы идеализацию, которую уже закодировал кто-то другой.

...