Пересечение движущихся сфер
Zed234 | Новичок | www | 14 июля 2017 | 23:42 | #0 |
---|
Для пересечение двух сфер я использую
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;
A + moveDir - moveDir.normalized * Mathf.Sqrt(r2 - distance.DistanceSqr);
Все хорошо, когда отрезки перпендикулярны:
Но когда появляется угол между отрезками, расстояние становится не правильным:
У меня не получается решить данную проблему. Что нужно посчитать\дописать чтобы учитывать это смещение?
Правка: 14 июля 2017 23:43
alexzzzz | Постоялец | www | 15 июля 2017 | 0:16 | #1 |
---|
Длину l можно найти из катета d и синуса угла между прямыми.
Zed234 | Новичок | www | 17 июля 2017 | 13:48 | #2 |
---|
Спасибо.
Сделал вот так:
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 | Постоялец | www | 17 июля 2017 | 16:30 | #3 |
---|
> 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 | Новичок | www | 17 июля 2017 | 16:40 | #4 |
---|
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 | Постоялец | www | 17 июля 2017 | 17:00 | #5 |
---|
> http://savepic.ru/14936080.png
> http://savepic.ru/14907429.png
Я пока не понял, в каком точно месте на этих картинках должен находиться средний не подписанный шарик.
Zed234 | Новичок | www | 17 июля 2017 | 17:04 | #6 |
---|
Как на скрине при 90 градусах. Касаться С вплотную:
http://savepic.ru/14928932.png
А у него большое смешение:
http://savepic.ru/14907429.png
alexzzzz | Постоялец | www | 17 июля 2017 | 17:14 | #7 |
---|
> http://savepic.ru/14907429.png
Неподписанный шарик двигается из точки А и должен дойти до шарика С, коснуться его и остановиться. Так?
alexzzzz | Постоялец | www | 17 июля 2017 | 17:46 | #9 |
---|
Zed234 | Новичок | www | 17 июля 2017 | 17:56 | #10 |
---|
В точке Б.
Я делаю базовую физику для игры.
Персонаж на первом фрейме находится в точке А а на следующем фрейме в точке Б.
За этот промежуток времени движения из А в Б нужно определить, столкнулся ли он с другими движущимися персонажами и установить его в позицию контакта.
Suslik | Модератор | www | 17 июля 2017 | 19:07 | #11 |
---|
Zed234 | Новичок | www | 17 июля 2017 | 19:26 | #12 |
---|
Я планирую сейчас сделать пересечение сфер.
Потом пересечение движущейся сферы и линии.
Границы меша буду проверять как набор линий пересекающийся с этой движущейся сферой.
Suslik | Модератор | www | 17 июля 2017 | 19:30 | #13 |
---|
> Потом пересечение движущейся сферы и линии.
не сделаешь, если меш тоже вращается. поэтому я тебе и говорю, что вместо аналитического решения конструктивнее, возможно, искать численное
/ Форум / Программирование игр / Физика