2012-08-01 14 views
6

में मॉडल आयात के बाद स्मार्ट सेंटरिंग और स्केलिंग मॉडल के आकार और स्थिति को निर्धारित करने का एक तरीका है और फिर ऑटो-सेंटर और मॉडल को स्केल करने के लिए एक तरीका है ताकि यह मूल पर और इसके दृश्य में स्थित हो कैमरा? मुझे लगता है कि जब मैं स्केचअप से कोलाडा मॉडल आयात करता हूं, तो मॉडल स्केचअप में मूल पर केंद्रित नहीं था, तो यह तीन.जेएस में केंद्रित नहीं है। हालांकि यह समझ में आता है, आयात के बाद ऑटो-ऑटो को मूल करना अच्छा लगेगा।तीन.जेएस

मैंने आयातित मॉडल की सीमा प्राप्त करने के बारे में विभिन्न फ़ाइल लोडरों में कुछ चर्चा देखी है, लेकिन मैं ऐसा करने के लिए कोई संदर्भ नहीं ढूंढ पाया।

स्केलिंग समस्या कम महत्वपूर्ण है, लेकिन मुझे लगता है कि यह एक सीमा कार्य से संबंधित है, इसलिए मैंने इसे भी पूछा।

संपादित करें:

एक सा और कुछ और गूगल खोज के आसपास खेलने के बाद अधिक जानकारी ...

अब COLLADA फ़ाइल लोड हो रहा है पर मेरी कॉलबैक समारोह के लिए कोड इस तरह दिखता है:

loader.load(mURL, function colladaReady(collada) { 

dae = collada.scene; 
skin = collada.skins[ 0 ]; 

dae.scale.x = dae.scale.y = dae.scale.z = 1; 
dae.updateMatrix(); 

//set arbitrary min and max for comparison    
var minX = 100000; 
var minY = 100000; 
var minZ = 100000; 
var maxX = 0; 
var maxY = 0; 
var maxZ = 0; 

var geometries = collada.dae.geometries;    
for(var propName in geometries){ 
if(geometries.hasOwnProperty(propName) && geometries[propName].mesh){ 
    dae.geometry = geometries[propName].mesh.geometry3js; 
    dae.geometry.computeBoundingBox(); 
    bBox = dae.geometry.boundingBox; 
    if(bBox.min.x < minX) minX = bBox.min.x; 
    if(bBox.min.y < minY) minY = bBox.min.x; 
    if(bBox.min.z < minZ) minZ = bBox.min.z; 
    if(bBox.max.x > maxX) maxX = bBox.max.x; 
    if(bBox.max.y > maxY) maxY = bBox.max.x; 
    if(bBox.max.z > maxZ) maxZ = bBox.max.z; 
} 
} 
//rest of function.... 

यह मॉडल के बारे में कुछ दिलचस्प डेटा उत्पन्न कर रहा है। मैं मॉडल के लिए एक समग्र चरम समन्वय प्राप्त कर सकता हूं, जिसे मैं मान रहा हूं (शायद गलत तरीके से) मॉडल के लिए एक समग्र बाउंडिंग बॉक्स के करीब होगा। लेकिन उन निर्देशांकों के साथ कुछ भी करने की कोशिश कर रहे हैं (औसत औसत और मॉडल को औसत पर ले जाना) असंगत परिणाम उत्पन्न करता है।

इसके अलावा, यह मॉडल के लिए हर ज्यामिति के माध्यम से लूप करना अक्षम है, क्या कोई बेहतर तरीका है? यदि नहीं, तो क्या यह तर्क अन्य लोडरों पर लागू किया जा सकता है?

+0

इन्हें http://stackoverflow.com/questions/14614252/how-to-fit-camera-to-object http://stackoverflow.com/questions/20059612/calculate-camera-zoom-required में मदद करनी चाहिए -ऑब्जेक्ट-टू-फिट-इन-स्क्रीन-ऊंचाई http://stackoverflow.com/questions/11274358/adjusting-camera-for-visible-three-js-shape http://stackoverflow.com/प्रश्न/16462848/तीन js ज़ूम करने के लिए फिट-चौड़ाई-ऑफ-द-वस्तुओं अनदेखी ऊंचाई – gaitat

उत्तर

2

आप किसी भी ऑब्जेक्ट 3 डी के बाउंडिंग बॉक्स को प्राप्त करने के लिए THREE.Box3#setFromObject का उपयोग कर सकते हैं, जिसमें आयातित मॉडल भी शामिल है, बिना ज्यामिति के लूप के। तो आप

var bBox = new THREE.Box3().setFromObject(collada.scene); 

मॉडल के चरम बाउंडिंग बॉक्स को प्राप्त करने के लिए कुछ कर सकते हैं; तो आप कैमरे की स्थिति को सही तरीके से सेट करने के लिए गेटैट से जुड़े उत्तरों में से किसी भी तकनीक का उपयोग कर सकते हैं। उदाहरण के लिए, आप इस तकनीक (How to Fit Camera to Object) का पालन करें और की तरह कुछ कर सकता है:

var height = bBox.size().y; 
var dist = height/(2 * Math.tan(f * Math.PI/360)); 
var pos = collada.scene.position; 
camera.position.set(pos.x, pos.y, dist * 1.1); // fudge factor so you can see the boundaries 
camera.lookAt(pos); 

त्वरित बेला: http://jsfiddle.net/p19r9re2/

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