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();
Я все еще работаю над ограничением угла в диапазоне, а не отключением его...