Несколько сталкивающихся шаров

Я написал алгоритм для разрешения столкновения двух шаров с сохранением импульса. В моих симуляциях он работает точно так, как ожидалось. Вот код:

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-функцию для работы с любым количеством шаров? я имею в виду с набором Н шаров с соединяющими поверхностями и начальными векторами скорости, каковы будут конечные скорости? Есть ли известное общее решение для этого?

Примечание:

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

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

Ответы (3)

Вам необходимо настроить систему К уравнения с К неизвестные импульсы, если они получены из Н мячи, тогда как только К из них сталкиваются в какое-то время.

Вот как это сделать:

  1. Создайте вектор (блок) со всеми векторами скорости в последовательности. Размер 2 Н × 1
    в "=" ( в 1 в 2 в Н ) "=" ( Икс ˙ 1 у ˙ 1 Икс ˙ 2 у ˙ 2 Икс ˙ Н у ˙ Н )
  2. Создайте (блочную) матрицу со всеми массами, но также 2 Н ряды

    М "=" [ м 1 0 0 0 0 0 0 м 1 0 0 0 0 0 0 м 2 0 0 0 0 0 0 м 2 0 0 0 0 0 0 м Н 0 0 0 0 0 0 м Н ]
    такой, что М в были бы все компоненты импульса.

  3. Вы ищете изменение скорости Δ в из-за всех импульсов от столкновений. Если бы вы знали сумму всех импульсов (опять же в 2 Н × 1 вектор), то вы запишете изменение скорости как

    Δ в "=" М 1

  4. Создать 2 Н × К блочная матрица контактной пары Z . Каждый столбец представляет контакт между двумя телами ( я Дж ) путем содержания вектора контактной нормали н ^ я Дж в Дж -th позиция блока и отрицательный вектор нормали н ^ я Дж в я -я позиция блока. Например:

    Z "=" [ н ^ 13 0 н ^ 14 0 н ^ 24 0 н ^ 13 0 0 0 н ^ 24 н ^ 14 ]
    представляет собой матрицу контактных пар, когда тела ( 1 3 , 2 3 и 1 4 ) сталкиваются. Стрелка указывает направление, на которое указывает вектор нормали, и, следовательно, направление, в котором применяется положительный импульс. Помните, что каждый контактный вектор нормали имеет две составляющие. н ^ "=" ( потому что ψ , грех ψ ) .

  5. Построить К × 1 вектор неизвестных величин импульсов для каждой контактной пары.

    Дж "=" ( Дж 13 Дж 24 Дж 14 )
    Теперь сумма всех импульсов вычисляется по формуле
    "=" Z Дж

  6. Рассчитайте относительную скорость каждой контактной пары ( К × 1 вектор) путем проецирования скоростей на нормаль контакта

    ты я м п "=" Z в

  7. Установите закон столкновения с точки зрения относительных скоростей до и после столкновения.

    Z ( в + Δ в ) "=" ϵ Z в
    где ϵ - коэффициент реституции. Перенесем известные в правую сторону и найдем изменение относительных скоростей на
    Z Δ в "=" ( 1 + ϵ ) Z в "=" ( 1 + ϵ ) ты я м п

  8. Соедините 3. 5. и 7., чтобы получилось

    Z ( М 1 ( Z Дж ) ) "=" ( 1 + ϵ ) ты я м п
    и найти неизвестные импульсы
    Дж "=" ( Z М 1 Z ) 1 ( 1 + ϵ ) ты я м п
    Обратите внимание, что Z М 1 Z это К × К матрица, требующая обращения.

  9. Когда все импульсы рассчитаны, каждый вектор скорости тела изменяется на

    Δ в "=" М 1 Z Дж

Пример

Представьте себе три сферы, столкнувшиеся одновременно:

рис

Используйте этот 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.

