2012-07-03 7 views
7

Staram się osiągnąć dwa tryby sterowania, wolny "latający" i jeden obiektowo (trackball) i płynnie naciskając przycisk przełącz się między nimi.Przełączaj kontrolki threejs (od TrackBall do FlyControls i na odwrót)

Początkowo próbowałem z TrackBallControls i FlyControls. Problem z tymi dwoma polega na tym, że TrackballControls opiera się na kątach Eulera, a FlyControls opiera się na Quartenions. Próbowałem konwersji wektor camera.rotation do kwaterniony wykonując,

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

i ręczne ustawianie pozycji (ponieważ oni używają tego samego obiektu pozycja), a gdy wydawało się działać, obracanie kamery A bit - i przełączanie elementów sterujących zaczęło dawać strasznie złe wyniki. Ponadto, chwytanie kątów Eulera z kwaternionu (setEulerFromQuaternion) spowodowało błędne dane.

Tak więc, chociaż mogłem przełączać się między nimi, nigdy nie byłem w stanie zsynchronizować ich współrzędnych obrotu, więc "na przełączniku", gdy pozycja kamery jest prawidłowa, obrót jest nieprawidłowy.

PS. Miałem pewne wyniki z FirstPersonControls (również pod różnymi kątami), ale ekran lat, długa metoda, której używa, jest bardzo podatny na błędy i kończy się niepowodzeniem, gdy występuje rotacja osi Z.

Odpowiedz

13

Co powiesz na coś takiego?

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, działa! Spędziłem tyle czasu na walce z rotacjami i kwaterami, a rozwiązanie było naprawdę proste, niesamowite! Dzięki, Panie Doob! – Pantelis

+1

Może nie podążałem za pytaniem wystarczająco blisko, ale dlaczego potrzebna jest nowa kamera? Czy nie możemy użyć tej samej kamery, wystarczy zmienić jej widok/pozycję/rotację za pomocą różnych elementów sterujących? –

0

Tworzenie nowego aparatu jest najprostszym sposobem, aby rozwiązać wszystkie zdarzenia klawiatury/myszy, które były setup z poprzednich kontroli. Jeśli tego nie zrobisz, zdarzenia orbitcontrolów będą uruchamiane z włączonym trybem latania.