Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Знаю что в майне любая коллизия entity это AABB, но у мне нужна OBB (ориентированная == имеющая возможность вращаться). Делал ли здесь кто нечто подобное или может быть подскажите в какую сторону двигаться? P.S если кто то знает мод где это можно поглядеть то тоже буду признателен если отпишетесь
SAT круто да... Когда у тебя 2D объекты. А 'тут все примитивно - две коробки в пространстве' не совсем правда когда эти коробки ориентированные.
В Stalcraft'е я делал реализацию коллизий между OBB и AABB игрока (по факту то же самое что OBB и OBB). Изначально делал через SAT, но в итоге словил не очень приятные проблемы и переделал на convex cast через GJK. Адекватная реализация есть в JBullet, ну или можно написать самим
SAT круто да... Когда у тебя 2D объекты. А 'тут все примитивно - две коробки в пространстве' не совсем правда когда эти коробки ориентированные.
В Stalcraft'е я делал реализацию коллизий между OBB и AABB игрока (по факту то же самое что OBB и OBB). Изначально делал через SAT, но в итоге словил не очень приятные проблемы и переделал на convex cast через GJK. Адекватная реализация есть в JBullet, ну или можно написать самим
Детектить коллизии относительно понятно как, а вот collision resolution, да еще и с учетом 'ванильного' алгоритма коллизий уже менее тривиально.
После того как ты задетектишь коллизии (неважно каким алгоритмом) у тебя будет пять переменных: время столкновения по пути движения (от 0 до 1), точка столкновения (можно посчитать из времени столкновения), точки столкновения на обоих объектах (совершающий движение и тот, на который он 'наткнулся'), и нормаль в точке столкновения.
Используя время столкновения ты можешь без проблем перемещать объект до точки столкновения (возможно добавляя небольшой отступ), это перемещение безопасное потому что там нет никаких других объектов.
Используя оставшееся движение и нормаль в точке столкновения ты считаешь новый путь движения. Этот новый путь небезопасный, то есть передвигая объект по нему ты должен снова проверять коллизии, потому что там могут быть какие-то другие объекты, который не были учтены до этого. И так надо делать либо n-ое кол-во итераций, либо пока оставшееся движение не приблизится к какой-то небольшой величине.
Иллюстрация происходящего во время collision resolution:
Всё это делать нужно где-то в начале Entity#moveEntity (да, туда придется хукаться) и при этом правильно обновлять всякие переменные состояния. Код показать, увы, не могу.
А еще касательно коллизий есть интересная тема партицирования пространства (bounding volume hierarchies and spatial partitioning) которую в этом треде никто почему-то не затронул, а это важная часть если нужно делать что-то, что не будет вешать тпс сервера.
А еще, если хочется примеров реального кода, можно посмотреть в реализацию алгоритма коллизий в движке Godot (метод KinematicBody::move_and_slide): godotengine/godot