2012-05-04 16 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); 

कैमरा ठीक से दृश्य के क्षेत्र Tweening है, लेकिन ऐसा लगता ही में बताया रहने के लिए lookAt कमांड में निर्दिष्ट "camTarget" वेक्टर पर स्विच करने के बजाय, हमेशा दिशा की दिशा में यह निर्देश दिया गया था।

उत्तर

12

प्रस्तुतकर्ता THREE.Camera.update() को कॉल करता है, जो तीन को देखने के लिए डिफ़ॉल्ट रूप से कैमरे के घूर्णन को सेट करता है। कैमरा.target (जो एक THREE.Object3D है)। इसके बजाय ऐसा करने का ...

camera.lookAt(camTarget); 

... कोशिश ...

camera.target.position.copy(camTarget); 

मुझे यकीन है कि मैं कैसे camTarget tweened है, या हो सकता है कि यह सिर्फ नई वस्तु के लिए स्विच करना चाहिए का पालन नहीं कर रहा हूँ?

साइड नोट: यह सलाह दी जाती है कि ईवेंट हैंडलरों में भारी गणना न करें - दुनिया के सर्वश्रेष्ठ में, आप ईवेंट हैंडलर में एक झंडा सेट करते हैं और रेंडर लूप में प्रक्रिया करते हैं।

+0

आह - हाँ, उचित स्थान पर देखने की समस्या यह थी कि मैंने इसे ईवेंट हैंडलर में रखा, न कि एनिमेट लूप। मैं lookAt() का उपयोग करने में सक्षम था और प्रतिलिपि नहीं()। अच्छा पकड़ा। जहां तक ​​यह ट्वेंडेड किया जाएगा, मुझे यकीन नहीं है। मैंने सोचा कि इसे एक एनिमेट फ़ंक्शन में डालकर, जैसे ही कैमरा अपना एफओवी ले जाया गया है, देखो यह फ़ंक्शन गतिशील रूप से बदल जाएगा, इसे एक अर्थ में, जैसा कि यह ट्विनिंग था। मुझे लगता है कि काम करने के लिए एफओवी को बदलने के बजाय मुझे वास्तव में कैमरा ले जाना पड़ सकता है। फिर भी धन्यवाद। – mheavers

+0

खुशी है कि आप इसे काम करने के लिए मिला :) – MikaelEmtinger

+0

@MikaelEmtinger - आपको ईवेंट हैंडलर में इतना अधिक क्यों नहीं करना चाहिए? – Neil