Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Пересечение движущихся сфер

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

Поделиться

Страницы: 1 2 Следующая

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

Все хорошо, когда отрезки перпендикулярны:
1 | Пересечение движущихся сфер

Но когда появляется угол между отрезками, расстояние становится не правильным:
2 | Пересечение движущихся сфер

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

Правка: 14 июля 2017 23:43

alexzzzzПостоялецwww15 июля 20170:16#1
Если можешь найти расстояние, на которое нужно сместить сферу, чтобы она попала ровно в точку пересечения отрезков, то вычти из этого расстояния длину l:

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

Длину l можно найти из катета d и синуса угла между прямыми.

Zed234Новичокwww17 июля 201713:48#2
alexzzzz
Спасибо.

Сделал вот так:
float angle = Vector3.Angle((B - A).normalized, (D - C).normalized) * Mathf.Deg2Rad;
res = A + moveDir - moveDir.normalized * ((a.Radius + b.Radius) / Mathf.Sin(angle))

результат:
http://savepic.ru/14880799.png

Но появилась другая проблема:
http://savepic.ru/14936080.png

alexzzzzПостоялецwww17 июля 201716:30#3
Zed234
> float angle = Vector3.Angle((B - A).normalized, (D - C).normalized) * Mathf.Deg2Rad;
> res = A + moveDir - moveDir.normalized * ((a.Radius + b.Radius) / Mathf.Sin(angle))

Можно проще, без тригонометрических вычислений. Модуль векторного произведения векторов a и b равен |a| * |b| * sin(alpha). Когда вектора нормализованы, модуль векторного произведения тупо равен синусу угла.

var sin = Vector3.Cross((B - A).normalized, (D - C).normalized).magnitude;
res = A + moveDir - moveDir.normalized * ((a.Radius + b.Radius) / sin);

> Но появилась другая проблема:
> http://savepic.ru/14936080.png

А как точно должно быть?

Zed234Новичокwww17 июля 201716:40#4
alexzzzz
http://savepic.ru/14907429.png
http://savepic.ru/14928932.png
float sin = Vector3.Cross((B - A).normalized, (D - C).normalized).sqrMagnitude;
res = A + moveDir - moveDir.normalized * Mathf.Sqrt((r2 - distance.DistanceSqr) / sin);

Не могу теперь тут придумать решение

Правка: 17 июля 2017 16:49

alexzzzzПостоялецwww17 июля 201717:00#5
Zed234
> http://savepic.ru/14936080.png
> http://savepic.ru/14907429.png

Я пока не понял, в каком точно месте на этих картинках должен находиться средний не подписанный шарик.

Zed234Новичокwww17 июля 201717:04#6
alexzzzz
Как на скрине при 90 градусах. Касаться С вплотную:
http://savepic.ru/14928932.png

А у него большое смешение:
http://savepic.ru/14907429.png

alexzzzzПостоялецwww17 июля 201717:14#7
Zed234
> http://savepic.ru/14907429.png

Неподписанный шарик двигается из точки А и должен дойти до шарика С, коснуться его и остановиться. Так?

Zed234Новичокwww17 июля 201717:16#8
alexzzzz
Да, все верно
alexzzzzПостоялецwww17 июля 201717:46#9
А если отрезки вообще друг друга не пересекают и даже близко не подходят, то шарик E где должен быть?

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

Zed234Новичокwww17 июля 201717:56#10
alexzzzz
В точке Б.
Я делаю базовую физику для игры.
Персонаж на первом фрейме находится в точке А а на следующем фрейме в точке Б.
За этот промежуток времени движения из А в Б нужно определить, столкнулся ли он с другими движущимися персонажами и установить его в позицию контакта.
SuslikМодераторwww17 июля 201719:07#11
сейчас ты можешь хорошенько напрячься и вывести решение для time of impact сфер, движущихся с произвольными скоростями. но потом тебе захочется ещё то же самое для многогранников или хотя бы сферы с треугольником и тут уже ой, получается уравнение 5-й степени(или где-то так), котрое аналитически не решается, вообще. поэтому, возможно, имеет смысл просто найти пересечение бинарным поиском по времени, либо используя метод ньютона с оценкой производной. производную дистанции по времени можно оценить сверху как сумму модулей скоростей, например, если совсем грубо.
Zed234Новичокwww17 июля 201719:26#12
Suslik
Я планирую сейчас сделать пересечение сфер.
Потом пересечение движущейся сферы и линии.
Границы меша буду проверять как набор линий пересекающийся с этой движущейся сферой.
SuslikМодераторwww17 июля 201719:30#13
Zed234
> Потом пересечение движущейся сферы и линии.
не сделаешь, если меш тоже вращается. поэтому я тебе и говорю, что вместо аналитического решения конструктивнее, возможно, искать численное
Zed234Новичокwww17 июля 201719:44#14
Suslik
Вращение меша не планируется.

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Физика

2001—2017 © GameDev.ru — Разработка игр