Aqui está como eu tentaria fazê-lo.
Enquanto você estiver dentro de um portal, haverá duas cópias do jogador no mecanismo de física. Cada cópia ignora todas as colisões que estão no lado oposto do portal e, em seguida, você combina os resultados e aplica os resultados da simulação nos dois modelos.
Idealmente, você aplicaria a gravidade separadamente para cada metade do jogador, mas poderá aplicá-la apenas ao lado do portal em que o centro de massa do jogador está.
Para ignorar essas colisões, você precisa configurar um volume apropriado e testar se há um ponto nele. Um cilindro (possivelmente esticado verticalmente) parece ser uma boa opção. O teste é então algo comoif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();
Acredito que a maioria dos mecanismos de física possui um sistema para filtrar com o que um objeto pode colidir; portanto, deve ser possível usar um mecanismo de física padrão. Por exemplo, http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering
Para combinar os resultados, a opção mais simples provavelmente seria adicionar algum tipo de restrição inflexível entre os dois e deixar o mecanismo de física lidar com isso.