Así es como lo intentaría y lo haría.
Mientras esté dentro de un portal, habrá dos copias del jugador en el motor de física. Cada copia ignora todas las colisiones que se encuentran en el lado opuesto del portal, y luego combina los resultados y aplica los resultados de la simulación a ambos modelos.
Idealmente, aplicaría la gravedad por separado para cada mitad del jugador, pero podría salirse con la suya simplemente aplicándola al lado del portal en el que se encuentra el centro de masa del jugador.
Para ignorar esas colisiones, debe configurar un volumen apropiado y probar si hay un punto dentro de él. Un cilindro (posiblemente estirado verticalmente) parece ser una buena opción. La prueba es entonces algo así comoif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();
Creo que la mayoría de los motores de física tienen un sistema para filtrar con qué puede chocar un objeto, por lo que debería ser posible utilizando un motor de física estándar. Por ejemplo, http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering
Para combinar los resultados, la opción más simple probablemente sería agregar algún tipo de restricción inflexible entre los dos, y dejar que el motor de física lo maneje.