OrbitControl или TrackballControl



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



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



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



Но, как уже упоминалось, это на самом деле не работает стабильно.



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



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



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



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



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



С Уважением-Misa

511   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(). Проверьте исходный код.

Три.Яш Р.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();

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

Comments

    Ничего не найдено.