Добрый день.
Помогите пожалуйста с решением проблемы:
Есть Функция нахождения пересечения двух отрезков, результат функции - 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);
Комментариев нет:
Отправить комментарий