РЕДАКТУВАННЯ / ОНОВЛЕННЯ: Найбільше моє питання зараз - це те, чи є рівняння "t = ..." кроку 3 гарною ідеєю чи є кращий спосіб це зробити. Більшість інших питань були частково або повністю вирішені, але жодних коментарів і відповідей це питання не стосувалося. Знову ж таки, ймовірно, потрібне аналітичне рішення, швидкість і відстані занадто великі, а об'єкти - занадто малі, для будь-якого ітеративного / рекурсивного рішення (кілька запропонованих нижче в коментарях), про які я можу подумати (хоча якщо є спеціальне ітеративне / рекурсивне рішення, яке буде добре справлятися з подібними ситуаціями, тоді я безумовно відкритий для цього). Дуже дякую за вашу допомогу до цих пір, ви всі приголомшливі, і я дуже ціную ваші думки та допомогу!
Я намагаюся виявити зіткнення між невеликими, швидкісними об’єктами. Це ситуація, коли тунелювання може відбуватися дуже легко, навіть при відносно низькій швидкості.
Рейтове лиття не вийде, оскільки це виявляє зіткнення між двома швидкісними об'єктами, а не між одним об'єктом та нерухомою стіною. (Якщо тільки я не розумію рентгенівське лиття?) Виконання ДУЖЕ СУЧАСНО; якщо це взагалі можливо, я хочу уникати великого хіта на продуктивність. У мене вже є реалізований функціональний і дуже ефективний квадри ( http://en.wikipedia.org/wiki/Quadtree ), тому я повинен модифікувати та використовувати його, як описано нижче.
Редагувати: Скорочення інтервалу часу не вийде. Швидкість для цього рішення є занадто високою, а це означає, що враження від продуктивності було б занадто великим, тоді як все-таки пропала б переважна більшість зіткнень з тунелем . (Наприклад, у мене може бути об'єкт розміром приблизно 1 одиниця, що рухається зі швидкістю, яка вимірюється мільйонами одиниць за часовий інтервал ...)
ПРЕДЛОЖЕНО РІШЕННЯ:
Крок 1:
Створіть поле навколо руху кожного об'єкта, а потім подайте ці поля в квадрати, щоб створити початковий список можливих зіткнень. Дивіться наступне зображення (на цьому зображенні показано об’єкт кола, що переміщується з одного положення в інше, і рух, що генерує прямокутник, який буде поданий у квадратик):
Крок 2: (можливо, хочете пропустити цей крок?)
Пройдіть список можливих зіткнень, породжених квадратом. Подивіться, чи перетинаються прямокутники при кожному можливому зіткненні. Якщо так, перейдіть до кроку 3.
РЕДАКТУВАННЯ: Нижче Шон Міддлідч запропонував використовувати промітні томи / перетин капсул (якщо об’єкти - кола). Це залишає три варіанти: 1) повністю пропустити крок 2. 2) Зробіть крок 2 моїм шляхом. 3) Зроби це Шоном. Шона Шона буде дорожче обчислювальною, ніж моя ідея коробки, однак він викреслить більше помилкових позитивів, ніж мій шлях, не даючи їм дійти до останнього кроку.
Чи може хтось із досвіду говорити, який із цих 3 варіантів найкращий? (Я маю намір використати цей фізичний двигун для кількох різних речей, тому я шукаю "загалом найкраще" рішення, яке працює найшвидше в найрізноманітніших ситуаціях, а не лише один конкретний тестовий випадок, в якому я можу легко виміряти, яке рішення найшвидший).
Крок 3:
Використовуйте рівняння t = нижче, якщо дискримінант (тобто частина під квадратним коренем) від'ємний або 0, немає зіткнення, якщо позитивний, тоді використовуйте значення t як момент зіткнення (після чого легко регулювати положення відповідно. .. якщо обидва об'єкти продовжують існувати після зіткнення). Рівняння:
t = (-1/2 sqrt ((2 a w-2 a x + 2 b y-2 b z-2 c w + 2 c x-2 d y + 2 dz) ^ 2-4 (w ^ 2- 2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2) (a ^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2)) - a w + a xb y + b z + c wc x + d yd z) / (w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 ) .
Де (1 і 2 використовуються для позначення об'єктів 1 і 2):
t - від'ємне значення часу між 0 і -1, де 0 - поточний кадр, а -1 - попередній кадр;
a = x позиція 1;
b = y положення 1;
c = x положення 2;
d = y положення 2;
w = x швидкість 1;
x = x швидкість 2;
y = y швидкість 1;
z = y швидкість 2;
r = радіус 1;
s = радіус 2;
Виведення: (^ 2 означає квадрат)
Візьміть параметричні рівняння (наприклад, newxpos1 = a + t w) для рухів об’єктів і підключіть їх до формули відстані (склавши обидві сторони): формула відстані в квадраті = (a + t w - (c + t x)) ^ 2 + (b + t y - (d + t * z)) ^ 2. Пам'ятайте, що т буде негативним. Щоб знайти час зіткнення для двох кругових об’єктів, встановимо ліву сторону рівну (r + s) ^ 2. Розв'язуючи для t, використовуючи квадратичне рівняння (і велику кількість дуже втомливої алгебри), отримуємо вищевказане рівняння "t = ...".
Мої запитання:
1) Це хороший спосіб зробити це? Чи буде це взагалі працювати? Чи збираюся я зіткнутися з будь-якими непередбаченими проблемами? (Я знаю, що у мене виникнуть проблеми, коли одночасно стикаються більше двох об'єктів, але мені все одно, оскільки єдиний випадок, на який я дійсно заперечую, - це коли вони мають низькі відносні швидкості (якщо відносні швидкості великі тоді рішення "goofy", яке дає алгоритм, буде "досить хорошим", і людині буде неможливо побачити помилку), і якщо більше 2-х зіткнуться з низькими відносними швидкостями за один і той же часовий крок, більшість рішень все одно бути досить близьким, оскільки я не збираюся мати купу нееластичних зіткнень)
2) Чи сильно постраждає моя вистава? Я не думаю, що це буде, але якщо буде, чи є кращий спосіб це зробити?
3) Чи слід пропустити крок 2 і перейти прямо від кроку 1 до 3? Очевидно, що крок 2 не є життєво важливим, але це може сприяти продуктивності (АБО це може коштувати більше процесорного часу, ніж економить).
Усі інші коментарі, пропозиції чи критики дуже вітаються. Дякую за твою допомогу!