Вот как я бы попытался это сделать.
Пока вы находитесь внутри портала, в физическом движке будет две копии игрока. Каждая копия игнорирует все столкновения, которые находятся на противоположной стороне портала, и вы затем объединяете результаты и применяете результаты моделирования к обеим моделям.
В идеале вы бы применяли гравитацию отдельно для каждой половины игрока, но вы могли бы уйти, просто применив ее к той стороне портала, на которой находится центр масс игрока.
Чтобы игнорировать эти коллизии, вам нужно установить соответствующий объем и проверить, находится ли точка внутри него. Цилиндр (возможно, вытянутый вертикально) может показаться хорошим вариантом. Тест то что то типаif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();
Я полагаю, что большинство физических движков имеют систему фильтрации того, с чем может столкнуться объект, поэтому это должно быть возможно при использовании стандартного физического движка. Например, http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering
Чтобы объединить результаты, самым простым вариантом, вероятно, было бы добавить какое-то негибкое ограничение между ними и позволить физическому движку справиться с этим.