2012-05-04 4 views
8

quindi sto sperimentando l'utilizzo di interpolazioni per interpolare il fov di una telecamera in base a un oggetto su cui è stato fatto clic nella scena, che funziona benissimo, ma ora quello che voglio è fare in modo che la fotocamera si metta a fuoco sull'oggetto su cui è stato fatto clic, che non funziona. Ecco il mio codice per il clic:three.js - come rendere l'inquadratura di un oggetto durante un'interpolazione

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

e il mio codice per il movimento tween/fotocamera:

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 fotocamera è un'interpolazione del campo di vista correttamente, ma sembra per rimanere puntato nella stessa direzione a cui è sempre stato puntato, invece di passare al vettore "camTarget" specificato nel comando lookAt.

risposta

12

Il renderer chiama THREE.Camera.update(), che imposta la rotazione della videocamera per impostazione predefinita su THREE.Camera.target (che è un THREE.Object3D). Invece di fare ...

camera.lookAt(camTarget); 

... provare ...

camera.target.position.copy(camTarget); 

io non sono sicuro di come io seguo camTarget viene interpolata, o forse è solo dovrebbe passare al nuovo oggetto?

Nota a margine: è consigliabile non eseguire calcoli pesanti nei gestori di eventi: nel migliore dei mondi, si imposta un flag nel gestore eventi e si elabora nel ciclo di rendering.

+0

Ah - sì, il problema di fargli vedere la posizione corretta era che l'ho inserito nel gestore di eventi, non nel ciclo animato. Sono stato in grado di utilizzare lookAt() e non copy(). Bella presa. Per quanto riguarda il modo in cui sarà interpolato, non ne sono sicuro. Ho pensato che inserendolo in una funzione animata, mentre la fotocamera muoveva il suo fov, anche la funzione lookAt cambiava in modo dinamico, facendolo apparire, in un certo senso, come se fosse un interpolazione. Suppongo che potrei dover effettivamente spostare la fotocamera piuttosto che cambiare il fov per farlo funzionare. Grazie ancora però. – mheavers

+0

Sono contento che tu abbia funzionato :) – MikaelEmtinger

+0

@ MikaelEmtinger - perché non dovresti fare troppo nel gestore di eventi? – Neil