2012-04-25 11 views
24

En Three.js, quiero que una cámara apunte a un punto en el espacio 3D.ThreeJS camera.lookAt() no tiene ningún efecto, ¿hay algo que estoy haciendo mal?

Para este propósito, he intentado usar la función camera.lookAt así:

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

Sin embargo, he descubierto que la llamada no tiene efecto alguno. Simplemente no hace nada en absoluto. Traté de cambiar los números en el vector, y siempre obtengo el mismo aspecto en la pantalla, cuando debería estar cambiando.

Acabo de encontrar ahora que si elimino el THREE.TrackballControls que tengo en mi código, el camera.lookAt() funciona como debería. ¿Hay algún problema con la forma en que uso THREE.TrackballControls? Esta es la forma en que ellos inicializar:

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 ]*/ 

Y luego, en mi función de hacer que hago:

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

Documentación sobre Three.js es bastante escasa, así que pensé que le pediría aquí. ¿Estoy haciendo algo mal?

+0

Muéstranos más código. Observe esta simple muestra: http://jsfiddle.net/TE5bM/ –

+0

¿Tiene un bucle de actualización en el que vuelve a renderizar la escena? parece que no estás actualizando/renderizando. –

+0

@Juan George: estoy llamando a .lookAt() cuando configuro la escena, antes de que se represente nada, por lo que mi llamada debería tener un efecto. Sin embargo, creo que acabo de encontrar el problema; Tengo THREE.TrackballControls en mi código, lo cual creo que está interfiriendo con lo que le digo a .lookAt(), porque cuando elimino los TRES.TrackballControls, la función .lookAt() funciona como debería. ¿Qué estoy haciendo mal con THREE.TrackballControls? – houbysoft

Respuesta

40

Si examina el código fuente de THREE.TrackballControls, me di cuenta de que yo puedo hacer la mirada de la cámara donde quiero estableciendo trackballControls.target a la THREE.Vector3 lo quiero a la vista, y luego rerendering la escena.

+2

¡Gracias! ¡Busqué la respuesta en Google para siempre, finalmente! –

+2

¡Respuesta correcta! Establecer controls.target = new THREE.Vector3 (1500, 500, 0); donde 1500, 500, 0 es mi objetivo deseado para mirar – theprof

+2

Sí, precisamente el problema que estoy enfrentando y para el cual publiqué una nueva pregunta [aquí] (http://stackoverflow.com/questions/26557252/inverse-of) -camera-lookat). En mi caso, cambiar manualmente el código fuente de 'THREE.OrbitControls' por inicializar su propiedad' target' al mismo vector pasado a 'camera.lookAt()' es ** no ** factible, prefiero pensar en una función inversa para poder escribir algo como 'target = getLookAtVectorFor (camera)' y nunca tener que cambiar el código fuente de 'OrbitControls.js' cada vez que cambio el vector lookAt de mi cámara. –

3

Sí, tenga en cuenta ... Parece que tener THREE.TrackballControls o THREE.OrbitControls parece anular la función camera.lookAt que está pasando en la cámara cuando crea una instancia de los controles. Es posible que desee deshacerse de los controles y luego realizar camera.lookAt() o interpolar su cámara de otra forma para verificar que los controles tengan un efecto predominante en su cámara. Busqué en Google por un tiempo por qué camera.lookat() parecía no tener ningún efecto.

0

Me di cuenta. Para evitar THREE.TrackballControls o THREE.OrbitControls anule camera.lookAt tras la inicialización, es necesario cambiar la línea que establece la propiedad del control de target para igualar el suma del vector camera.position y el vector camera.getWorldDirection(), en lugar de cómo se implementa utilizando actualmente una new THREE.Vector3() (que de forma predeterminada a (0, 0, 0)).

Así, por THREE.TrackballControls, cambiar la línea 39 a:

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

Lo mismo va para THREE.OrbitControls, en la línea 36. I actaully no lo he probado en TrackballControls.js pero trabaja en OrbitControls.js. Espero que esto ayude.

0

Aquí hay una solución alternativa: crear un objeto (es decir, cubo) con 0 dimensiones.

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

En la función de render, ajuste la cámara.lookAt en la posición de la cámara.

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

A continuación, sólo se mueven en torno cameraTarget como desee.

1

En mi opinión, se supone que no debemos meternos con el código original.Encontré una forma de lograr el objetivo de mirar un punto en particular. Después de haber declarado su "de control" variable, basta con ejecutar estas dos líneas de código:

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

Tenga en mente que esto va a cambiar el centro de la atención a su nuevo objetivo. En otras palabras, su nuevo objetivo será el centro de todas las rotaciones de la cámara. Algunas partes serán difíciles de ver cuando te familiarices para manipular la cámara asumiendo el centro predeterminado. Intente acercar tanto como pueda y tendrá una idea de lo que estoy diciendo Espero que esta ayuda.

Cuestiones relacionadas