Переключайте элементы управления threejs (от трекбола до FlyControls и наоборот)
то, что я пытаюсь достичь,-это иметь два режима управления, свободный "полет" и объектно-центрированный (трекбол) и с помощью кнопки плавно переключаться между ними.
Я изначально пытался с TrackBallControls и FlyControls. Проблема с этими двумя заключается в том, что TrackballControls основан на углах Эйлера, а FlyControls-на Квартинионах. Я попытался преобразовать камеру.вектор вращения к кватерниону, выполнив,
quaternion.setFromEuler( target ); //where target, a Vector3 that contains degrees
и настройка положение вручную (поскольку они используют один и тот же объект положения), и в то время как он, казалось, работал, поворот камеры немного - и переключение управления, начали давать ужасно неправильные результаты. Кроме того, захват углов Эйлера из кватерниона (setEulerFromQuaternion) привел к неправильным данным.
Итак, пока я мог переключаться между ними, я никогда не мог синхронизировать их координаты вращения, поэтому "on switch", когда положение камеры правильное, вращение неверно.
PS. Я были некоторые результаты с FirstPersonControls (углы Эйлера также), но экран lat, длинный метод, который он использует, очень подвержен ошибкам и полностью терпит неудачу при вращении оси Z.
2 ответов
Как насчет чего-то подобного?
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;
}
}
создание новой камеры-самый простой способ отменить все события клавиатуры / мыши, которые были настроены с предыдущими элементами управления. Если вы этого не сделаете, у вас будут события orbitcontrols с включенным режимом fly.