Столкновение игры в бильярд

Я решил написать для класса бильярдную игру. Все работает нормально, но я хотел бы улучшить реалистичность столкновений мячей.

Для каждого мяча у меня есть прямоугольник pygame, что означает центр мяча, диаметр и положение мяча в игре. А также вектор скорости (u_x, u_y).

На данный момент я проверяю столкновение с помощью colliderect, но могу изменить его, измеряя расстояние между центральными шарами.

Я читал об уравнениях сохранения импульса, но здесь не учитываются положения шара. Разве два мяча не то же самое, что лобовой удар, чем боковой.

Кто-нибудь может мне помочь в формуле для новых скоростей мяча после столкновения с учетом положения мяча в момент удара. Большое спасибо!


person CrazyHorse    schedule 27.02.2012    source источник
comment
@bart, спасибо, но я не понимаю dot и boundary_normal. Вам легко написать формулу Python по этой ссылке?   -  person CrazyHorse    schedule 27.02.2012
comment
dot относится к точечному произведению, а boundary_normal - нормальный вектор в точке удара.   -  person Bart    schedule 27.02.2012
comment
ой! отлично. Я знаю, как вычислить скалярное произведение, но как взять вектор нормали из моих данных? Спасибо за помощь, Барт.   -  person CrazyHorse    schedule 27.02.2012
comment
барт, классический круглый бильярдный шар. У вас есть центр (x, y) и диаметр (d) для обоих мячей.   -  person CrazyHorse    schedule 27.02.2012
comment
На самом деле, здесь раздел столкновений может вам помочь. -шаровое столкновение.   -  person Bart    schedule 27.02.2012


Ответы (1)


Модуль euclid поможет. Он содержит векторный класс, который имеет normal (), dot () и т.д. net / euclid.html (Вы можете скопировать модуль в папку своего проекта, не устанавливая его.)

Для формул проверьте: https://gamedev.stackexchange.com/a/7901/6776 или http://archive.ncsa.illinois.edu/Classes/MATH198/townsend/math.html#COLLISION

Примечание: чем сложнее становится ваша физика, тем больше вам нужно использовать физический движок, такой как [введите описание ссылки здесь] [pymunk] или ODE. Но это хороший опыт обучения.

person ninMonkey    schedule 15.04.2012