Столкновение движущихся объектов при использовании неприсоединения для предотвращения столкновений (рулевого управления)


9

У меня возникли проблемы с предотвращением столкновений без выравнивания, что, как мне кажется, является редким случаем. Я установил два объекта, чтобы они двигались навстречу друг другу, но с небольшим смещением, поэтому один из объектов двигается немного вверх, а один из объектов движется немного вниз.

В моем не выровненном алгоритме управления предотвращением столкновений я нахожу точки на передней линии объекта и передней линии другого объекта, где эти две линии являются самыми близкими. Если эти ближайшие точки находятся в пределах расстояния, позволяющего избежать столкновения, и если расстояние между ними меньше двух радиусов ограничивающих сфер двух объектов, то объекты должны отклоняться в соответствующем направлении.

Проблема в том, что в моем случае ближайшие точки на линиях рассчитываются так, чтобы они находились очень далеко от фактической точки столкновения. Это потому, что две передние линии для каждого объекта удаляются друг от друга, когда объекты проходят. Проблема в том, что из-за этого рулевое управление не происходит, и два объекта частично сталкиваются.

Скриншот передних линий объекта.

У кого-нибудь есть какие-либо предложения относительно того, как правильно рассчитать точку столкновения? Возможно, как-то принимая во внимание размер двух объектов?


Обратите внимание, что на скриншоте зеленые, красные и синие линии являются осями трехмерного мира.
Джеймс Бедфорд

Ответы:


6

Это, безусловно, лучшая статья по обнаружению столкновений между мячами, с которой я сталкивался.

Уроки в бильярдном зале: быстрое и точное обнаружение столкновений между кругами или сферами


Я знаю, как сделать тест столкновения сфера-сфера. Моя проблема - попытаться найти место, где это столкновение произойдет в будущем. Спасибо.
Джеймс Бедфорд

@ Джеймс эта статья решит ваши проблемы. Посмотрите на страницу 2, и вы можете использовать произвольно большое число для «скорости» на одной из ваших сфер, чтобы определить точку столкновения «в будущем».
Тетрад

Хорошо - извините, что не проверили это, это выглядит довольно хорошо! Я должен вернуться к вам, как только прочитаю. Спасибо :)
Джеймс Бедфорд

1
Могу ли я просто уточнить , что на странице 2 в разделе «Банк Shot: Столкновение между двумя подвижными кругами», это означает , что вы должны использовать разницу между скоростью в два окружности в алгоритме вместо скорости первого окружности? (Скорость второго круга не используется в стационарной версии алгоритма.) Этот бит мне не очень понятен. Спасибо.
Джеймс Бедфорд

0

Вы не хотите найти ближайшую точку.

Вы хотите найти точку на линиях, где расстояние равно объединенным радиусам обеих сфер.


Ах хорошо! Вы знаете, как я могу понять это математически ..?
Джеймс Бедфорд

0

Если я правильно понимаю ваш вопрос, вы можете просто использовать тест пересечения Сфера и Сфера, как предложил AttackingHobo.

Математика для такого теста следующая (поправьте меня, если я ошибаюсь, это было какое-то время). Кроме того, это с учетом того, что ваши сферы имеют центр и переменную радиуса каждая.

Формула для проверки выглядит примерно так:

distanceOfSpheres <= sumOfRadii^2

У вас есть сфера против пересечения сферы. Это довольно просто, давайте посмотрим, как это выглядит в коде!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

Опять же, я думаю, что это правильный ответ, который вы, возможно, ищете. Если кто-то знает, что это не так, пожалуйста, поправьте меня, так как я уже давно занимался этой математикой.


Я знаю, как сделать тест столкновения сфера-сфера. Моя проблема - попытаться найти место, где это столкновение произойдет в будущем. Спасибо.
Джеймс Бедфорд

0

Хорошо, надеюсь, это имеет смысл ... Получите векторы шаров и вычислите их точку столкновения, назовите это p1. Найдите угол между двумя векторами, назовите это a1. При a1 / 2 нарисуйте линию, она будет точно посередине в градусах между двумя векторами. Вам нужно место на этой линии, где sin (a1 / 2) = (radius1 + radius2) / 2. Если эта картинка визуализируется в моей голове справа, то здесь происходит столкновение. Извините, если это не так ... уже поздно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.