7

Я вычисляю результат встречными парами 2D выпуклых объектов (без вращения), используя the basic equations on wikipedia. Однако, когда существует зависимость, как два объекта, поражающих другой объект одновременно:Как обрабатывать несколько одновременных упругих столкновений?

enter image description here

Такие, как здесь, с объектами 1 и 2 удара 3 в то же самое время, подход парной терпит неудачу , В зависимости от порядка я вычисляю столкновений (сначала 1-3 или 2-3), я получаю разные результаты. Повторная итерация через столкновение будет по-прежнему давать зависящие от порядка результаты.

У меня уже есть настройка, поэтому я могу выяснить, какие объекты находятся в контакте друг с другом, поэтому мой код будет знать при вычислении одной из этих пар, что объект 3 сталкивается с другим объектом в этот момент (так что 1- 3 столкновения будут знать о 2-3 столкновениях и наоборот). Я буду знать, какие грани/углы находятся в контакте с чем.

Какое бы решение должно быть прочным ... Например, если установка производится более сложным, как эти 2 примера:

enter image description here

Процесс должен быть в состоянии справиться с этим и хуже. Любая возможная цепочка одновременных контактов/столкновений. У меня будут все данные, которые они описывают, поэтому я «только» должен знать, как разрешить общий случай этих систем. В настоящее время я ничего не делаю с поворотом, что упрощает ситуацию.

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

Я видел a similar question, который был задан раньше, но ответ не был проверен (тупик?). Я не уверен, как распространение шока разрешит мой первый пример, так как C отходит после первого столкновения ... так какой шок должен распространяться? edit: Хорошо, теперь я вижу, что одновременные столкновения и распространение звука - две разные идеи, поэтому это не показалось полезным.

+0

На самом деле есть ответ на вопрос, на который вы ссылаетесь, и это может быть то, что вы ищете. –

+0

@AlexSzatmary Я не уверен, как этот подход применим к моему первому примеру. Как только произойдет одно столкновение, C будет отходить ... Нет никакого потрясения для распространения при работе со вторым столкновением. – user173342

ответ

4

Этот вид dynamic simulation of multi-contact physics дает начало linear complementarity problem. Существуют алгоритмы для решения this kind of problem; математика связана с тем, что используется для задач линейного программирования.

Потребность в решении такого рода проблем более распространена, чем вы думаете. Любое смутно реалистичное моделирование (т. Е. С гравитационными, наземными и неупругими столкновениями) скоро закончится тем, что объекты опираются друг на друга; точная и надежная обработка перехода от динамических столкновений в пространстве, к скользящим и подвижным объектам, к «блочно-штабелирующим» конфигурациям может быть технически сложной задачей.

Я рекомендую найти books or other resources по этому вопросу. Именно то, что вам действительно нужно, зависит от вашего конкретного приложения, но вы можете найти некоторые библиотеки, которые помогут.

1

В зависимости от заказа я вычисляю столкновений (сначала 1-3 или 2-3), я получаю разные результаты.

Это правильно. Это связано с тем, как работает физика столкновений. Рассмотрим этот простой пример, используя свой первый рисунок:

m_1 = m_2 = m_3 
u_1 = u_2 
u_3 = 0 
x_1 = x_2 + d 

Единственное различие между 1 и 2 в том, что 1 находится ближе к 3 на й. 1 ударяет 3, останавливается и v_3 становится u_1 (u является начальным, а v - конечной скоростью). Поскольку u_2 и новый v_3 одинаковы, оба объекта 2 и 3 будут двигаться вправо с постоянной скоростью с постоянным расстоянием d между ними; они никогда не коснутся. Если 1 и 2 меняются местами, то есть, если x_2 = x_1 + d, то 2 достигает 3 и останавливается, а 1 трассы после 3 на d.

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

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

Если действительно важно правильно разрешить несколько упругих столкновений, математика для этого может быть разработана, но вам нужно будет добавить дополнительные предположения. Упругое столкновение двух тел дается сохранения импульса:

m_1 u_1 + m_2 u_2 = m_1 v_1 + m_2 v_2 

и сохранения энергии:

(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2 

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

m_1 u_1 + m_2 u_2 + m_3 u_3 = m_1 v_1 + m_2 v_2 + m_3 v_3 
(1/2) * m_1 u_1^2 + (1/2) * m_2 u_2^2 + (1/2) * m_3 u_3^2 = (1/2) * m_1 v_1^2 + (1/2) * m_2 v_2^2 + (1/2) * m_3 u_3^2 

третьего независимое уравнение должно быть введено. Простое ограничение может быть, что импульс передача объектов 1 и 2 должны быть пропорциональны их массам:

m_1^2 (v_1 - u_1) = m_2^2 (v_2 - u_2) 

Это было бы хорошо для ситуации, изображенной на рисунке 1: интуитивно, я ожидал бы 1 и 2, чтобы иметь та же конечная скорость, и это ограничение даст вам это. Будьте осторожны, это уравнение не имеет четкой физической основы и может дать странные результаты в других сценариях. Экспериментируйте и посмотрите, что выглядит правильно.

Уравнения, упомянутые в Википедии (стандартные, весьма полезные, уравнения для учебников), предполагают, что между этими двумя объектами происходит мгновенная передача импульса. Это действительно не так для жизни в реальной жизни. Когда один бильярдный шар попадает в другое, шарики деформируются очень слабо, и эта деформация требует времени; это время находится в масштабе миллисекунд или меньше и обычно незначительно.

+0

Все это очень верно, но моя симуляция намного проще, чем реальность. Время имеет дискретные шаги, а объекты жесткие. Таким образом, хотя по-настоящему одновременный случай может быть патологическим, у меня, к сожалению, приходится обращаться с ним, поскольку это неизбежная возможность в моей симуляции.И мне нужно обрабатывать его детерминированным способом, иначе будут друг друга между разными клиентами ... Во всяком случае, каковы были бы предпосылки для решения этого? – user173342

+0

user173342, вы пытаетесь смоделировать то, что действительно происходит, или просто что-то правдоподобное (например, для игры)? Очень разные. Моделирование реальной жизни регулирует размер шага в зависимости от конфигурации (расстояние между объектами и скорость). Хотя ваша программа может быть детерминированной и всегда производить один и тот же результат, в реальной жизни, что происходит, когда вы делаете открытие в бильярде, нет. Если вы хотите, чтобы это создавало правдоподобные, реалистичные результаты, вам, вероятно, придется вводить случайный шум, как это происходит в реальной жизни. Сделать это подлинной симуляции сложно. Просто правдоподобно легче. –

0

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

(v1_1,v3_1) = collide(u1,u3,m1,m3) 
(v2_2,v3_2) = collide(u2,u3,m2,m3) 
v1 = u1 + (v1_1 - u1) = v1_1 
v2 = u2 + (v2_2 - u2) = u2_2 
v3 = u3 + (v3_1 - u3) + (v3_2 - u3) = v3_1 + v3_2 - u3 

Таким образом, это не будет чувствительным к порядку.