2012-03-01 6 views
0

У меня есть система с сталкивающимися шарами, которые обычно работают, за исключением случаев, когда они сталкиваются с подобными направлениями, менее чем на 90 градусов друг от друга.Проблемы с столкновением с баллом

Diagram of colliding balls problem

Это потому, что мяч выше пытается наехать против желтой линии, которая, предположительно, столкновение самолета, но он посылает его в неправильном направлении, и «следует» другой мяч. Общий алгоритм для столкновения:

dot = direction.surface; 
parallel = surface * dot; 
perpendicular = direction - parallel; 
direction = perpendicular - parallel; 

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

Кто-нибудь знает, как это исправить? Я сделал что-то не так?

Edit: Так что теперь я добавил:

average = (ball1.velocity + ball2.velocity)/2; 
ball1.velocity -= average; 
ball2.velocity -= average; 

Перед выполнением расчетов выше, и после этого:

ball1.velocity += average; 
ball2.velocity += average; 

Чтобы получить в правой системе отсчета, в соответствии с ответом @ Бета. Проблема в том, что скорости шариков не поддерживаются, так как они имеют одинаковые скорости и массы, но после столкновений они различны. Я не думаю, что это должно произойти, или не так ли?

+0

Этот метод предназначен для использования в рамке центра-импульса. Проясняет ли это, или мы должны объяснить больше? – Beta

+0

Не возражаете ли вы объяснить это немного? Есть так много примеров онлайн, которые используют этот метод, но это не всегда работает? – slartibartfast

+0

Это длинное объяснение. Вы знакомы с идеей изменения систем отсчета? – Beta

ответ

2

Рассмотрите проблему 1D, отскакивая от стены. Просто.

Теперь наблюдайте, как я отказываюсь от мяча с передней переборки реактивного самолета в полете. Мяч двигается на север со скоростью 252 м/с, переборка движется на север со скоростью 250 м/с. Ответ не очевиден. Но переходите в мою координатную рамку (вычитая скорость переборки, 250 м/с, из всего), и проблема тривиальна. Решите его, затем переместите результат обратно в грунтовую рамку (по , добавив 250 м/с ко всему), и все готово.

Теперь проблема 2D шара, отскакивающего от стены под углом. Просто. (Но убедитесь, что ваш код делает это правильно.)

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

Теперь два шара сталкиваются, но со скоростями, которые делают не добавляют к нулю. Там все еще желтая стена, но она движется. Ну, сдвиньтесь в рамку стены, вычитая среднее из значений шаров (sum/2) из ​​всего, решите более простую задачу, затем отбросьте назад, добавив эту же скорость ко всему, и все готово.

+1

Хорошо, спасибо. Только один вопрос: если оба шара имеют одинаковую скорость, их скорости будут одинаковыми после столкновения, верно? – slartibartfast

+0

Не обязательно. Использование кадра с центром в импульсе - отличный способ, он избавляет нас от множества загадочных алгебр. Не пытайтесь сделать еще один ярлык, пока вам не понравится эта техника. – Beta

+0

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

Смежные вопросы