OrbitControl или TrackballControl

Я много читал об этих 2 элементах управления, и в настоящее время я использую TrackballControls.

Мне нужно повернуть объект вдоль всех трех осей (оба элемента управления уже делают это), но мне также нужно установить иногда новое положение/вращение камеры вручную. И это на самом деле не работает.

мое решение - отключить trackballcontrols, получить кватернионы-объект новой позиции, примените их к камере.вверх а затем включить камера

но как уже упоминалось, это не стабильный.

Я читал, что OrbitControls может быть лучшим решением для такой задачи. Но OrbitControls имеет "ограничение" на вертикальное вращение объектов, и мне нужно вращать мои объекты без ограничений.

Итак, мои вопросы:

1. какая система управления больше подходит для моей задачи

2. если это трекбол - как бы вы установили вручную новую камеру положение и вращение? И если это Орбита - есть ли способ отключить этот предел вертикального вращения?

Спасибо большое!!

С Уважением - МИСиС

2 ответов


прежде всего,TrackballControls и OrbitControls повернуть камера, а не объекты.

во-вторых,OrbitControls применяет камеру up направлении, и TrackballControls позволяет камере вращаться вверх-вниз.

TrackballControls есть reset() метод, который восстанавливает target (центр вращения), фотоаппарат position и фотоаппарат up вектор к исходным значениям.

controls.reset();

приведенный выше код восстановит исходный position, target, и up вектор. Вы также можете изменить их, если хотите, прежде чем звонить controls.reset().

controls.position0.set( 0, 0, 10 ); // set a new desired position
controls.target0.set( 0, 0, 0 ); // set a new target
controls.up0.set( 0, 1, 0 ); // set a new up vector
controls.reset();

читать reset() исходный код функции, чтобы вы понимали, что он делает.

EDIT:OrbitControls Теперь reset() метод, слишком. Проверьте исходный код.

три.js r.82


чтобы заставить TrackballControls ' вращаться только по горизонтали, найдите реализацию функции getMouseProjectionOnBall и добавьте одну строку:

var getMouseProjectionOnBall = (function() {
    var vector = new THREE.Vector3();
    var objectUp = new THREE.Vector3();
    var mouseOnBall = new THREE.Vector3();

    return function(pageX, pageY) {
      mouseOnBall.set(
        (pageX - _this.screen.width * 0.5 - _this.screen.left) / (_this.screen.width * 0.5),
        (_this.screen.height * 0.5 + _this.screen.top - pageY) / (_this.screen.height * 0.5),
        0.0);

      mouseOnBall.setY(0); // add this

      var length = mouseOnBall.length();

Я все еще работаю над ограничением угла в диапазоне, а не отключением его...