Як здійснити виявлення зіткнень порталів?


12

Наприклад, візьміть цей сценарій (вибачте мої жахливі навички малювання): зображення

На цьому ґрунтується "Портал", де стик проходить через блакитний портал (який пов'язаний з червоним порталом), але на червоному порталі є стіна, яка зупиняє його. Тому він не може повністю пройти через портал.

Отже, моє запитання таке: як я можу з ними виявити фізику / зіткнення? Я повинен нарізати програвач? Чи є спосіб їх зв’язати? Чи є якісь фізичні двигуни, які підтримують це? Якщо ні, як би я його зробив?


Наскільки мені відомо, вони пояснюють деякі речі у коментарі розробника Порталу 1.
Архів


@ Byte56, дякую, я оновив свій пост. Я думаю, що це повинно уточнити це більше :)
MiJyn

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

2
@ Byte56: Ви не повинні дуже пам’ятати. Я пам’ятаю, що це робилося на Порталі 1. Я, здається, згадую область дроблення, де можна було б використовувати портал, щоб не загинути. Зіткнення з речами біля порталів - звичайне явище, і двигун справляється з ним легко.
Нікол Болас

Відповіді:


7

У грі Портал є приємний спосіб вирішити цю проблему:

Гравець просувається через вихідний портал (синій) і видно, як стирчить з цільового порталу (помаранчевий). Гравець копіюється на цільовий портал і бачить його перехід. Гра надає зображення, яке ви бачите, переглядаючи вихідний портал, використовуючи другу камеру та перетворюйте текстуру.

Однак копія програвача в цільовому місці не взаємодіє з фізикою. Це лише для цілей надання. Натомість вони роблять об’єкти віртуального зіткнення з іншого боку вихідного порталу і змушують плеєр зіткнутися з цим. Це робить фізику простою.

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

Зображення для ілюстрації : синій портал - це вихідний портал, помаранчевий портал - цільовий портал. Пунктирна біла скринька є об'єктом віртуального зіткнення, тоді як реальне поле - виведений об'єкт. Гравець (з червоною крапкою) взаємодіє лише з об'єктами безпосередньо навколо нього. Об'єкти на помаранчевому порталі повністю ігноруються.

введіть тут опис зображення


4
" використання другої камери та текстури рендерингу " У коментарі розробників на порталі 1 прямо сказано, що вони не використовують рендеринг текстури, оскільки це не спрацювало для їх потреб (особливо, якщо ви бачите портали з інших порталів ). Натомість вони, в основному, перетворюють версію світу на іншу сторону порталу і просто рендерізують його.
Ніколь Болас

Ого, це відповідає майже на все! Мені просто цікаво, чи працює портал - це отвір із предметами всередині?
MiJyn

6

Ось як я б спробував це зробити.

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

В ідеалі ви б застосували гравітацію окремо для кожної половини гравця, але, можливо, вам вдасться піти, просто застосувавши її до сторони порталу, на якому знаходиться центр маси гравця.

Щоб ігнорувати ці зіткнення, потрібно встановити відповідний об'єм і перевірити, чи є в ньому точка. Циліндр (можливо, розтягнутий вертикально) здавався б хорошим варіантом. Тест - це щось подібнеif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();

Я вважаю, що більшість фізичних двигунів мають систему фільтрації того, що об’єкт може зіткнутися, тому це повинно бути можливо за допомогою стандартного двигуна фізики. Наприклад, http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering

Для комбінування результатів найпростішим варіантом було б, мабуть, додати якесь негнуче обмеження між ними, і дозволити фізичному двигуну впоратися з цим.


Хм, добре, як би я це зробив? Я розумію, як скопіювати плеєр, але крім цього, я не знаю. Як би я ігнорував зіткнення з протилежного боку? Як би я навіть поєднав результати?
MiJyn

Я відредагував детальніше.
Адам

дякую, я подумаю про це і відповім пізніше, як тільки я можу це встановити прямо в голові :)
MiJyn

Велике спасибі, ваша відповідь та відповідь Virtlink на моє запитання :) Тепер вирішити, на який "правильну відповідь" встановити ...
MiJyn

4

Як я можу підрахувати, наскільки далеко йде гравець?

Чому б ви хотіли? Вам не потрібно обчислювати, як далеко «гравець» йде гравцем; ви дізнаєтесь, наскільки далеко йде, коли об’єкт проходить моделювання.

Як я можу навіть підключити портали?

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

Фізика просто протікає як нормально.


When an object touches the portal, it starts potentially colliding with things on the other sideтак саме. Як би я це зробив з фізичним двигуном? Я думаю, це було моє питання :)
MiJyn

@MiJyn: Ви пишете двигун фізики, який може це зробити. Valve повинен був поламати фактично двигун Source, щоб змусити портал реально працювати. Жоден комерційний або відкритий фізичний двигун не може цього зробити. Існує причина, чому, незважаючи на популярність Порталу, на ринку не існує жодної кількості клонів Порталу.
Нікол Болас

Цікаво, адже існує маса інших ігор, які мають дуже схожу механіку (див. навіть мод TARDIS для minecraft). Я впевнений, що повинен бути якийсь спосіб зробити це легко.
MiJyn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.