Ha sido un tiempo desde que se hizo esta pregunta, pero me encontré con el mismo problema y no encontró mucha discusión en línea, así que pensé que había puesto mi solución.
Si tiene que usar TrackballControls y que desea un horizonte plano, sólo tiene que editar la biblioteca TrackballControls.js agregando la siguiente línea al final del método de la 'this.rotateCamera'
this.object. up = new THREE.Vector3 (0,1,0); Esto bloquea la dirección de la cámara en la dirección (0,1,0) (es decir, en la dirección y). Toda la función de método modificado leería entonces:
this.rotateCamera = function() {
var angle = Math.acos(_rotateStart.dot(_rotateEnd)/_rotateStart.length()/_rotateEnd.length());
if (angle) {
var axis = (new THREE.Vector3()).crossVectors(_rotateStart, _rotateEnd).normalize();
quaternion = new THREE.Quaternion();
angle *= _this.rotateSpeed;
quaternion.setFromAxisAngle(axis, -angle);
_eye.applyQuaternion(quaternion);
_this.object.up.applyQuaternion(quaternion);
_rotateEnd.applyQuaternion(quaternion);
if (_this.staticMoving) {
_rotateStart.copy(_rotateEnd);
} else {
quaternion.setFromAxisAngle(axis, angle * (_this.dynamicDampingFactor - 1.0));
_rotateStart.applyQuaternion(quaternion);
}
}
// Lock the camera up direction
this.object.up = new THREE.Vector3(0,1,0);
};
'OrbitControls' ahora admite el paneo en three.js r.58. – WestLangley
Creo que el comentario de WestLangley debe convertirse en una respuesta para que se le pueda otorgar la recompensa; parece responder a la pregunta, por lo que puedo decir, OrbitControls tiene toda la funcionalidad de los controles Trackball, excepto que no hay rollo, por lo tanto el horizonte se mantendrá nivelado –
Estoy de acuerdo con esto, aunque no sé cómo convertir su comentario en una respuesta. – gimg1