2012-04-25 17 views
24

In Three.js, voglio che una telecamera sia puntata in un punto nello spazio 3D.ThreeJS camera.lookAt() non ha alcun effetto, c'è qualcosa che sto facendo male?

Per questo scopo, ho provato utilizzando la funzione camera.lookAt modo:

camera.lookAt(new THREE.Vector3(-100,-100,0)); 

Tuttavia, ho scoperto che la chiamata non ha alcun effetto. Semplicemente non fa niente. Ho provato a cambiare i numeri nel vettore, e ottengo sempre lo stesso aspetto sullo schermo, quando dovrebbe cambiare.

Ho appena trovato ora che se rimuovo lo THREE.TrackballControls che ho nel mio codice, il camera.lookAt() funziona come dovrebbe. C'è qualcosa di sbagliato nel modo in cui utilizzo THREE.TrackballControls? Questo è come io li inizializzo:

controls = new THREE.TrackballControls(camera, renderer.domElement); 

    controls.rotateSpeed = 10.0; 
    controls.zoomSpeed = 1.2; 
    controls.panSpeed = 0.2; 

    controls.noZoom = false; 
    controls.noPan = false; 

    controls.staticMoving = true; 
    controls.dynamicDampingFactor = 1.0; 

    var radius = 5; 
    controls.minDistance = radius * 1.1; 
    controls.maxDistance = radius * 100; 

    controls.keys = [ 65, 83, 68 ]; // [ rotateKey, zoomKey, panKey ]*/ 

E poi nella mia funzione di rendering che faccio:

function render() { 
    controls.update(); 
    renderer.render(scene, camera); 
} 

documentazione sul Three.js è piuttosto scarsa, così ho pensato di chiedere qui. Sto facendo qualcosa di sbagliato?

+0

Mostraci altro codice. Dai un'occhiata a questo semplice esempio: http://jsfiddle.net/TE5bM/ –

+0

hai un ciclo di aggiornamento in cui re-rendering la scena? sembra che tu non stia aggiornando/rendendo. –

+0

@Juan George: Sto chiamando .lookAt() quando imposto la scena, prima che tutto venga reso, quindi la mia chiamata dovrebbe avere un effetto. Tuttavia, penso di aver appena trovato il problema; Ho THREE.TrackballControls nel mio codice, che penso interferisca con ciò che dico .lookAt(), perché quando rimuovo THREE.TrackballControls, la funzione .lookAt() funziona come dovrebbe. Cosa sto sbagliando con THREE.TrackballControls? – houbysoft

risposta

40

Guardando il codice sorgente di THREE.TrackballControls, ho capito che posso fare l'aspetto della fotocamera dove voglio impostando trackballControls.target al THREE.Vector3 lo voglio a guardare, e poi rerendering la scena.

+2

Grazie! Ho cercato su Google la risposta come per sempre, finalmente! –

+2

Risposta corretta! Set controls.target = new THREE.Vector3 (1500, 500, 0); dove 1500, 500, 0 è il mio obiettivo desiderato da guardare – theprof

+2

Sì, proprio il problema che sto affrontando e per il quale ho postato un nuovo quesiton [qui] (http://stackoverflow.com/questions/26557252/inverse-of -Camera-lookat). Nel mio caso, modificando manualmente il codice sorgente di 'THREE.OrbitControls' inizializzando la sua proprietà' target' sullo stesso vettore passato a 'camera.lookAt()' è ** non ** fattibile, preferirei venire con una funzione inversa in modo da poter scrivere qualcosa come 'target = getLookAtVectorFor (camera)' e non dover mai cambiare il codice sorgente di 'OrbitControls.js' ogni volta che cambio il lookAt vettore della mia macchina fotografica. –

3

Sì Si prega di fare attenzione ... Sembra che avere THREE.TrackballControls o THREE.OrbitControls sembra ignorare la funzione camera.lookAt mentre si sta passando nella fotocamera quando si istanzia un'istanza dei controlli. Potresti voler eliminare i controlli e quindi eseguire camera.lookAt() o interpolare la videocamera in un altro modo per verificare che i controlli abbiano un effetto prioritario sulla tua fotocamera. Ho cercato su Google per un po 'il motivo per cui camera.lookat() sembrava non avere alcun effetto.

0

L'ho capito. Per evitare THREE.TrackballControls o THREE.OrbitControls di ignorare camera.lookAt su di inizializzazione, è necessario modificare la riga che imposta proprietà del controllo target per eguagliare il somma del camera.position vettoriale e la camera.getWorldDirection() vettore, invece di come è attualmente implementato utilizzando un new THREE.Vector3() (che di default a (0, 0, 0)).

Così, per THREE.TrackballControls, cambiare linea 39 a:

this.target = new THREE.Vector3().addVectors(/*new line for readability*/ 
    object.position, object.getWorldDirection()); 

Lo stesso vale per THREE.OrbitControls, sulla linea 36. ho actaully non l'ho testato su TrackballControls.js ma funziona su OrbitControls.js. Spero che questo ti aiuti.

0

Ecco una soluzione alternativa: creare un oggetto (ovvero un cubo) con 0 dimensioni.

var cameraTarget = new THREE.Mesh(new THREE.CubeGeometry(0,0,0)); 

Nella funzione rendering impostare il camera.lookAt alla posizione del CameraTarget.

function render() { 
    camera.lookAt(cameraTarget.position); 
    renderer.render(scene, camera); 
} 

Poi basta spostare CameraTarget intorno come si desidera.

1

A mio parere, non dovremmo fare confusione con il codice originale.Ho trovato un modo per raggiungere l'obiettivo di guardare a qualsiasi punto particolare. dopo aver dichiarato la vostra "controllo" variabile, è sufficiente eseguire questi due righe di codice:

// Assuming you know how to set the camera and myCanvas variables 
control = new THREE.OrbitControls(camera, myCanvas); 

// Later in your code 
control.object.position.set(camX, camY, camZ); 
control.target = new THREE.Vector3(targetX, targetY, targetZ); 

Tenete a mente che questo passerà al centro della messa a fuoco per la nuova destinazione. In altre parole, il tuo nuovo target sarà il centro di tutte le rotazioni della telecamera. Alcune parti saranno difficili da guardare man mano che diventerai familiare manipolare la fotocamera assumendo il centro predefinito. Prova a ingrandire il più possibile e avrai un'idea di cosa sto dicendo Spero che questo aiuto.

Problemi correlati