Например, возьмите этот сценарий (извините за мои ужасные навыки рисования):
Это основано на «Портале», где крупье проходит через синий портал (который связан с красным порталом), но на красном портале его останавливает стена. Поэтому он не может полностью пройти через портал.
Итак, мой вопрос заключается в следующем: как я могу с их помощью обнаружить физику / столкновение? Я нарезаю плеер? Есть ли способ связать их? Есть ли физические движки, которые поддерживают это? Если нет, то как бы я сделал один?
Ответы:
В игре Portal есть хороший способ решить эту проблему:
Игрок пробирается сквозь исходный портал (синий) и виден торчащим из целевого портала (оранжевый). Игрок копируется на целевой портал и виден шагающим по нему. Игра рендерит изображение, которое вы видите, просматривая исходный портал, используя вторую камеру и рендеринг в текстуру.
Однако копия игрока в целевой локации не взаимодействует с физикой. Это только там для целей рендеринга. Вместо этого они создают виртуальные объекты столкновений на другой стороне исходного портала и вместо этого заставляют игрока сталкиваться с этим. Это делает физику простой.
Вам нужны эти виртуальные объекты настолько далеко, насколько игрок может достичь, не пройдя полностью через портал. Как только игрок полностью проходит через портал, ситуация меняется на противоположную.
Изображение для иллюстрации : синий портал - это исходный портал, оранжевый портал - целевой. Пунктирная белая рамка - это объект виртуального столкновения, тогда как реальная коробка - это визуализированный объект. Игрок (с красной точкой) взаимодействует только с объектами непосредственно вокруг него. Объекты на оранжевом портале полностью игнорируются.
источник
Вот как я бы попытался это сделать.
Пока вы находитесь внутри портала, в физическом движке будет две копии игрока. Каждая копия игнорирует все столкновения, которые находятся на противоположной стороне портала, и вы затем объединяете результаты и применяете результаты моделирования к обеим моделям.
В идеале вы бы применяли гравитацию отдельно для каждой половины игрока, но вы могли бы уйти, просто применив ее к той стороне портала, на которой находится центр масс игрока.
Чтобы игнорировать эти коллизии, вам нужно установить соответствующий объем и проверить, находится ли точка внутри него. Цилиндр (возможно, вытянутый вертикально) может показаться хорошим вариантом. Тест то что то типа
if (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();
Я полагаю, что большинство физических движков имеют систему фильтрации того, с чем может столкнуться объект, поэтому это должно быть возможно при использовании стандартного физического движка. Например, http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering
Чтобы объединить результаты, самым простым вариантом, вероятно, было бы добавить какое-то негибкое ограничение между ними и позволить физическому движку справиться с этим.
источник
Почему ты хочешь? Вам не нужно рассчитывать, как далеко игрок уходит «вниз»; Вы узнаете, как далеко он идет вниз, когда объект проходит симуляцию.
Портал, с чисто игровой точки зрения, - это не что иное, как сложный телепорт, который путается со столкновениями, превращая сталкивающиеся объекты в несобираемые. Когда объект касается портала, он потенциально может столкнуться с вещами на другой стороне. Когда объект проходит «достаточно далеко» через портал, вы эффективно телепортируете его к другому, мгновенно изменяя его положение и ориентацию.
Физика просто идет как обычно.
источник
When an object touches the portal, it starts potentially colliding with things on the other side
Да, точно. Как бы я сделал это с физическим движком? Я думаю, это был мой вопрос :)