Физика игры. Соударение шаров

233
13 апреля 2017, 18:43

Задача - сделать на canvas шарики, чтобы они бесконечно двигались, бились друг об друга. Я это сделал, но это не вполне реалистично. А именно: шарик может ударить другой вскользь, но отлетит в сторону, как будто ударился о стену, тогда как в реальности он бы так и полетел в том же направлении, незначительно увеличив свою скорость по другой оси. Формула не учитывает этого. Так полагаю нужен угол столкновения, тригонометрия. Вот она:

vSrt1x = circle.vector.x;
vSrt2x = nearbyCircle[i].vector.x;
vSrt1y = circle.vector.y;
vSrt2y = nearbyCircle[i].vector.y;
m1 = circle.mass;
m2 = nearbyCircle[i].mass;
vEnd1x = vSrt1x/(m1+m2)*(m1-m2)+vSrt2x/(m1+m2)*(2*m2);
vEnd2x = vSrt1x/(m1+m2)*(2*m1)+vSrt2x/(m1+m2)*(m2-m1);
vEnd1y = vSrt1y/(m1+m2)*(m1-m2)+vSrt2y/(m1+m2)*(2*m2);
vEnd2y = vSrt1y/(m1+m2)*(2*m1)+vSrt2y/(m1+m2)*(m2-m1);

Здесь vSrt1x - это скорость начальная первого шара по х, остальные соответственно.

vEnd1x - соответственно конечная скорость после удара, содержит формулу в соответствии с законами сохранения импульса и сохранения энергии.
Но как переделать формулу, чтобы она зависела от угла падения.
Последнее, что я пробовал - это такая формула:

circle.vector.y = vEnd1x * cos(2*a), 
circle.vector.x = vEnd1y * -sin(2*a)

Где a - угол падения

Под углом падения имеется ввиду... угол соприконовения шаров, что ли. Как программа его находит:

Вычитаем из координаты первого шара, координату второго шара, все по х - получаем катет. Затем делим это на расстояние между центрами (оно находится по теореме пифагора) и полученное значение обрабатываем арксинусом и умножаем на 180/ПИ (переводим в радианы).

Собственно она не сработала. Шарики замедляются, т.е. теряют свою кинетическую энергию, а этого быть не должно.
Кто знает, подскажите! Буду очень благодарен!

READ ALSO
Как реализовать метод split() (аналог String.split) для класса Uint8Array?

Как реализовать метод split() (аналог String.split) для класса Uint8Array?

У меня есть массив Uint8Array с бинарными данными в формате

169
Найти каналы rgb из цвета HEX формата

Найти каналы rgb из цвета HEX формата

Банальнейший вопрос, но я пока не знаю ответа

170
Steam: обход мобильного подтверждения (escrow)

Steam: обход мобильного подтверждения (escrow)

Здравствуйте, помогите пожалуйста реализовать правильный гет запрос для мобильного подтверждения трейда в стимеЮзаю steam-totp для генерации...

412
Javascript, цепочка вызовов, как реализовать ответ в колбеке?

Javascript, цепочка вызовов, как реализовать ответ в колбеке?

Добрый день дамы и господаПишу для себя модуль на node js, не могу реализовать функцию save()

260