2012-08-01 34 views
6

Modelin boyutunu ve konumunu belirleme ve sonra otomatik merkezleme ve modeli ölçeklendirmenin bir yolu var. kamera? Sketchup'dan bir Collada modelini içe aktardığımda, modelin Sketchup'daki orijinde ortalanmış olmaması durumunda, o zaman bu üç.js'de ortalanmıyor. Bu mantıklı olsa da, ithal edildikten sonra orijinin otomatik olarak merkezlenmesi güzel olurdu.Modelden sonra Akıllı Merkez Oluşturma ve Ölçekleme üç.js'de içe aktar

Farklı dosya yükleyicilerinde, içe aktarılan modelin sınırlarını alma konusunda bazı tartışmalar gördüm, ancak bunun nasıl yapılacağına dair herhangi bir başvuru bulamadık.

Ölçekleme sorunu daha az önemli, ancak bir sınır işleviyle ilgili olduğunu düşünüyorum, bu yüzden de sordum.

DÜZENLEME:

biraz ve birkaç daha google aramalarında etrafında oynadıktan sonra

diğer bilgiler ...

şimdi Collada dosyası yüklenirken benim geri arama işlevi için kodu şöyle görünüyor:

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.... 

Bu, model hakkında bazı ilginç veriler oluşturuyor. Model için genel bir sınırlayıcı kutunun olabileceğini düşündüğüm model için genel bir aşırı koordinat alabilirim (muhtemelen yanlış). Fakat bu koordinatlarla bir şey yapmaya çalışmak (modeli ortalamaya göre ortalamaya taşımak ve hareket ettirmek gibi) tutarsız sonuçlar doğurur.

Ayrıca, bir model için her bir geometri boyunca döngü yapmak zorunda kalmamak, daha iyi bir yol var mı? Değilse, bu mantık diğer yükleyicilere uygulanabilir mi?

+0

http://stackoverflow.com/questions/14614252/how-to-fit-camera-to-object http://stackoverflow.com/questions/20059612/calculate-camera-zoom-required -klasöre sığdırmak için ekran yüksekliği http://stackoverflow.com/questions/11274358/adjusting-camera-for-visible-three-js-shape http://stackoverflow.com/soru/16462848/üç-jS-yakınlaştırma sığdırmak için genişlik-of-nesneleri-göz ardı yükseklikte – gaitat

cevap

2

THREE.Box3#setFromObject öğesini kullanarak, içe aktarılan bir model dahil olmak üzere, herhangi bir Object3D ürününün sınırlayıcı kutusunu geometrilerin içinden geçmenize gerek kalmadan kullanabilirsiniz. Böylece, modelin aşırı sınırlayıcı kutusunu almak için

gibi bir şey yapabilirsiniz; daha sonra kamera pozisyonunu doğru olarak ayarlamak için gaitatın birbirine bağladığı cevaplardaki tekniklerden herhangi birini kullanabilirsiniz. Örneğin, bu tekniği (How to Fit Camera to Object) izleyin ve böyle bir şey yapabileceğini:

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

Hızlı keman: http://jsfiddle.net/p19r9re2/. Bunlar yardımcı olmalıdır

İlgili konular