Как получить новое направление столкновения двух дисков?

Я разрабатываю 2D-игру, включающую столкновения между многими дисками. Я хотел бы знать, как я могу получить угол, соответствующий новому направлению каждого диска. Для каждого диска у меня есть эта информация: направление (целое), скорость (с плавающей запятой) и положение ( Икс ; у , которые являются целыми числами).

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

Направление и положение являются целыми числами? Означает ли это, что круги существуют только в дискретных точках сетки? Также предположительно это круги равной массы с упругими (без прилипания / потери энергии) столкновениями?
А если быть точнее, то речь идет о разработке керлинг-симулятора. Таким образом, положение шайб (кругов) представлено их центральной точкой, причем оба целых числа соответствуют единицам измерения в пикселях. Направление представляет собой целочисленный угол, я решил выбрать 0° в качестве идеально вертикальной оси к низу. На данный момент они имеют только одинаковую массу, но позже я планирую добавить шайбы разного веса.
Вы определенно хотите сохранить позицию как число с плавающей запятой, а не целое число, а затем округлить ее до целых чисел непосредственно перед ее визуализацией. Если вы этого не сделаете, вы увидите какие-то странные артефакты, когда скорость будет близка к одному пикселю на кадр, а если меньше одного пикселя на кадр, то объект внезапно перестанет двигаться, потому что скорость будет округляться до нуля в меньшую сторону. каждый кадр. Также нет причин не сделать направление плавающим.

Ответы (1)

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

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

Если перед столкновением круг-мишень неподвижен, то после этого направление его движения достаточно легко найти: оно проходит точно вдоль линии, соединяющей центры двух кругов в момент контакта. (Убедитесь, что вы идете по этой линии в правильном направлении — имеет смысл только одно из направлений.) Новое направление круга, который первоначально двигался, будет просто задано направлением векторной суммы его старого импульса и переданного импульса. к нему при столкновении. Если вам нужны числа, скажем, движущийся круг вступает в контакт, когда его центр находится в ( Икс 1 , у 1 ) , а другой центр находится в ( Икс 2 , у 2 ) . Тогда угол, под которым 2 удаляется от места столкновения, равен

θ "=" 180 π загар 1 ( у 2 у 1 Икс 2 Икс 1 ) .
Кстати, может быть проще просто использовать Икс и у компоненты скорости, а не скорости и углы.

Конечно, если вы хотите перейти на следующий уровень реализма, вам может потребоваться учитывать следующие эффекты:

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

Наконец, для численной точности я предлагаю сохранять все числа как числа с плавающей точкой в ​​​​вычислениях и округлять только до ближайших целых чисел при рендеринге.

Большое спасибо за этот очень полный ответ. Я собираюсь много работать над этим, чтобы все исправить. Что касается моей числовой точности, я забыл упомянуть об этом, но, конечно, я уже вычислял свои числа как числа с плавающей запятой и округлял их в конце. Еще раз спасибо!
Что, если обе окружности движутся?
@tekknolagi В этом случае я предлагаю превратиться в рамку, чтобы вы сидели неподвижно, выполняя расчет, а затем трансформировались обратно. Первое преобразование вычитает одну из скоростей объектов (векторно) из обеих, в то время как второе преобразование просто добавляет ту же самую величину обратно к обеим результирующим скоростям.