Quieres pasar de un mundo plano a uno cilíndrico.
Una rotación alrededor del eje x (en coordenadas homogéneas) se ve así:
| 1 0 0 0 |
Rx = | 0 ca -sa 0 |
| 0 sa ca 0 |
| 0 0 0 1 |
Dónde:
ca = cos(angle) and sa = sin(angle)
Para calcular el ángulo, mira la imagen. El pi / 2 se cancela y te quedan:
angle = offset_from_character.z - radius
Además, mira la imagen. El ángulo del punto proyectado depende de la distancia horizontal desde el personaje, la distancia desde la esfera depende de la vertical.
new_position = character_position - vec3(0,radius,0) + Rx * vec3(0,radius+_old_position.y,0)
asegúrese de seleccionar cosas que están en el horizonte, de lo contrario, el mundo entero se envolverá.
Descargo de responsabilidad: no he probado esto y no soy un experto en matemáticas, pero la respuesta es algo como esto. Alguien corríjame si me equivoco.