Você quer ir de um mundo plano para um mundo cilíndrico.
Uma rotação ao redor do eixo x (em coordenadas homogêneas) é assim:
| 1 0 0 0 |
Rx = | 0 ca -sa 0 |
| 0 sa ca 0 |
| 0 0 0 1 |
Onde:
ca = cos(angle) and sa = sin(angle)
Para calcular o ângulo, observe a imagem. O pi / 2 é cancelado e você fica com:
angle = offset_from_character.z - radius
Além disso, olhe para a imagem. O ângulo do ponto projetado depende da distância horizontal do personagem, a distância da esfera depende da vertical.
new_position = character_position - vec3(0,radius,0) + Rx * vec3(0,radius+_old_position.y,0)
certifique-se de selecionar as coisas que estão além do horizonte, caso contrário, o mundo inteiro se envolverá.
Isenção de responsabilidade: não testei isso e não sou especialista em matemática, mas a resposta é mais ou menos assim. Alguém por favor me corrija se eu estiver errado.