Насчёт коллизий

Версия Minecraft
1.7.10
Знаю что в майне любая коллизия entity это AABB, но у мне нужна OBB (ориентированная == имеющая возможность вращаться). Делал ли здесь кто нечто подобное или может быть подскажите в какую сторону двигаться? P.S если кто то знает мод где это можно поглядеть то тоже буду признателен если отпишетесь
 
Последнее редактирование:
Решение
SAT круто да... Когда у тебя 2D объекты. А 'тут все примитивно - две коробки в пространстве' не совсем правда когда эти коробки ориентированные.

В Stalcraft'е я делал реализацию коллизий между OBB и AABB игрока (по факту то же самое что OBB и OBB). Изначально делал через SAT, но в итоге словил не очень приятные проблемы и переделал на convex cast через GJK. Адекватная реализация есть в JBullet, ну или можно написать самим :)
1564649688488.png1564649823559.png

Релевантный пейпер на эту тему

Детектить коллизии относительно понятно как, а вот collision resolution, да еще и с учетом 'ванильного' алгоритма коллизий уже менее тривиально.

После того как ты задетектишь коллизии (неважно каким алгоритмом) у тебя будет пять переменных: время...
183
1
4
SAT круто да... Когда у тебя 2D объекты. А 'тут все примитивно - две коробки в пространстве' не совсем правда когда эти коробки ориентированные.

В Stalcraft'е я делал реализацию коллизий между OBB и AABB игрока (по факту то же самое что OBB и OBB). Изначально делал через SAT, но в итоге словил не очень приятные проблемы и переделал на convex cast через GJK. Адекватная реализация есть в JBullet, ну или можно написать самим :)
1564649688488.png1564649823559.png

Релевантный пейпер на эту тему

Детектить коллизии относительно понятно как, а вот collision resolution, да еще и с учетом 'ванильного' алгоритма коллизий уже менее тривиально.

После того как ты задетектишь коллизии (неважно каким алгоритмом) у тебя будет пять переменных: время столкновения по пути движения (от 0 до 1), точка столкновения (можно посчитать из времени столкновения), точки столкновения на обоих объектах (совершающий движение и тот, на который он 'наткнулся'), и нормаль в точке столкновения.

Используя время столкновения ты можешь без проблем перемещать объект до точки столкновения (возможно добавляя небольшой отступ), это перемещение безопасное потому что там нет никаких других объектов.

Используя оставшееся движение и нормаль в точке столкновения ты считаешь новый путь движения. Этот новый путь небезопасный, то есть передвигая объект по нему ты должен снова проверять коллизии, потому что там могут быть какие-то другие объекты, который не были учтены до этого. И так надо делать либо n-ое кол-во итераций, либо пока оставшееся движение не приблизится к какой-то небольшой величине.

Иллюстрация происходящего во время collision resolution:

1564650597231.png

Всё это делать нужно где-то в начале Entity#moveEntity (да, туда придется хукаться) и при этом правильно обновлять всякие переменные состояния. Код показать, увы, не могу.

А еще касательно коллизий есть интересная тема партицирования пространства (bounding volume hierarchies and spatial partitioning) которую в этом треде никто почему-то не затронул, а это важная часть если нужно делать что-то, что не будет вешать тпс сервера.

Удачи!
 
Последнее редактирование:
183
1
4
А еще, если хочется примеров реального кода, можно посмотреть в реализацию алгоритма коллизий в движке Godot (метод KinematicBody::move_and_slide): godotengine/godot

Там довольно интересно
 
Сверху