Переключайте элементы управления 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.