Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Пересечение движущихся сфер

Добрый день. Помогите пожалуйста с решением проблемы: Есть Функция нахождения пересечения двух отрезков, результат функции - t0, t1, distanceSqr.
Для пересечение двух сфер я использую
LineDistance distance = LineSegment.DistanceSqr(A, B, C, D);
float r2 = (a.Radius + a.Radius) * (b.Radius + b.Radius); if (distance.DistanceSqr <= r2) Vector3 moveDir = (B - A) * distance.T;
точка пересечения = A + moveDir; Теперь эту точку я хочу сдвинуть на столько, что бы сфера касалась края отрезка CD и делаю:
A + moveDir - moveDir.normalized * Mathf.Sqrt(r2 - distance.DistanceSqr);
Все хорошо, когда отрезки перпендикулярны:

Но когда появляется угол между отрезками, расстояние становится не правильным:
У меня не получается решить данную проблему. Что нужно посчитать\дописать чтобы учитывать это смещение?


Ответ

Вам по сути нужно найти расстояние между центром паралеллограмма-пересечения и центром касающейся окружности (и на это расстояние надо отступить назад от точки A + moveDir).
Для этого рассмотрим подобные серые треугольники:

Вертикальные катеты у них равны соответствующим радиусам окружностей, а гипотенузы — тем же катетам, делённым на синус угла между отрезками.
Итого, расстояние, на которое нужно отойти назад, равно (a.Radius + b.Radius) / Mathf.Sin(alpha), где alpha — угол между отрезками.

Синус угла можно найти как Mathf.Sqrt(1 - cosA * cosA), где double cosA = Vector3.Dot((B - A).normalized, (D - C).normalized). Итого:
double cosA = Vector3.Dot((B - A).normalized, (D - C).normalized); double stepBack = (a.Radius + b.Radius) / Mathf.Sqrt(1 - cosA * cosA);

Комментариев нет:

Отправить комментарий