Vuoi passare da un mondo planare a uno cilindrico.
Una rotazione attorno all'asse x (in coordinate omogenee) è simile alla seguente:
| 1 0 0 0 |
Rx = | 0 ca -sa 0 |
| 0 sa ca 0 |
| 0 0 0 1 |
Dove:
ca = cos(angle) and sa = sin(angle)
Per calcolare l'angolo, guarda l'immagine. Il pi / 2 si cancella e ti rimane con:
angle = offset_from_character.z - radius
Inoltre, guarda l'immagine. L'angolo del punto proiettato dipende dalla distanza orizzontale dal carattere, la distanza dalla sfera dipende dalla verticale.
new_position = character_position - vec3(0,radius,0) + Rx * vec3(0,radius+_old_position.y,0)
assicurati di abbattere le cose che sono oltre l'orizzonte, altrimenti il mondo intero si avvolgerà.
Disclaimer: non l'ho testato e non sono un esperto di matematica, ma la risposta è qualcosa del genere. Qualcuno, per favore, mi corregga se sbaglio.