Я хорошо знаю, как проверять столкновения, но я не знаю, как правильно справиться со столкновением.
Упрощенно, если два объекта сталкиваются, я использую некоторые вычисления, чтобы изменить направление скорости. Если я не переместлю два объекта, они все равно будут перекрываться, а если скорость не будет достаточно большой, они все равно столкнутся после следующего обновления. Это может привести к застреванию предметов друг в друге.
Но что, если я попытаюсь переместить два объекта, чтобы они не перекрывались. Это звучит как хорошая идея, но я понял, что если есть более двух объектов, это становится очень сложным. Что если я переместлю два объекта, и один из них столкнется с другими объектами, поэтому мне придется переместить их тоже, и они могут столкнуться со стенами и т. Д.
Я имею в виду 2D-игру сверху вниз, но я не думаю, что это имеет к этому какое-то отношение. Как обычно обрабатываются столкновения?
Этот вопрос задается от имени Wooh
источник
Ответы:
Даниэль Кодичек подробно описывает эту тему в своей книге « Математика и физика для программистов» .
Kodicek делает две вещи для достижения естественного разрешения столкновений:
Я загрузил демоверсию, основанную на обнаружении и разрешении столкновений Kodicek .
обновление: вот алгоритм обнаружения и разрешения столкновений, который очень похож на метод Kodicek. С исходным кодом . Я все еще рекомендую книгу Кодичека, поскольку его алгоритм реализован немного по-другому и гораздо более подробно объяснен.
источник
Что если вы проверите столкновение до того, как объекты переместятся, а не после? Или, другими словами, вы отклоняете новую позицию, если объекты сталкиваются, повторно используя старую в этом случае?
псевдокод:
Таким образом, объекты будут сталкиваться друг с другом, когда они собираются столкнуться , если ваш шаг обновления достаточно мал, игрок не должен заметить ничего странного в представлении.
источник
Всякий раз, когда два объекта перекрываются, проверьте, движутся ли они друг к другу или от них. Делайте столкновения, только если они движутся навстречу друг другу.
С векторной математикой это довольно просто, просто посчитайте:
dot_product (B.position - A.position, A.velocity - B.velocity)
Если результат положительный, объекты движутся навстречу друг другу.
источник
Я мог бы быть неправильно истолкован, но похоже, что вы задаете два вопроса: 1. каковы некоторые общие способы решения конфликтов, термин, который вы ищете, это «имитация на основе импульсов», и есть множество статей, которые Я могу сделать это лучше, чем я.
Таким образом, вы хотите, чтобы ваш физический симулятор шагал в импульсном пространстве, которое является скоростью, умноженной на массу (не делайте вещи на основе силы, ваш интегратор все равно не делает это правильно).
Для углового отклика, к счастью, наибольшие и наименьшие моменты инерции всегда можно уменьшить до двух ортогональных осей (в 2D), что означает, что матричное умножение будет работать в целом, и если вы выровняете их по осям X и Y, оно превратится в 2D вектор.
Когда у вас есть столкновение, вы рассчитываете реакцию, основываясь на линейных и угловых моментах в точке столкновения, и хорошим коэффициентом выдумки является, если у вас есть взаимопроникновение, применить некоторую штрафную силу (как упомянуто выше), чтобы разделить два тела.
С этого момента вы в конечном итоге добавляете все больше и больше правил для управления аномальным поведением, например, ограничение максимального момента импульса, чтобы вещи не вращались как вершины и т. Д., Но это хорошее начало.
Сохраняйте это простым, если можете.
Единственный реальный способ сделать это с помощью системы линейных уравнений и много решений. Практический способ сделать это - создать систему, подобную той, что описана выше, и физика просто со временем разрешится.
Большинство игр, в которых используются такие вещи, как катание или стояние на движущихся поверхностях, имеют гибридную модель, в которой ваши ноги прикреплены к поверхности (или колесам к дороге) для приспособления к физическому переходу во времени (что приведет к циклам взаимопроникновения-отклика и не сработает).
Надеюсь это поможет. Если вам нужны математические примеры, дайте мне знать.
источник
В физических движках это обычно решается путем применения штрафной силы. Перемещение твердого тела после взаимного проникновения не будет хорошо выглядеть, если ваши твердые тела движутся с более высокими скоростями (вы увидите мгновенные рывковые движения), хотя в качестве первого шага вы должны попробовать это и посмотреть, соответствует ли это вашим требованиям.
A
penalty force
применяется как пружинный амортизатор, где усилие штрафа увеличивается по мере того, как вы проникаете сквозь твердое тело и уменьшается в последующих кадрах. Думайте об этом как о источниках. Когда два твердых тела проникают друг в друга, каждое из них сталкивается с невидимой пружиной, которая ослабляет их продвижение (то есть предотвращает большее проникновение) и применяет вышеупомянутое,penalty force
пока тела больше не проникают.Это широкая тема, но, надеюсь, приведенная выше информация поможет вам начать.
источник