2012-05-04 2 views
8

, поэтому я экспериментирую с использованием твинов для анимации камеры на основе объекта, который нажал на сцену, которая отлично работает, но теперь что я хочу, чтобы камера переключила фокус на объект, который был нажат, что не работает. Вот мой код щелчку:three.js - как заставить камеру смотреть на объект во время анимации

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

и мой код для движения твин/камеры:

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

Камера твининг поле зрения правильно, но, как представляется, оставаться указал в то же направление, на которое всегда указывалось, вместо переключения на вектор «camTarget», указанный в команде lookAt.

ответ

12

Средство визуализации вызывает THREE.Camera.update(), который устанавливает поворот камеры по умолчанию, чтобы посмотреть на THREE.Camera.target (что является THREE.Object3D). Вместо того чтобы делать ...

camera.lookAt(camTarget); 

... попробовать ...

camera.target.position.copy(camTarget); 

Я не уверен, я следую как camTarget анимации движения, или, может быть, он просто должен перейти на новый объект?

Боковое примечание: рекомендуется не выполнять тяжелые вычисления в обработчиках событий - в лучших мирах вы устанавливаете флаг в обработчике событий и обрабатываете в цикле рендеринга.

+0

Ах, да, проблема заставить его взглянуть на правильное местоположение, так это то, что я положил его в обработчик события, а не в цикл анимации. Я смог использовать lookAt(), а не copy(). Хорошо поймал. Насколько он подтянут, я не уверен. Я думал, что, поместив его в одушевленную функцию, поскольку камера переместила его fov, функция lookAt также изменилась бы динамически, заставив ее выглядеть в некотором смысле, как будто это было tweening. Полагаю, мне, возможно, придется переместить камеру, а не менять fov для этого. Еще раз спасибо. – mheavers

+0

Рад, что вы получили его на работу :) – MikaelEmtinger

+0

@MikaelEmtinger - почему вы не должны слишком много делать в обработчике событий? – Neil

Смежные вопросы