Мені було цікаво, як робляться зіткнення в деяких простих іграх з 3d-гонок на автомобілі (особливо в таких іграх, як Outrun 2 / Motoracer).
У класичних автомобільних гоночних іграх зі складним оточенням (відкритий світ), я думаю, це робиться з базовою коробкою (для машини) для зіткнення з літаком (для доріжок, будівель тощо). Вся справа була б оптимізована за допомогою деяких обмежувальних коробок (саме так відбувається зіткнення у багатьох іграх).
У такій грі, як Outrun 2 / Motoracer, геймплей настільки простий, що розробникам, можливо, цього не потрібно, і все можна було б значно спростити. Для тих, хто ніколи не грає, ось що таке специфічне:
- Автомобіль / велосипед завжди наклеєний на дорогу.
- Дорога завжди однакових розмірів і має дуже просту форму.
- Єдині можливості - це слідувати цією дорогою, її неможливо покинути дорогу, або зіткнутися з чимось іншим (крім інших автомобілів / велосипедів, але нас це не хвилює).
- Коли ви стикаєтесь з дорогою, відбувається дуже основне зіткнення аркад (автомобіль просто відштовхується від нього)
Ось як я думаю, зіткнення (могло) було здійснено:
Весь трек можна було б вважати гігантською кривою 3d Безьє. З цієї кривої можна було формувати дорожні багатокутники (використовуючи передні, ліві та вгору вектори, породжені кривою). За допомогою цього методу також можна розмістити та вирівняти інші елементи (наприклад, будинки, дерева, ...).
Потім, щоб вирішити зіткнення (і намалювати автомобіль):
1) Знайдіть найближче положення на кривій 3d від поточного положення автомобіля 3d. Іншими словами, перетворіть 3d-положення автомобіля в положення кривої Безьє. Кожне 3d положення на дорозі можна розглядати як зміщення по 3d кривій ( t
) + бічне зміщення ( d
). Перевірте зображення нижче, якщо воно не зрозуміло (це двомірний приклад, але це легко застосувати до 3d).
коли t = 0 машина знаходиться на початку колії, коли t = 1 машина знаходиться в кінці. коли d = -1 або 1 автомобіль знаходиться на кордоні колії, коли d = 0 автомобіль знаходиться посередині дороги
2) вирівняти автомобіль до дороги за допомогою t
і d
(дуже просто: для будь-яких t
і d
значень я можу отримати 3d положення + вектори вперед / вперед / вліво). тепер автомобіль склеєний на дорозі
3) перевірити бічне переміщення d
автомобіля. якщо величина занадто велика (d > 1)
або низька, (d < -1)
автомобіль не вдається . просто затисніть його, щоб поставити машину в потрібне місце.
Це також робить 3D-вибивання дуже простим, просто намалюйте трек від поточного t
положення автомобіля до t + some_big_enough_value_to_avoid_visible_clipping
.
Або, можливо, я абсолютно помиляюся: було б набагато швидше і простіше просто перевірити зіткнення автомобіля (обмежувальний ящик) і дуже спрощений набір полігонів, що представляють колію (без будівель і подібних). 3D-світ (і отримана модель колізії) просто був би сформований раніше, використовуючи якийсь сторонній інструмент (не більше 3d кривої при запуску гри, лише купу полігонів).