Я пишу простую физическую систему для удовольствия, и я столкнулся с проблемой, которая заставила меня застрять.Столкновение между несколькими объектами
Основной алгоритм сейчас:
- Переместить объект
- Проверка столкновений
- Если произошло столкновение
- Перемещение объекта на минимальное расстояние, чтобы разрешить коллизию.
- Регулировка скорости на основе нормалей, масс, и т.д.
У меня есть один движущееся тело движется к двум, статические, безмассовых, тел.
движущегося объекта переводится в один шаг, чтобы столкнуться с одним из тел.
Отвечаю, найдя наименьшее расстояние я могу двигаться так, чтобы они больше не сталкиваясь. В этом случае это означает перемещение динамического тела вниз. Однако теперь он сталкивается с другой коробкой.
повторяю то же самое с этой коробкой, стараясь не двигаться динамическое поле так, чтобы она больше не сталкиваясь, а что толкает его обратно в первое поле. Это повторяется вечно. Является ли мой алгоритм фундаментальным недостатком?
Ницца изображение, но ваша математика для расчета, как далеко идти назад, кажется мне неправильной.Поскольку 'min_o' может быть действительно маленьким значением,' 1/min_o' потенциально действительно большой. Также, если вы посмотрите на единицы, это кажется неправильным: оба 'v' и' min_o' являются расстояниями, поэтому '-v/min_o' безразмерен, вы не можете назначить это вектор расстояния' v2'. Я не совсем понимаю, как вы определяете 'min_o', но вы, вероятно, должны просто добавить или вычесть что-то или, как в моем ответе, просто вернуться к предыдущей позиции и повторить минимально возможный шаг. –
@BasSwinckels О, дерьмо, да, ваше право. Я собирался масштабировать вектор 'v' до размера самого маленького пересечения, а затем вычесть его из' v'. Но для этого у меня есть шкала на 'v_x/min_o', если наименьшее пересечение находилось в направлении x или' v_y/min_o', если пересечение было в направлении y. В противном случае это не имеет размеров, как вы сказали. – cyon
@BasSwinckels Хорошо, я отредактировал, и я думаю, что исправил математическую проблему. Новое масштабирование сохраняет единицы и не страдает, если 'min_o', если очень мало. Это должно быть правильное масштабирование, чтобы сжать 'v' вниз до необходимого размера, чтобы вписаться в пересечение объекта. – cyon