Можете ли вы решить это для системы из трех частиц? Этот анализ может быть правильным, но он не прозрачен.
Конечно! Я добавил пример с тремя сферами. Я использовал сценарий MATLAB для демонстрации алгоритма и проверки результатов.
Спасибо. Я думаю, у вас есть некоторые предположения. Либо столкновения мгновенные, либо шары идентичны... Я не уверен, какие условия необходимы, а какие достаточны. Это действительно отвечает на вопрос OP теперь, когда он сказал нам, что приблизительные решения в порядке. Но я не уверен, что это общее решение в случае, если шары деформируемы и у них разные механические свойства. Мне кажется, что один шарик может потерять контакт, а оставшаяся пара останется в контакте.
В вашем примере кажется, что скорости движущихся шаров направлены к центру неподвижного шара. Обрабатывает ли ваш алгоритм более общий случай, когда относительные скорости наклонны? Или это часть приближения, которое нужно упростить, сдвинув скорости к общей точке и предполагая, что контакты совершенно одновременны? Как и Гарып, мне не ясно, каково ваше рациональное мнение/какие предположения вы делаете. ...Что такое закон контактов ?
Для одномерного контакта закон контакта гласит
в р е л а т я в е а ф т е р "=" ϵ в р е л а т я в е б е ф о р е
@sammygerbil Да, алгоритм достаточно общий для любого начального условия. Я выбрал эти направления произвольно, но в большом векторе vкомпонентов вы можете использовать любые значения.v=[v1x,v1y,v2x,v2y,v3x,v3y,...,vnx,vny]
@garyp Да, существует неявное предположение о мгновенных столкновениях (проблема жесткого мяча). Практически необходимо остановить симуляцию, если есть перекрытие, и вернуться к решателю до первого момента удара, применить импульсы и затем продолжить симуляцию. Хотя в качестве приближения пользователь может сохранить временной шаг и отрегулировать как скорость, так и положение из-за контакта.
Возврат к 1-му удару, когда есть перекрытие, делает ваше решение таким же, как мое, не так ли? Затем симуляция последовательно переходит от одного столкновения двух тел к другому, поскольку в достаточно малом масштабе времени одновременных столкновений не бывает. ... Регулировка скорости и положения не требуется, не так ли? Должности будет недостаточно? Регулировка скорости может не сохранить KE, если ϵ "=" 1 .
@sammygerbil Теперь я это понимаю. Но в реальной жизни некоторые контакты «мягкие» (они происходят в течение более длительных периодов времени) из-за флюидных пленок можно утверждать, что несколько контактов происходят одновременно. Кроме того, как вы справляетесь со стопкой блоков под действием силы тяжести, которые не двигаются?
@sammygerbil Да и не на самом деле. Подумайте о ситуации с колыбелью Ньютона . Контакты ДЕЙСТВИТЕЛЬНО происходят одновременно, так как каждый импульс зависит от соседних ударов.
@ ja72 : И в Колыбель Ньютона, и в Башню блоков объекты были тщательно помещены в контакт и удерживались так под действием силы тяжести. Я имел в виду столкновения твердых тел в симуляции случайного движения, такой как бильярд. Если бы 2 или более бильярдных шара действительно соприкасались (например, при «разрыве»), удар битка можно было бы смоделировать, введя очень небольшое расстояние между каждым шаром, а затем рассчитав последовательность столкновений двух тел — это дает то же самое. результат как ваш алгоритм (я ожидаю). ...
@ ja72 : ... Да, настоящие тела мягкие или эластичные, что делает столкновения немгновенными, поэтому одновременные контакты более вероятны. ... Я не утверждаю, что мое решение лучшее, а только то, что оно точное и простое. Смотрите мой комментарий Андреасу внизу моего ответа, цитируя MyPhysicsLab.Com .
Привет, ребята, и спасибо за вашу помощь в этом! Я опробовал этот метод сейчас, и поначалу казалось, что он работает так же, как и мой предыдущий метод только с двумя мячами. Но, к сожалению, я начал вести себя немного странно в некоторых настройках. Например, с V-образной формой, где только нижний шар имеет вектор скорости прямо вверх. В этом случае два верхних шара остаются в контакте и движутся прямо вверх без какой-либо скорости вбок, что кажется немного странным. Хотя, возможно, я реализовал что-то не так. В любом случае, я продолжу исследовать это, но, похоже, я снова вернусь к одиночным ударам.
Другое дело, можно ли вместо этого использовать этот метод для вычисления ускорения тел при приложении сил? Например, когда стопка шаров оседает под действием силы тяжести, столкновения почти всегда будут одновременными? Я изучил решение myphysicslab с итеративным минимизацией расстояний до точек контакта, но мне немного отказали со сложностью O (n ^ 4). Возможно, для этого можно использовать метод ja72?
К вашему сведению: я сформулировал контактный случай в новом вопросе здесь: physics.stackexchange.com/questions/297829/…
@ ja72 ja72: с тех пор я ответил. Верен ли мой метод решения этой проблемы столкновения трех тел? речь идет об одновременном столкновении 3 шаров в 1D. Метод, используемый ОП, аналогичен вашему, но, проводя расчеты, я обнаружил, что результат зависит от порядка столкновений, если они не происходят одновременно. Это заставляет меня задаться вопросом, дает ли ваш метод реалистичные результаты, потому что реальные столкновения не одновременны, если рассматривать их в достаточно малом масштабе.

К сожалению, я должен согласиться с Джонатаном Уилером: других доступных формул нет, и ваш нынешний метод, вероятно, лучший даже для трех мячей.

В «Колыбели Ньютона» результат один и тот же независимо от того, соприкасаются шары или нет. Небольшой зазор между шариками дает тот же конечный результат. Это говорит о том, что ваш подход к разделению столкновения нескольких тел на последовательность парных столкновений даст правильный физический результат. На практике это почти всегда возможно, поскольку при увеличении разрешения, т. е. при уменьшении временного шага в моделировании, можно увидеть, что сначала происходит одно парное столкновение.

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

За исключением нескольких ситуаций, в которых есть некоторая симметрия, не существует (насколько мне известно) известной замкнутой формулы, дающей результат даже для столкновения трех тел, сравнимый с уравнениями для столкновения двух тел. Это связано с тем, что одновременное столкновение трех твердых тел является неопределенным , т. е. недостаточно ограничений для соответствия количеству переменных.

