Для начала рассмотрим картинку в которой наглядно показано, что мы ищем
Как видно на картинке, необходимо найти прямую, проходящую через точки {a2}, {b2}, причём точки {a2} , {b2} изначально не известны. Для общего развития, можно было бы использовать уравнение прямой и просчитать точки пересечения прямой с гранями и таким образом найти точки {a2}, {b2}. Но мы воспользуемся более лёгким алгоритмом.
Для этого посмотрим на отрезки (a1 ,a2) и (b1, b2), каждый из них представляет собой расстояние от центра объекта до грани с которой он пересекается.
Найдём расстояние между центрами объектов (Назовём центральным расстоянием), с помощью метода
Vector3.Distance({1 Position}, {2 Position})
Далее, что-бы не искать точки пересечения через направляющий вектор, мы воспользуемся рейкастами, понадобиться выпустить два луча, которые направлены:
- Из { a1 }, в { b1 } : Получим { b2 } и посчитаем разность между центральным расстоянием и |{ a } и { b2 }|, получим | (b1, b2) |.
| (b1, b2) |= | (a1, b1) | - | (a1, b2) | - Из {b1} в {a1}: Получим {a2} и посчитаем разность между центральным расстоянием и | (b1, a2) |, получим | (a1, a2) |
| (a1, a2) | = | (a1, b1) | - | (b1, a2) |
И далее необходимо из центрального расстояния вычесть обе длины между векторами.
| (a2, b2) | = | (a1, b1) | - | (a1, a2) | - | (b2, b1) |
| (a2, b2) | - является расстоянием между гранями
Теперь перенесём это в Unity и рассмотрим так же второй способ реализации, через встроенные методы движка.
Нахождение через методы. Является так-же нахождением кратчайшего расстояния между гранями