2012-05-04 22 views
8

arası bir arama sırasında nasıl görüntüleyeceğimi görmek için, bir kameranın fov'unu sahnede tıklatılan bir nesneye göre ara vermek için aralar kullanarak deneme yapıyorum. Bunu yapmak istediğim, kameranın odağını tıklatılmış olan nesneye geçirmesini sağlamaktır, bu da çalışmıyor. İşte tıklama için benim kod:three.js - kameranın bir nesneyi

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

ve tween/kamera hareketi için kodum:

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

kamera düzgün görüş alanını arasını doldurma, ancak göründüğü aynı sivri kalmak lookAt komutunda belirtilen "camTarget" vektörüne geçmek yerine her zaman yöneldi.

cevap

12

İşleyici, THREE.Camera.target (THREE.Object3D olan) değerine bakmak üzere varsayılan olarak kameranın dönüşünü ayarlayan THREE.Camera.update() öğesini çağırır. Yerine yapmanın ...

camera.lookAt(camTarget); 

... deneyin ... Ben camTarget arası doldurulmuş olduğu, ya da belki sadece yeni nesneye geçiş nasıl izleyin emin değilim

camera.target.position.copy(camTarget); 

?

Yan not: Olay işleyicilerinde yüksek hesaplama yapılmaması önerilir - en iyi dünyalarda, olay işleyicide bir bayrak ayarlarsınız ve işlem döngüsünde işlem yaparsınız.

+0

Ah - evet, doğru yere bakma sorunu, onu olay işleyicisine koydum, animasyon döngüsüne değil. LookAt() kullanıp copy() işlevini kullanamadım. Güzel yakalayış. Nasıl doldurulacağı konusunda emin değilim. Kamerayı fov gibi hareket ettirerek, bir canlandırma fonksiyonuna yerleştirerek, lookAt fonksiyonunun da dinamik olarak değişeceğini ve bir anlamda, aralarında olduğu gibi görüneceğini düşündüm. Sanırım, kamerayı çalışmak için fov değiştirmek yerine gerçekte hareket ettirmek zorunda kalabilirim. Yine de teşekkürler. – mheavers

+0

Çalıştığına sevindim :) – MikaelEmtinger

+0

@MikaelEmtinger - neden olay işleyicisinde çok fazla yapmamalısınız? – Neil