2012-07-03 13 views
7

Lo que intento lograr es tener dos modos de control, uno libre "volador" y uno centrado en objetos (trackball) y con un botón presionar sin problemas cambiar entre ellos.Cambiar tres controles js (de TrackBall a FlyControls y viceversa)

Intenté inicialmente con TrackBallControls y FlyControls. El problema con esos dos, es que TrackballControls se basa en ángulos de Euler, mientras que FlyControls se basa en Quartenions. He intentado convertir el vector camera.rotation a un cuaternión mediante la acción,

quaternion.setFromEuler(target); //where target, a Vector3 that contains degrees 

y ajuste de la posición de forma manual (ya que utilizan el mismo objeto posición), y si bien parecía estar trabajando, haciendo girar la cámara un poco - y los controles de conmutación, comenzaron a producir resultados terriblemente incorrectos. Además, agarrar ángulos de Euler del cuaternión (setEulerFromQuaternion) dio como resultado datos incorrectos.

Así que, aunque pude cambiar entre ellos, nunca pude sincronizar sus coordenadas de rotación, así que "en el interruptor" mientras la posición de la cámara es correcta, la rotación es incorrecta.

PS. También obtuve algunos resultados con los FirstPersonControls (ángulos de Euler) pero el método de latitud y longitud de pantalla que está usando es muy propenso a errores y falla completamente cuando hay rotación del eje Z.

Respuesta

13

¿Qué tal algo como esto?

function onClick() { 

    var prevCamera = camera; 

    camera = new THREE.PerspectiveCamera(...); 
    camera.position.copy(prevCamera.position); 
    camera.rotation.copy(prevCamera.rotation); 

    var MODE = { TRACKBALL: 0, FLY: 1 }; 

    switch(mode) { 

     case MODE.FLY: 

      controls = new THREE.TrackballControls(camera); 

      mode = MODE.TRACKBALL; 

      break; 

     case MODE.TRACKBALL: 

      controls = new THREE.FlyControls(camera); 

      mode = MODE.FLY; 

      break; 

    } 

} 
+1

¡Aaand, it works! Pasé tanto tiempo luchando con rotaciones y cuaterniones y la solución fue realmente así de simple, ¡increíble! Gracias Sr. Doob! – Pantelis

+1

tal vez no seguí la pregunta lo suficientemente cerca, pero ¿por qué se necesita una cámara nueva? ¿No podemos usar la misma cámara simplemente cambiar su vista/posición/rotación con diferentes controles? –

0

Hacer una nueva cámara es la forma más fácil de desatar todos los eventos de teclado/ratón que estaban configurados con los controles anteriores. Si no haces esto, tendrás orbit control de eventos de fuego con el modo volar activado.

Cuestiones relacionadas