1291 подписчик
Столкновение объектов продолжает оставаться не взятым рубежом.
Если коротко, то есть общеизвестный простой способ проверки на столкновение: каждый объект окружается рамкой и пересечение этих рамок есть признак столкновения. В принципе, довольно тривиальная задача. Однако, когда сталкивающиеся фигуры становятся более сложными и разноразмерными, такой подход начинает быть неудобным. Например, пересечение двух звёзд: если определять столкновение по "коробочкам" - то получается весьма некрасиво (см рисунок).
Поэтому я пошёл по пути контроля пересечения линий обводки тела: каждое тело имеет какой-то контур обводки и столкновение определяется по мере пересечения контуров (или траектории движения тела с контуром). И это вполне себе рабочий способ.
Ну хорошо, мы определили факт пересечения объектов. В каком-то случае можно просто отреагировать на факт столкновения (например, машина заехала в лужу и потеряла скорость) и продолжать, как ни в чём не бывало. Но главная причина проверки столкновений - не позволить предмету двигаться через преграду и, следовательно, нужно тело, налетевшее на преграду, отодвинуть, но отодвинуть так, чтобы оно оказалось перед преградой, а не где-то далеко.
А для этого надо понять насколько тело 1 (машина) заехала на тело 2 (стена) и отодвинуть тело на среднюю величину. Правда непонятно пока что, как вычислить эту среднюю величину. Можно, безусловно, откатываться к предыдущей точке нахождения тела, однако, если скорость движения слишком высока - получится казус: машина врезалась в стену не доехав до неё пару метров. Или персонаж прыгнул в яму и завис над землёй. Считай, та же самая проблема, что и со звёздами.
Пока что единственная идея, как это преодолеть - разбивать все препятствия на несколько блоков минимального размера, но тут есть свои недостатки. Продолжаю обдумывать проблематику.
1 минута
23 августа 2022