Я недавно переключил свой игровой движок с рулевого поведения на импульсное движение с надлежащим временным разрешением столкновений. Это решило очень много проблем (больше не туннелирование, ура) и сделало симуляцию намного более стабильной. Однако со стабильностью возникла новая проблема.
Три шара начали свое путешествие в нижней части изображения, их цель была там, где остановился розовый шар. По пути красные и зеленые шарики застряли в узкой точке в стене.
Раньше я мог полагаться на ошибки с плавающей запятой и общую нестабильность поведения руля, чтобы зелёные и красные шары давили друг на друга, пока им не удалось пройти через точку дросселирования. Теперь при правильном разрешении столкновения силы, действующие на шары, взаимно компенсируют друг друга, в результате чего шары остаются совершенно неподвижными.
Какие методы обычно используются для разрешения таких ситуаций? Возможно, какая-то система очередей с приоритетом будет работать, хотя я вижу, что она становится сложной, когда мне нужно выбрать приоритет между более чем двумя объектами.
источник
Ответы:
Присвойте каждому подвижному объекту уникальный индекс и запретите объекту с более высоким индексом перемещать агента с более низким индексом. Это позволит «старым» объектам подталкивать «более новые» объекты, но не наоборот, и это требует меньше затрат, чем организация очередей. По сути, индекс действует как приоритет движения.
источник
добавить время к поиску пути
вот статья, в которой говорится о кубе времени: http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/coop-path-AIWisdom.pdf
и вот реализация Objective-C: http://allseeing-i.com/ASIPathFinder
источник
На самом деле, я не думаю, что вы должны это исправить. Если (я могу предположить) стрелки указывают на векторы силы, приложенные к любой сфере, в любом месте сетки (возможно, интерполированные «билинейно» или аналогично, или как-то более «аналогично», чем просто 0/1), то тогда поведение является физически правильным, и вы должны поздравить себя с хорошим решением.
Эти две сферы находятся в хорошем равновесии, поскольку они сидят там и ненавидят друг друга. По-видимому, если они перемещаются немного вправо, «стрелка силы» вправо воздействует на сферу правой стороны немного больше (и наоборот на сферу левой стороны; немного меньше), и поэтому они возвращаются к равновесию. Так и должно быть.
Имхо, то, что должно быть исправлено - это стена, или размеры сферы, или что-то еще среди самих строительных камней. Вы создали невозможное, и правильное поведение в этой ситуации, соответственно, зашло в тупик (извините за неправильное использование слов, надеюсь, вы все равно их получите :-)).
Возможно, вместо этого отключите ближайшие стрелки влево / вправо или расположите их другим способом, который не является симметричным и не способствует сбалансированности ?
Я думаю, что это было бы плохим решением, искусственно исправить это ... стало бы слишком рано.
источник