Estoy usando three.js para escribir un juego con física como Super Mario Galaxy, donde los jugadores pueden caminar en pequeños planetas esféricos. Al caminar hacia adelante alrededor de la esfera, el movimiento del jugador tiende a desviarse hacia la izquierda o hacia la derecha alrededor del eje Y global.
Comienzo calculando el vector ascendente de la cámara del jugador, que es opuesto a la dirección del jugador hacia la esfera.
camera.up.copy(sphere.position); camera.up.sub(camera.position); camera.up.normalize(); camera.up.multiplyScalar(-1);A continuación, uso el ángulo entre eso y el vector ascendente global para generar un cuaternión que representa la orientación general del jugador.
// GLOBAL_UP is (0,1,0) XYZ target_quaternion.setFromUnitVectors(GLOBAL_UP, camera.up); Luego, para evitar tartamudear el movimiento, uso la siguiente función para rotar la orientación de los jugadores hacia el objetivo gradualmente con el tiempo. También utilizo las coordenadas del mouse para generar controls.quaternion , que es la dirección de mirada real de la cámara. Esto se multiplica con la orientación para formar el cuaternión de cámara final.
orientation.rotateTowards(target_quaternion, speed * delta); camera.quaternion.copy(orientation); camera.quaternion.multiply(controls.quaternion); Lo que encuentro es que funciona principalmente, pero a medida que el producto escalar de GLOBAL_UP y camera.up se acerca a +/- 1 (lo que significa que camera.up se acerca al eje Y global), el jugador comienza a girar hacia el eje cuando intenta ir directamente. Cuando intentas cruzar el eje, te da vueltas repetidamente en un círculo. Creo que esto podría deberse a mi uso de rotateTowards , pero no estoy seguro de cómo cancelar las rotaciones no deseadas.
Puedes ver el código completo aquí . Cualquier ayuda es apreciada.