Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование в широком смысле слова > Физика

Ответ
 
Опции темы
Старый 23.01.2016, 20:34   #1
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,569
Написано 407 полезных сообщений
(для 863 пользователей)
Упругое нецентральное столкновение шаров с разными массами

Булка, привет!

Уже который год(!) пытаюсь решить эту, вроде бы, примитивную задачу, но нифига не получается!

Грубо говоря, необходимо реализовать функцию
Function resolveCollision(b1:Ball, b2:Ball)
  /**
    (Ball::m) - Масса шарика
    (Ball::ax, Ball::ay) - скорость шарика
    (Ball::x, Ball::y) - Координаты шарика
  **/
End Function
Много гуглил - находил только либо древние учебники в которых настолько универсальные сухие формулы - без автора учебника и не разобраться, либо только формулы для центрального столкновения, либо для шариков одинаковых масс, либо ещё какой то бред в стиле неупругих соударений, а конкретных, чётких и ясных формул я не увидел.

Помогите хотя бы формулы найти, только на вас надеюсь
__________________
(Offline)
 
Ответить с цитированием
Старый 24.01.2016, 15:26   #2
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,423
Написано 3,449 полезных сообщений
(для 6,840 пользователей)
Ответ: Упругое нецентральное столкновение шаров с разными массами

Ну думаю можно и аналитически это дело решить.
Только тебе не хватает еще упругости шарика, т.к. от упругости зависит степень отскакивания.

Проверить на столкновение, легко:
collided = distance < (radiusA + radiusB );

Далее берем степень смещения:
overlap = distance - (radiusA + radiusB );

И угол смещения между шариками:
ballVector = normalize(posA - posB );

Теперь нам нужно узнать фактор массы относительно общему столкновению для каждого шарика:
massAFactor = massA / (massA + massB );
massBFactor = massB / (massA + massB );

И теперь можем решить коллизию:
posA += ballVector * massBFactor * overlap;
posB += -ballVector * massAFactor * overlap;

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

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

Вот хорошие доки по чтению: http://paulbourke.net/geometry/circlesphere/

Ну и в конце концов, никто не отменяет отличное наличие физ движков, которые это все для тебя уже решили, и юзать их и не заморачиваться - обычно вариант который позволит фокусироваться на игре, а не технологии.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 13:00.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com