2012-05-04 15 views
8

así que estoy experimentando con el uso de interpolaciones para interpolar el fov de una cámara basado en un objeto que se hace clic en la escena, que funciona muy bien, pero ahora lo que quiero que haga es que la cámara cambie su enfoque al objeto que se hizo clic, que no está funcionando. Aquí está mi código para el clic:three.js - cómo hacer que la cámara mire un objeto durante una interpolación

function onDocumentMouseDown(event) { 
    event.preventDefault(); 

    var vector = new THREE.Vector3((event.clientX/window.innerWidth) * 2 - 1, - (event.clientY/window.innerHeight) * 2 + 1, 0.5); 
    var ray = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize()); 
    var intersects = ray.intersectObjects(objects); 
    if (intersects.length > 0) { //We've clicked a certain object 

     camTarget = intersects[0].object.position; //HERE'S THE VECTOR3 I WANT TO LOOK AT 
     camTween.start(); 
    } 
} 

y mi código para el movimiento de interpolación/cámara:

var camUpdate = function(){ 
    camera.fov = currentFov.fov; //WORKING 
    camera.lookAt(camTarget); //NOT WORKING 
    camera.updateProjectionMatrix(); 
} 

var currentFov = { fov: camera.fov }; 

TWEEN.removeAll(); 
camTween = new TWEEN.Tween(currentFov).to({fov: +zoomInFov},tweenTime).easing(camEase).onUpdate(camUpdate); 

La cámara se está interpolando el campo de visión correctamente, pero parece que mantengamos apuntando en la misma dirección siempre se señaló, en lugar de cambiar al vector "camTarget" especificado en el comando lookAt.

Respuesta

12

El procesador llama a THREE.Camera.update(), que establece la rotación de la cámara por defecto para mirar THREE.Camera.target (que es un THREE.Object3D). En vez de hacer ...

camera.lookAt(camTarget); 

... ... tratar

camera.target.position.copy(camTarget); 

No estoy seguro de entender cómo se va a interpolar camTarget, o tal vez sólo debe cambiar al nuevo objeto?

Nota al margen: es aconsejable no realizar cálculos pesados ​​en controladores de eventos: en el mejor de los mundos, establece un indicador en el controlador de eventos y lo procesa en el bucle de renderizado.

+0

Ah, sí, el problema de hacer que vea la ubicación correcta fue que lo puse en el controlador de eventos, no en el ciclo animado. Pude usar lookAt() y no copiar(). Buena atrapada. En cuanto a cómo será interpolado, no estoy seguro. Pensé que al ponerlo en una función animada, a medida que la cámara se movía, la función lookAt también cambiaría dinámicamente, haciendo que se viera, en cierto sentido, como si estuviese interpolada. Supongo que debería mover la cámara en lugar de cambiar el televisor para que funcione. Gracias de nuevo. – mheavers

+0

Me alegra que lo haya hecho funcionar :) – MikaelEmtinger

+0

@MikaelEmtinger: ¿por qué no hacer demasiado en el controlador de eventos? – Neil

Cuestiones relacionadas