Как реализовать обнаружение столкновений порталов?


12

Например, возьмите этот сценарий (извините за мои ужасные навыки рисования): образ

Это основано на «Портале», где крупье проходит через синий портал (который связан с красным порталом), но на красном портале его останавливает стена. Поэтому он не может полностью пройти через портал.

Итак, мой вопрос заключается в следующем: как я могу с их помощью обнаружить физику / столкновение? Я нарезаю плеер? Есть ли способ связать их? Есть ли физические движки, которые поддерживают это? Если нет, то как бы я сделал один?


Насколько я знаю, они объясняют некоторые вещи в комментарии разработчиков Portal 1.
Archy


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

1
Я думаю, что описанная вами ситуация очень необычна на портале (если она когда-либо случается), поскольку порталы не являются свободно плавающими. Они размещены на стенах и только на конкретных стенах. Я не помню ситуации, когда мне удалось разместить портал, но я не смог пройти через него из-за препятствия на другом конце портала. Я полагаю, вы могли бы создать временную копию плеера в обоих местах на переходный период.
MichaelHouse

2
@ Byte56: Вы не должны помнить очень много. Я помню, как это делалось в Портале 1. Кажется, я вспоминаю ту грандиозную область, где можно было использовать портал, чтобы избежать смерти. Столкновение с вещами возле порталов является обычным явлением, и двигатель справляется с этим легко.
Никол Болас

Ответы:


7

В игре Portal есть хороший способ решить эту проблему:

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

Однако копия игрока в целевой локации не взаимодействует с физикой. Это только там для целей рендеринга. Вместо этого они создают виртуальные объекты столкновений на другой стороне исходного портала и вместо этого заставляют игрока сталкиваться с этим. Это делает физику простой.

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

Изображение для иллюстрации : синий портал - это исходный портал, оранжевый портал - целевой. Пунктирная белая рамка - это объект виртуального столкновения, тогда как реальная коробка - это визуализированный объект. Игрок (с красной точкой) взаимодействует только с объектами непосредственно вокруг него. Объекты на оранжевом портале полностью игнорируются.

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


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

4

Как бы я посчитал, как далеко уходит игрок?

Почему ты хочешь? Вам не нужно рассчитывать, как далеко игрок уходит «вниз»; Вы узнаете, как далеко он идет вниз, когда объект проходит симуляцию.

Как бы я даже подключил порталы?

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

Физика просто идет как обычно.


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

@MiJyn: Вы пишете физический движок, который может это сделать. Valve пришлось существенно сломать движок Source, чтобы Portal действительно работал. Никакой коммерческий или физический движок с открытым исходным кодом не может этого сделать. Есть причина, почему, несмотря на популярность Portal, на рынке нет десятков клонов Portal.
Николь Болас

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