2012-08-18 26 views
6

मुझे तीन। फ्रस्टम ऑब्जेक्ट से निपटने के लिए कुछ मदद की ज़रूरत है।तीन का उपयोग करके निकट/दूर विमान शिखरों की गणना करें। फ्रस्टम

मेरे समस्या:

मैं/के पास अब तक विमान कोने गणना करने के लिए की जरूरत है; मैं इन ट्यूटोरियल

  1. http://www.lighthouse3d.com/tutorials/view-frustum-culling/view-frustums-shape/
  2. http://www.lighthouse3d.com/tutorials/view-frustum-culling/geometric-approach-extracting-the-planes/

पर एक नज़र लिया है और मैं इस समारोह वास्तव में लागू करने (मैं तो आशा) प्रक्रिया समझाया खाका खींचा है (शीर्ष-बाएं पाने के लिए/सही कोने, कैमरा संभालने केवल छोड़ कर सकते हैं देखो और दाएं):

 // Near Plane dimensions 
     hNear = 2 * Math.tan(camera.fov/2) * camera.near; // height 
     wNear = hNear * camera.aspect; // width 

     // Far Plane dimensions 
     hFar = 2 * Math.tan(camera.fov/2) * camera.far; // height 
     wFar = hFar * camera.aspect; // width 

getVertices : function() { 
     var p = camera.position.clone(); 
     var l = getCurrentTarget(); // see below 
     var u = new THREE.Vector3(0, 1, 0); 

     var d = new THREE.Vector3(); 
     d.sub(l, p); 
     d.normalize(); 

     var r = new THREE.Vector3(); 
     r.cross(u, d); 
     r.normalize(); 

     // Near Plane center 
     var dTmp = d.clone(); 
     var nc = new THREE.Vector3(); 
     nc.add(p, dTmp.multiplyScalar(camera.near)); 

     // Near Plane top-right and top-left vertices 
     var uTmp = u.clone(); 
     var rTmp = r.clone(); 
     var ntr = new THREE.Vector3(); 
     ntr.add(nc, uTmp.multiplyScalar(hNear/2)); 
     ntr.subSelf(rTmp.multiplyScalar(wNear/2)); 

     uTmp.copy(u); 
     rTmp.copy(r); 
     var ntl = new THREE.Vector3(); 
     ntl.add(nc, uTmp.multiplyScalar(hNear/2)); 
     ntl.addSelf(rTmp.multiplyScalar(wNear/2)); 

     // Far Plane center 
     dTmp.copy(d); 
     var fc = new THREE.Vector3(); 
     fc.add(p, dTmp.multiplyScalar(camera.far)); 

     // Far Plane top-right and top-left vertices 
     uTmp.copy(u); 
     rTmp.copy(r); 
     var ftr = new THREE.Vector3(); 
     ftr.add(fc, uTmp.multiplyScalar(hFar/2)); 
     ftr.subSelf(rTmp.multiplyScalar(wFar/2)); 

     uTmp.copy(u); 
     rTmp.copy(r); 
     var ftl = new THREE.Vector3(); 
     ftl.add(fc, uTmp.multiplyScalar(hFar/2)); 
     ftl.addSelf(rTmp.multiplyScalar(wFar/2)); 

getCurrentTarget : function() { 
     var l = new THREE.Vector3(0, 0, -100); 
     this.camera.updateMatrixWorld(); 
     this.camera.matrixWorld.multiplyVector3(l); 
     return l; 
    } 

यह काम करने के लिए लगता है, लेकिन ...

+०१२३५१६४१०

मेरे प्रश्न:

मैं एक और अधिक सुरुचिपूर्ण (शायद अधिक सही) रास्ते में एक ही परिणाम प्राप्त कर सकते हैं, एक THREE.Frustum वस्तु का उपयोग कर?

उत्तर

5

Three.Frustum वास्तव में आपकी मदद करने वाला नहीं है - यह विमानों का एक सेट है। अच्छी खबर यह है कि आपका समाधान सही दिखाई देता है, लेकिन इसके बारे में सोचने का एक आसान तरीका है।

var ntr = new THREE.Vector3(wNear/2, hNear/2, -camera.near); 

wNear और hNear की अपनी परिभाषा है, जो सही हैं का उपयोग कर:

के पास विमान के ऊपरी दाहिने कोने इन निर्देशांक के साथ कैमरे अंतरिक्ष में एक बिंदु है।

अब, यह सुनिश्चित करें कि camera.matrixWorld अद्यतन किया जाता है, जिससे आप परिवर्तित दुनिया के लिए उस समय की तरह तो निर्देशांक:

camera.updateMatrixWorld(); 
ntr.applyMatrix4(camera.matrixWorld); 

अब, संकेत फ्लिप अन्य तीन कोनों प्राप्त करने के लिए, और उसके बाद अब तक के लिए गणना दोहराने विमान।

देखें, आपने यह सही किया था; आपने अभी एक और जटिल मार्ग लिया है। :-)

संपादित करें: तीन.जेएस आर 66

+0

आपको बहुत धन्यवाद! मैं व्यर्थ में अपने जीवन को जटिल बना रहा था :-) यह समाधान सरल है और बेहतर काम करता है! – Skarafaz

+0

मैं दृश्यमान स्थान के बाहर कण डालने से बचने के लिए मूल रूप से वही काम करने की कोशिश कर रहा हूं, लेकिन ऐसा नहीं लगता कि सही चीज हो रही है। http://jsfiddle.net/cZb66/ मेरा मतलब है इसका एक उदाहरण है। मुझे उम्मीद है कि कोने के वर्ग स्क्रीन के कोनों पर होंगे लेकिन वे नहीं हैं .... –

+0

@ChrisMorgan यदि आपके कोई प्रश्न है तो आपको एक नई पोस्ट करने की आवश्यकता है। – WestLangley

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

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