Я разрабатываю 2D-игру, включающую столкновения между многими дисками. Я хотел бы знать, как я могу получить угол, соответствующий новому направлению каждого диска. Для каждого диска у меня есть эта информация: направление (целое), скорость (с плавающей запятой) и положение ( ; , которые являются целыми числами).
Конечно, я знаю, что новое направление будет противоположно тому, в котором произошло столкновение (диск, попавший в нижний левый угол, пойдет в верхний правый), но я не знаю, как точно рассчитать новый угол.
В идеальном случае, когда столкновение происходит мгновенно и имеется только одна точка контакта, силы, испытываемые каждым объектом, могут действовать только вдоль линии, соединяющей центры и проходящей через точку контакта. На самом деле «сила» будет бесконечной, но она будет сообщать конечный импульс (т. е. изменение количества движения) в течение бесконечно малого интервала времени, в течение которого происходит столкновение. Не может быть компонента импульса, ортогонального этому, потому что это равносильно «силе», касательной к окружности. При любом конечном коэффициенте трения вы не можете воздействовать на окружность, сдвигая касательную к ней только в точке.
Этого ограничения вместе с сохранением импульса в двух направлениях и сохранением энергии достаточно, чтобы определить движение обеих окружностей при любых начальных условиях (для полного определения которых требуется 4 скаляра).
Если перед столкновением круг-мишень неподвижен, то после этого направление его движения достаточно легко найти: оно проходит точно вдоль линии, соединяющей центры двух кругов в момент контакта. (Убедитесь, что вы идете по этой линии в правильном направлении — имеет смысл только одно из направлений.) Новое направление круга, который первоначально двигался, будет просто задано направлением векторной суммы его старого импульса и переданного импульса. к нему при столкновении. Если вам нужны числа, скажем, движущийся круг вступает в контакт, когда его центр находится в , а другой центр находится в . Тогда угол, под которым 2 удаляется от места столкновения, равен
Конечно, если вы хотите перейти на следующий уровень реализма, вам может потребоваться учитывать следующие эффекты:
Наконец, для численной точности я предлагаю сохранять все числа как числа с плавающей точкой в вычислениях и округлять только до ближайших целых чисел при рендеринге.
пользователь10851
Роб
Н. Дева