Я написал алгоритм для разрешения столкновения двух шаров с сохранением импульса. В моих симуляциях он работает точно так, как ожидалось. Вот код:
public void Resolve()
{
var r = 0.5; // coefficient of restitution
var m = Ball1.Mass + Ball2.Mass;
var ua = Ball1.Velocity.Magnitude * Math.Cos(Ball1.Velocity.Angle(Normal));
var ub = Ball2.Velocity.Magnitude * Math.Cos(Ball2.Velocity.Angle(Normal));
var va = (r * Ball2.Mass * (ub - ua) + Ball1.Mass * ua + Ball2.Mass * ub) / m;
var vb = (r * Ball1.Mass * (ua - ub) + Ball1.Mass * ua + Ball2.Mass * ub) / m;
Ball1.Velocity -= Normal * (ua - va);
Ball2.Velocity -= Normal * (ub - vb);
}
Теперь я также хочу, чтобы эта работа работала для более чем двух шаров, сталкивающихся в один и тот же момент. Моя первоначальная мысль заключалась в том, что я мог бы просто решить это уравнение несколько раз для каждого контакта между шарами. Когда у меня есть ситуация, подобная «колыбели Ньютона», где шары соприкасаются «последовательно», легко просто решить каждое столкновение за раз и, не перемещая шары, просто идти вперед и вычислять следующее и следующее и т. д. до тех пор, пока не достигнете последнего шара, в котором вся энергия не будет потеряна по пути. Это тоже хорошо работает, хотя и не очень быстро.
Но как насчет, например, случая, когда три шара соприкасаются в форме буквы V, а нижний шар имеет скорость (в данном случае вверх)? Я имею в виду, как теперь распределить энергию между двумя другими шарами? Уравнение, которое у меня есть, работает только для двух мячей, и теперь я не вижу, как я могу вычислить его итеративно. Можете ли вы помочь мне понять, как я должен думать об этом? Могу ли я модифицировать свою Resolve-функцию для работы с любым количеством шаров? я имею в виду с набором шаров с соединяющими поверхностями и начальными векторами скорости, каковы будут конечные скорости? Есть ли известное общее решение для этого?
Примечание:
Я попробовал метод, который в настоящее время отмечен как ответ, но, к сожалению, в некоторых настройках получил немного странные результаты. Имейте в виду. Я, вероятно, снова вернусь к разрешению одного столкновения за раз. Я обновлю эту информацию, когда попробую больше.
Вам необходимо настроить систему уравнения с неизвестные импульсы, если они получены из мячи, тогда как только из них сталкиваются в какое-то время.
Вот как это сделать:
Создайте (блочную) матрицу со всеми массами, но также ряды
Вы ищете изменение скорости из-за всех импульсов от столкновений. Если бы вы знали сумму всех импульсов (опять же в вектор), то вы запишете изменение скорости как
Создать блочная матрица контактной пары . Каждый столбец представляет контакт между двумя телами ( ) путем содержания вектора контактной нормали в -th позиция блока и отрицательный вектор нормали в -я позиция блока. Например:
Построить вектор неизвестных величин импульсов для каждой контактной пары.
Рассчитайте относительную скорость каждой контактной пары ( вектор) путем проецирования скоростей на нормаль контакта
Установите закон столкновения с точки зрения относительных скоростей до и после столкновения.
Соедините 3. 5. и 7., чтобы получилось
Когда все импульсы рассчитаны, каждый вектор скорости тела изменяется на
Пример
Представьте себе три сферы, столкнувшиеся одновременно:
Используйте этот MATLAB
скрипт, чтобы найти их окончательные скорости:
%% Example triple impact (with 3D vectors)
% Three spheres impact at the same time. See Figure for their
% masses, positions and velocities before impact
% define unit vectors
o_ = [0;0;0];
i_ = [1;0;0];
j_ = [0;1;0];
k_ = [0;0;1];
R = 20;
r_1 = R*i_
r_2 = -R*i_
r_3 = R*tand(60)*j_
% Three possible contacts: 1*2, 2*3, 1*3
n_12 = (r_2-r_1)/norm(r_2-r_1)
n_23 = (r_3-r_2)/norm(r_3-r_2)
n_13 = (r_3-r_1)/norm(r_3-r_1)
% velocity vectors before impact
v_1 = o_;
v_2 = -1.0*n_12
v_3 = -2.0*n_13
v = [v_1;v_2;v_3]
% mass matrix
M = blkdiag(5.0*eye(3),4.0*eye(3),3.0*eye(3))
% contact pair matrix
Z = [-n_12, o_, -n_13; n_12, -n_23, o_; o_, n_23, n_13]
% Z =
%
% 1.0000 0 0.5000
% 0 0 -0.8660
% 0 0 0
% -1.0000 -0.5000 0
% 0 -0.8660 0
% 0 0 0
% 0 0.5000 -0.5000
% 0 0.8660 0.8660
% 0 0 0
% coefficient of restitution
eps = 0.5
% impact speeds
u_imp = Z.'*v
% impulses
J = -(1+eps)*inv(Z.'*inv(M)*Z)*u_imp
% J =
%
% 1.7021
% 2.1702
% 4.6277
% velocity vector change
Dv = inv(M)*Z*J
% final velocity
v_final = v+Dv
% v_final =
%
% 0.8032
% -0.8015
% 0
% 0.3032
% -0.4699
% 0
% 0.5904
% 0.2303
% 0
% check for error
actual = Z.'*(v+Dv); %(relative speeds after impact) =
expected = -eps * u_imp; % -eps*(relative speeds before impact)
err = actual-expected
% err =
%
% 1.0e-015 *
%
% -0.1110
% -0.6661
% -0.6661
В последней части я проверяю результаты на закон контактов и получаю ошибку ~1e-15
.
v
компонентов вы можете использовать любые значения.v=[v1x,v1y,v2x,v2y,v3x,v3y,...,vnx,vny]
К сожалению, я должен согласиться с Джонатаном Уилером: других доступных формул нет, и ваш нынешний метод, вероятно, лучший даже для трех мячей.
В «Колыбели Ньютона» результат один и тот же независимо от того, соприкасаются шары или нет. Небольшой зазор между шариками дает тот же конечный результат. Это говорит о том, что ваш подход к разделению столкновения нескольких тел на последовательность парных столкновений даст правильный физический результат. На практике это почти всегда возможно, поскольку при увеличении разрешения, т. е. при уменьшении временного шага в моделировании, можно увидеть, что сначала происходит одно парное столкновение.
Недостатком, как вы заметили, является то, что эта процедура может потребовать чрезмерных вычислений, потому что может быть много повторных столкновений между одной и той же парой тел. Если симуляция отображается в реальном времени, вся симуляция может заметно замедляться всякий раз, когда происходит такое столкновение. Отсюда потребность в методе определения результата без стольких итераций.
За исключением нескольких ситуаций, в которых есть некоторая симметрия, не существует (насколько мне известно) известной замкнутой формулы, дающей результат даже для столкновения трех тел, сравнимый с уравнениями для столкновения двух тел. Это связано с тем, что одновременное столкновение трех твердых тел является неопределенным , т. е. недостаточно ограничений для соответствия количеству переменных.
Как предполагает Гарип, включение упругой деформации и сил в модель создает больше ограничений, позволяя определить результат. Однако моделирование деформируемых тел усложняет программу, и из-за связи между силами результирующие уравнения, вероятно, потребуют численного решения путем итерации. Таким образом, возникает та же проблема увеличения времени вычислений.
Симметричные столкновения трех одинаковых шаров включают (i) коллинеарный случай и (ii) один шар, движущийся перпендикулярно двум другим, которые либо неподвижны, либо движутся с той же скоростью в том же или противоположном направлении по отношению к первому. Однако такие симметричные случаи будут крайне редки при моделировании молекулярного движения.
Вывод: если вы хотите, чтобы ваша симуляция была точным описанием реального столкновения трех тел, ваш текущий метод (решение последовательных парных столкновений с достаточным временным разрешением), вероятно, является наиболее эффективным из доступных. Тот же метод обрабатывает все столкновения с несколькими мячами.
Полезные ссылки
Вопрос об упругих столкновениях и сохранении импульса/энергии.
Столкновение твердого тела, 3 соприкасающихся круга.
Расчет трехстороннего столкновения кругов.
Исследовательские статьи
Распространенная модель одновременного удара: существование, уникальность и конструктивные последствия.
Размышления об одновременном ударе.
Осуществление осмысленного воздействия: моделирование одновременных фрикционных столкновений в пространственных системах с несколькими телами.
Незаконченная колыбель Ньютона: эксперименты и модели столкновений для нормального столкновения трех твердых сфер ( доступ через paywall )
Задача отскока двух шаров
Диаграмма перехода состояний для одновременных столкновений с применением в бильярдной стрельбе
Свойства восстановления при прямом центральном столкновении трех неупругих сфер
Две интерпретации жесткости при столкновениях твердого тела ( список ResearchGate с цитатами )
Это только частичный ответ, но, надеюсь, он поможет.
Есть два принципа, которые вам нужно помнить, когда вы решаете для движения. Сохранение энергии и сохранение импульса . А именно,
В общем, задачу «трех тел» довольно сложно решить, и если вы можете, вам лучше смоделировать столкновение трех шаров в трех парах столкновений. Я не думаю, что решение приведенных выше уравнений сохранения приведет к каким-либо элегантным формам, когда .
Гарип
Сэмми Песчанка