Как предполагает Гарип, включение упругой деформации и сил в модель создает больше ограничений, позволяя определить результат. Однако моделирование деформируемых тел усложняет программу, и из-за связи между силами результирующие уравнения, вероятно, потребуют численного решения путем итерации. Таким образом, возникает та же проблема увеличения времени вычислений.

Симметричные столкновения трех одинаковых шаров включают (i) коллинеарный случай и (ii) один шар, движущийся перпендикулярно двум другим, которые либо неподвижны, либо движутся с той же скоростью в том же или противоположном направлении по отношению к первому. Однако такие симметричные случаи будут крайне редки при моделировании молекулярного движения.

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


Полезные ссылки

Вопрос об упругих столкновениях и сохранении импульса/энергии.
Столкновение твердого тела, 3 соприкасающихся круга.
Расчет трехстороннего столкновения кругов.

Исследовательские статьи

Распространенная модель одновременного удара: существование, уникальность и конструктивные последствия.
Размышления об одновременном ударе.
Осуществление осмысленного воздействия: моделирование одновременных фрикционных столкновений в пространственных системах с несколькими телами.
Незаконченная колыбель Ньютона: эксперименты и модели столкновений для нормального столкновения трех твердых сфер ( доступ через paywall )
Задача отскока двух шаров
Диаграмма перехода состояний для одновременных столкновений с применением в бильярдной стрельбе
Свойства восстановления при прямом центральном столкновении трех неупругих сфер
Две интерпретации жесткости при столкновениях твердого тела ( список ResearchGate с цитатами )

Но существует множество физических движков и игр вроде бильярда с множеством одновременных столкновений. Как они это делают? Я более чем доволен приблизительным решением.
Боюсь, я не знаю, как они это делают. Вы можете посмотреть в Game Development SE , где они лучше поймут, что работает адекватно. Stack Overflow также должен быть полезен.
Но второе столкновение может начаться до того, как закончится первое. В этом случае задача неопределима без знания упругости шаров. Мне кажется, что вы можете представить себе идеализированную ситуацию, в которой столкновения 1.) последовательные и 2.) мгновенные. Но мне не кажется, что этот анализ можно использовать для предсказания реального столкновения. Кроме того, в моделировании вопрос о том, где именно и когда произойдет столкновение, будет зависеть от временного шага и метода, используемого для распространения движения шаров.
@garyp: я предполагаю, что столкновения с твердым телом происходят мгновенно. Тогда второе столкновение не может начаться до того, как закончится первое. Если временной шаг является переменным и временно сделан достаточно маленьким, как требуется, это может справиться с любыми трудностями, связанными с секвенированием. Когда сталкивающиеся шары находятся далеко друг от друга, временной шаг можно снова увеличить. С каждым кластером коллизий можно работать отдельно, при необходимости с разным временным разрешением. Если столкновения двух тел считаются достаточно точными для предсказания, этот метод будет столь же точным, потому что все столкновения являются столкновениями двух тел.
Зачем усложнять дело, чем оно есть. Решение исходит из применения закона столкновений, применяемого к каждой контактной паре одновременно. В результате получается система уравнений. Смотрите мой ответ.
@ ja72: Я следую более раннему обоснованию того, что никакие столкновения твердых тел никогда не бывают абсолютно одновременными. Поскольку каждый из них мгновенный, они всегда происходят последовательно, если вы смотрите на достаточно малые временные рамки. Это может потребовать больших вычислительных ресурсов, но я думаю, что это просто для программирования (поскольку оно рассматривает все столкновения как два тела, поэтому всегда применяется один и тот же код) и точно. Я очень плохо разбираюсь в матричной алгебре, поэтому я не могу хорошо понять ваше решение, хотя оно выглядит впечатляюще. Объяснение вашего обоснования было бы полезно (для меня, по крайней мере).
Здесь мы все еще проводим симуляцию, и симуляция будет иметь несколько «одновременных» столкновений на каждом временном шаге, независимо от того, насколько мал временной шаг. Вещь башни из ящиков сложены. В каждый момент есть импульсы, разделенные между всеми ящиками.
@sammygerbil Обоснование состоит в том, что для каждой контактной пары обмен импульсами будет таким, что конечная относительная скорость представляет собой отрицательную долю начальной относительной скорости. Это просто выражается в виде системы уравнений с использованием линейной алгебры.
@AndreasZita: В ответ на ваш первый комментарий сайт myPhysicsLab.com заявляет: «Итог: хотя не существует ни одного идеального решения, для большинства целей метод последовательной обработки коллизий работает довольно хорошо».

Это только частичный ответ, но, надеюсь, он поможет.

Есть два принципа, которые вам нужно помнить, когда вы решаете для движения. Сохранение энергии и сохранение импульса . А именно,

( м 1 в 1 2 + м 2 в 2 2 + м 3 в 3 2 ) до "=" ( м 1 в 1 2 + м 2 в 2 2 + м 3 в 3 2 ) после

( м 1 в 1 + м 2 в 2 + м 3 в 3 ) до "=" ( м 1 в 1 + м 2 в 2 + м 3 в 3 ) после

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