2012-04-25 19 views
24

थ्री.जेएस में, मैं चाहता हूं कि 3 डी स्पेस में एक बिंदु पर कैमरे को इंगित किया जाए।थ्रीजेएस कैमरा .lookAt() का कोई प्रभाव नहीं है, क्या मैं कुछ गलत कर रहा हूं?

इस प्रयोजन के लिए, मैं इतना की तरह camera.lookAt समारोह उपयोग करने की कोशिश:

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

हालांकि, मुझे पता चला कॉल कोई प्रभाव पड़ता है। यह बिल्कुल कुछ भी नहीं करता है। मैंने वेक्टर में संख्याओं को बदलने की कोशिश की, और मुझे हमेशा स्क्रीन पर एक ही नजर आती है, जब इसे बदलना चाहिए।

मुझे अभी पता चला है कि अगर मैं THREE.TrackballControls को हटा देता हूं तो मेरे कोड में camera.lookAt() काम करता है। क्या मैं तीन.TrackballControls का उपयोग करने में कुछ गड़बड़ कर रहा हूं? Three.js पर

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

प्रलेखन बहुत दुर्लभ है, इसलिए मैंने सोचा कि मैं यहाँ से पूछना चाहते हैं: यह कैसे मैं उन्हें प्रारंभ है: मुझे क्या करना

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

और फिर मेरी समारोह प्रस्तुत करना है। क्या मुझसे कुछ गलत हो रही है?

+0

हमें और कोड दिखाएं। इस सरल नमूना को देखें: http://jsfiddle.net/TE5bM/ –

+0

क्या आपके पास एक अपडेट लूप है जिसमें आप दृश्य को फिर से प्रस्तुत करते हैं? ऐसा लगता है कि आप अपडेट/प्रतिपादन नहीं कर रहे हैं। –

+0

@ जुआन जॉर्ज: मैं कॉल कर रहा हूं .lookAt() जब मैंने दृश्य स्थापित किया, कुछ भी प्रस्तुत करने से पहले, तो मेरी कॉल का असर होना चाहिए। हालांकि, मुझे लगता है कि मुझे अभी समस्या मिली है; मेरे पास तीन कोड हैं। मेरे कोड में ट्रैकबॉल नियंत्रण, जो मुझे लगता है कि मैं जो कहता हूं उससे हस्तक्षेप कर रहा हूं .lookAt(), क्योंकि जब मैं तीन को हटा देता हूं। ट्रेकबॉल नियंत्रण, .lookAt() फ़ंक्शन काम करता है जैसा कि करना चाहिए। मैं तीन के साथ क्या गलत कर रहा हूँ। ट्राइकबॉल नियंत्रण? – houbysoft

उत्तर

40

THREE.TrackballControls के स्रोत कोड को देखते हुए, मैं पता लगा है कि मैं कैमरे के देखो जहाँ मैं THREE.Vector3 मैं इसे देखना चाहते हैं के लिए trackballControls.target की स्थापना, और फिर दृश्य rerendering द्वारा चाहते हैं कर सकते हैं।

+2

धन्यवाद! मैं हमेशा के लिए जवाब के लिए googled है, अंत में! –

+2

सही उत्तर! नियंत्रण स्थापित करें। लक्ष्य = नया तीन। वेक्टर 3 (1500, 500, 0); जहां 1500, 500, 0 – theprof

+2

को देखने के लिए मेरा वांछित लक्ष्य है हां, ठीक उसी समस्या का सामना कर रहा हूं और जिसके लिए मैंने एक नया quesiton [यहां] पोस्ट किया है (http://stackoverflow.com/questions/26557252/inverse-of -Camera-lookAt)। मेरे मामले में, 'THREE.OrbitControls' के स्रोत कोड को मैन्युअल रूप से बदलकर उसी 'वेक्टर' प्रॉपर्टी को उसी वेक्टर में प्रारंभ करके 'कैमरा' पर पहुंचाया गया है .lookAt()' ** ** ** संभव नहीं है, मैं इसके साथ आना चाहूंगा एक व्यस्त कार्य इसलिए मैं कुछ लक्ष्य लिख सकता हूं जैसे 'target = getLookAtVectorFor (कैमरा)' और जब भी मैं अपने कैमरे के वेक्टर को बदलता हूं तो हर बार 'OrbitControls.js' के स्रोत कोड को बदलना नहीं पड़ता। –

3

हाँ कृपया सावधान रहें ... ऐसा लगता है कि तीन होने के कारण। ट्रेकबॉल नियंत्रण या तीन। ऑर्बिट कंट्रोल्स कैमरे को ओवरराइड करना प्रतीत होता है। देखो जब आप नियंत्रण के उदाहरण को तुरंत चालू करते हैं तो अपने कैमरे में गुज़र रहे हैं। हो सकता है कि आप नियंत्रण से छुटकारा पाएं और फिर कैमरे को निष्पादित करना चाहें .lookAt() या अपने कैमरे को अपने कैमरे पर ओवरराइडिंग प्रभाव वाले नियंत्रण को सत्यापित करने के लिए किसी अन्य तरीके से ट्वेंक करें। मैं थोड़ी देर के लिए googled क्यों कैमरा.lookat() का कोई प्रभाव नहीं लग रहा था।

0

मैंने इसे समझ लिया। प्रारंभ पर camera.lookAt अधिभावी से THREE.TrackballControls या THREE.OrbitControls रोकने के लिए, आप, लाइन है कि नियंत्रण के target संपत्ति सेट camera.position वेक्टर और camera.getWorldDirection() वेक्टर के राशि बराबर करने के लिए बदलने की जरूरत के बजाय कैसे यह वर्तमान में एक new THREE.Vector3() (जो चूक का उपयोग कर लागू हो जाता है (0, 0, 0) पर)।

तो, THREE.TrackballControls, परिवर्तन लाइन 39 तक के लिए:

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

ही, THREE.OrbitControls के लिए चला जाता है लाइन 36. पर मैं actaully TrackballControls.js पर यह परीक्षण नहीं किया है, लेकिन यह OrbitControls.js पर काम करता है। उम्मीद है की यह मदद करेगा।

0

यहां एक वैकल्पिक समाधान है: 0 आयामों के साथ एक ऑब्जेक्ट (यानी घन) बनाएं।

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

रेंडर फ़ंक्शन में कैमरा सेट करें। कैमरा कैमरे की स्थिति पर देखें।

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

फिर कैमरे को चारों ओर स्थानांतरित करें जैसा आप चाहें।

1

मेरी राय में, हमें मूल कोड से गड़बड़ नहीं करना चाहिए।मुझे किसी भी विशेष बिंदु को देखने के उद्देश्य को प्राप्त करने के लिए एक रास्ता मिल गया। के बाद अपने "नियंत्रण" घोषित होने चर, बस कोड की इन दो पंक्तियों को अंजाम:

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

मेरे मन में रखें कि यह आपके नए लक्ष्य से ध्यान देने का केंद्र स्विच करेंगे। दूसरे शब्दों में, आपका नया लक्ष्य कैमरे के सभी घूर्णन का केंद्र होगा। कुछ हिस्सों को देखना मुश्किल होगा क्योंकि आप डिफ़ॉल्ट केंद्र मानते हुए कैमरे में हेरफेर करने के लिए परिचित हो गए थे। जितना हो सके ज़ूम इन करने का प्रयास करें और आपको यह पता चल जाएगा कि मैं क्या कह रहा हूं इस सहायता की आशा करें।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^