2012-10-11 28 views
8

¿Alguien sabe si el control del trackball se puede modificar para mantener el horizonte a la altura y la forma en que se puede modificar?control de trackball three.js sin el rollo

Al establecer axis.x y axis.z en 0, detiene el rolido pero también detiene la capacidad de girar sobre el objeto.

El control de la órbita está cerca de lo que estoy buscando pero no tiene la capacidad de pan.

¿Algún ayuda?

+5

'OrbitControls' ahora admite el paneo en three.js r.58. – WestLangley

+0

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 –

+0

Estoy de acuerdo con esto, aunque no sé cómo convertir su comentario en una respuesta. – gimg1

Respuesta

0

Esto parece funcionar para mí, todavía trabajando en las matemáticas detrás de él. [edit] Uso camera.lookAt(someObj) primero, luego esto.

camera.rotation.z = Math.sin(camera.rotation.y)/3.5 
+0

Eso no funciona para mí – Tyguy7

3

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); 

}; 
+1

Suponiendo que funciona, no cree una instancia de un objeto nuevo. 'this.object.up.set (0, 1, 0);' – WestLangley