Найти в Дзене
CreeX

Как определить расстояние между гранями двух объектов? [Unity]

Для начала рассмотрим картинку в которой наглядно показано, что мы ищем

Введём систему обозначений: 	
        { a } – Точка
	(a1, b1) – Вектор (отрезок)
	| (a1, b1) | - Длина вектора.
Введём систему обозначений: { a } – Точка (a1, b1) – Вектор (отрезок) | (a1, b1) | - Длина вектора.

Как видно на картинке, необходимо найти прямую, проходящую через точки {a2}, {b2}, причём точки {a2} , {b2} изначально не известны. Для общего развития, можно было бы использовать уравнение прямой и просчитать точки пересечения прямой с гранями и таким образом найти точки {a2}, {b2}. Но мы воспользуемся более лёгким алгоритмом.

Для этого посмотрим на отрезки (a1 ,a2) и (b1, b2), каждый из них представляет собой расстояние от центра объекта до грани с которой он пересекается.

Найдём расстояние между центрами объектов (Назовём центральным расстоянием), с помощью метода

Vector3.Distance({1 Position}, {2 Position})

Далее, что-бы не искать точки пересечения через направляющий вектор, мы воспользуемся рейкастами, понадобиться выпустить два луча, которые направлены:

  1. Из { a1 }, в { b1 } : Получим { b2 } и посчитаем разность между центральным расстоянием и |{ a } и { b2 }|, получим | (b1, b2) |.
    | (
    b1, b2) |= | (a1, b1) | - | (a1, b2) |
  2. Из {b1} в {a1}: Получим {a2} и посчитаем разность между центральным расстоянием и | (b1, a2) |, получим | (a1, a2) |
    | (
    a1, a2) | = | (a1, b1) | - | (b1, a2) |

И далее необходимо из центрального расстояния вычесть обе длины между векторами.

| (a2, b2) | = | (a1, b1) | - | (a1, a2) | - | (b2, b1) |

| (a2, b2) | - является расстоянием между гранями

Теперь перенесём это в Unity и рассмотрим так же второй способ реализации, через встроенные методы движка.

Нахождение через методы. Является так-же нахождением кратчайшего расстояния между гранями