Рухомі предмети, що стикаються при використанні нерівномірного уникнення зіткнення (рульове управління)


9

У мене виникають проблеми з неузгодженим уникненням зіткнень, оскільки я вважаю це рідкісним випадком. Я встановив два об’єкти для руху в напрямку один до одного, але з невеликим зміщенням, тому один з об'єктів рухається трохи вгору, а один з об'єктів рухається трохи вниз.

У своєму алгоритмі рульового управління запобігання зіткненням я знаходжу точки на передній лінії об'єкта та передній лінії іншого об'єкта, де ці дві лінії є найближчими. Якщо ці найближчі точки знаходяться в межах відстані уникнення зіткнення і якщо відстань між ними менша за два радіуси обмежувальних сфер двох об'єктів, то об'єкти повинні відхилятися у відповідному напрямку.

Проблема полягає в тому, що для мого випадку найближчі точки на лініях обчислюються дійсно далеко від фактичної точки зіткнення. Це тому, що дві прямі лінії для кожного об'єкта віддаляються одна від одної в міру проходження об'єктів. Проблема полягає в тому, що через це не відбувається рульове управління, а два об'єкти частково стикаються.

Знімок екрана прямих ліній об'єкта.

Хтось має якісь пропозиції щодо того, як я можу правильно обчислити точку зіткнення? Можливо, якось враховуючи розміри двох об’єктів?


Зауважте, що на скріншоті зелені, червоні та сині лінії - це лише осі 3D-світу.
Джеймс Бедфорд

Відповіді:


6

Це, безумовно, найкраща стаття про виявлення зіткнення кулі в кулю, яку я натрапив.

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


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

@James ця стаття вирішить ваші проблеми. Подивіться на сторінку 2, і ви можете використовувати довільно високе число для "швидкості" на одній зі своїх сфер, щоб визначити точку зіткнення "в майбутньому".
Тетрад

Гаразд - вибачте за те, що не перевірив це, це виглядає досить добре! Мені доведеться повернутися до вас, як тільки я прочитав його. Дякую :)
Джеймс Бедфорд

1
Чи можу я лише уточнити, що на сторінці 2 під розділом "Банківський постріл: зіткнення двох рухомих кіл" це означає, що вам слід використовувати різницю між швидкістю двох кругів в алгоритмі замість швидкості першого кола? (Швидкість другого кола не використовується в стаціонарній версії алгоритму.) Цей біт був для мене не таким ясним. Дякую.
Джеймс Бедфорд

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. На а1 / 2 проведемо лінію, це буде точно в середині в градусах між двома векторами. Вам потрібно розташування на цій лінії, де sin (a1 / 2) = (радіус1 + радіус2) / 2. Якщо ця картина візуалізується в моїй голові праворуч, саме тут відбувається зіткнення. Вибачте, якщо це неправильно ... пізно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.