Комментарии 14
Спасибо за статью!
Однако, мне немного грустно от обилия статей про GJK, которые все про 2D и все заканчиваются на моменте определения есть коллизия или нет. Для этого можно и SAT'ом обойтись.
Как же все-таки получить расстояние между объектами, нигде толком не объясняется (точнее, мне не попадалось).
Где
x1, y1 — координаты объекта A,
x2, y2 — координаты объекта B.
Это скалярная величина. А если нужна векторная, то все на много проще,
var distanceX = Math.Abs(x1 — x2);
var distanceY = Math.Abs(y1 — y2);
Ну или можешь без модулей, как тебе больше подойдет.
А если имелось ввиду
имеется ввиду отрезок наименьшей длины, один конец которого принадлежит фигуре А, а другой фигуре Б
То можно просто все вершины перебирать объекта А и Б замеряя расстояние между ними, выбирая самое наименьшее — самый простой вариант
Ну, расстояние между центрами-то легко найти. А вот минимальное расстояние, особенно с учетом того, что фигуры могут пересекаться и погружаться друг в друга — это уже веселее.
Сейчас уже ночь, но по-моему минимальное расстояние — не обязательно расстояние между вершинами; надо еще нормали к ребрам строить. Не?
Если фигуры пересеклись, то нас может интересовать "глубина погружения".
а если нет, то нужно искать наименьшее расстояние между ребрами фигур — это обычная задача вычислительной геометрии.
Вот я все пытаюсь понять, облегчает ли GJK как-то эту задачу или нет.
Тяжело интуитивно представлять такие вещи, но с виду для простых фигур (трех-четырехугольников) там банально меньше операций получится.
По-моему куда проще сравнить все линии обоих фигур на пересечение друг с другом
@
ИСПОЛЬЗОВАТЬ НАДСТРОЙКУ НАД JS
P.S. это постирония
Вычисление 2D-коллизий: алгоритм Гилберта — Джонсона — Кирти