OrbitControl или TrackballControl
Я много читал об этих 2 элементах управления и в настоящее время использую TrackballControls.
Мне нужно повернуть объект вдоль всех трех осей (оба элемента управления уже делают это), но мне также иногда нужно установить новое положение камеры/поворот вручную. И это на самом деле не работает.
Мой обходной путь состоит в том, чтобы
отключить trackballcontrols,
получить кватернионы-объект новой позиции,
примените их к камере.вверх
а затем включите камеру
Но, как уже упоминалось, это на самом деле не работает стабильно.
Я читал, что OrbitControls может быть лучшим решением для такой задачи. Но OrbitControls имеет "ограничение" на вертикальное вращение объектов, и мне нужно вращать свои объекты без ограничений.
Итак, мои вопросы:
1. Какая система управления больше подходит для моей задачи
2. Если это трекбол - как бы вы вручную установили новое положение камеры и поворот? А если это Орбита - есть ли способ отключить эту вертикаль предел вращения?
Большое спасибо!!
С Уважением-Misa
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