2012-10-05 12 views
5

के बीच छेड़छाड़ के समन्वय मुझे एक किरण और एक विमान मिला है। किरण विमान को छेड़छाड़ कर रही है और मैं जानना चाहूंगा कि कहां है। मैं इस चौराहे के विश्व-निर्देशांक कैसे प्राप्त करूं?रे और विमान

(मेरे विशेष मामले मैं कैमरे के लिए स्क्रीन निर्देशांक unproject और किरण पैदा करते हैं। विमान दृश्य की जमीन है)

var vector = new THREE.Vector3(mousePosition.x, mousePosition.y, 1); 
projector.unprojectVector(vector, camera); 
var ray = new THREE.Ray(
    camera.position, 
    vector.subSelf(camera.position).normalize() 
); 
+0

तीन के लिए हाल ही में README में मान लिया गया है .. "* नाम बदलकर' वेक्टर */मैट्रिक्स */Quaternion ''s' स्वयं()/subSelf()/crossSelf() ...' to 'add()/sub()/cross() ...'। –

उत्तर

9

यह सामान्य पैटर्न है। आपको अपनी विशेष स्थिति में फिट करने के लिए इसे अनुकूलित करना पड़ सकता है।

var raycaster = new THREE.Raycaster(); // create once and reuse 
var mouse = new THREE.Vector2(); // create once and reuse 

... 

mouse.x = (event.clientX/renderer.domElement.clientWidth) * 2 - 1; 
mouse.y = - (event.clientY/renderer.domElement.clientHeight) * 2 + 1; 

raycaster.setFromCamera(mouse, camera); 

var intersects = raycaster.intersectObjects(objects, recursiveFlag); 

if (intersects.length > 0) { 

    console.log(intersects[ 0 ].point;); 

} 

यहां, objects एक सरणी है। उदाहरण के लिए,

var objects = []; 

objects.push(plane_mesh); 

संपादित करें: के लिए Three.js r.84

+1

ओह 'पॉइंट' नामक एक विशेषता है। आसान है .. धन्यवाद :) –

+0

r58 के लिए इसे अद्यतन करने के लिए धन्यवाद। मैं दुनिया के लोकल फंक्शन का उपयोग करने के साथ एक विमान (नया तीन। प्लेन जीमेट्री (400, 400, 10, 10)) पर स्थान प्राप्त करने का प्रयास कर रहा हूं, लेकिन निर्देशांक खराब हो रहे हैं, एक्स में सही सीमा है (- 200 से 200), लेकिन वाई थोड़ा छोटा लगता है। क्या यह सामान्य रूप से किया जाएगा? –

+0

@drakej आपको एक नया प्रश्न पोस्ट करना होगा। अपना कोड शामिल करना सुनिश्चित करें। – WestLangley

0

R55 के रूप में अपडेट किया गया, तो आप इस शॉर्टकट का उपयोग कर सकते हैं। यह समान है, लेकिन उस बिंदु पर raycasting को सरल बनाता है जहां आपको unprojectVector() के बारे में भी चिंता करने की ज़रूरत नहीं है।

यहाँ WestLangley के उदाहरण का एक संशोधित संस्करण है:

var vector = new THREE.Vector3(( 
     event.clientX/window.innerWidth) * 2 - 1, 
     - (event.clientY/window.innerHeight) * 2 + 1, 
     0.5 
    ); 

    var ray = projector.pickingRay(vector.clone(), camera); 

    var intersects = ray.intersectObjects(objects); 

    if (intersects.length > 0) { 

     console.log(intersects[ 0 ].point;); 

    } 

यह वही वस्तुओं सरणी

var objects = []; 

objects.push(plane_mesh); 
संबंधित मुद्दे