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

287
16 июля 2017, 09:43

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

Все хорошо, когда отрезки перпендикулярны:

Но когда появляется угол между отрезками, расстояние становится не правильным:

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

Answer 1

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

Для этого рассмотрим подобные серые треугольники:

Вертикальные катеты у них равны соответствующим радиусам окружностей, а гипотенузы — тем же катетам, делённым на синус угла между отрезками.

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

Синус угла можно найти как Mathf.Sqrt(1 - cosA * cosA), где double cosA = Vector3.Dot(B - A, D - C).

READ ALSO
Как узнать **ServiceName** службы по ее исполняемому файлу

Как узнать **ServiceName** службы по ее исполняемому файлу

Как узнать ServiceName службы по ее исполняемому файлу? Те

214
Возникло исключение загрузки типа

Возникло исключение загрузки типа

Получаю данную ошибку при использование кода

195
Как генерировать случайное byte число в Unity?

Как генерировать случайное byte число в Unity?

Почему обычный С# Random не работает в Unity-скрипте? Пробую такой код для смены цветового канала по нажатию кнопки:

250
Столкновение с твёрдым объектом

Столкновение с твёрдым объектом

Есть у меня два объекта, у которых имеется свой Rectangle Как проверить что они столкнулись я знаю:

223