2012-08-01 22 views
6

Có cách nào để xác định kích thước và vị trí của mô hình và sau đó tự động căn giữa và chia tỷ lệ mô hình sao cho nó được đặt ở gốc và trong chế độ xem của Máy ảnh? Tôi thấy rằng khi tôi nhập một mô hình Collada từ Sketchup, nếu mô hình không được căn giữa tại nguồn gốc trong Sketchup, thì nó không nằm trong ba.js. Mặc dù điều đó có ý nghĩa, nhưng sẽ tốt hơn nếu tự động căn giữa để xuất xứ sau khi nhập.Smart Centering and Scaling after Model Import trong ba.js

Tôi đã xem một số cuộc thảo luận trong các trình tải tệp khác nhau về việc giới hạn mô hình đã nhập, nhưng tôi không thể tìm thấy bất kỳ tham chiếu nào về cách thực hiện điều đó.

Vấn đề mở rộng không quan trọng, nhưng tôi cảm thấy nó liên quan đến chức năng giới hạn, đó là lý do tại sao tôi cũng hỏi nó.

EDIT:

Thông tin thêm sau khi chơi xung quanh một chút và một vài chi tiết tìm kiếm google ...

Mã cho hàm callback của tôi trên tải file collada nay trông như thế này:

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

Điều này tạo ra một số dữ liệu thú vị về mô hình. Tôi có thể có được một tọa độ tổng thể cực đoan cho mô hình, mà tôi giả định (có lẽ không chính xác) sẽ gần với một hộp giới hạn tổng thể cho mô hình. Nhưng cố gắng làm bất cứ điều gì với các tọa độ đó (như trung bình và di chuyển mô hình đến mức trung bình) sẽ tạo ra các kết quả không phù hợp.

Ngoài ra, có vẻ như không hiệu quả khi phải lặp qua mọi hình học cho một mô hình, có cách nào tốt hơn không? Nếu không, liệu logic này có thể được áp dụng cho các bộ tải khác không?

+0

Những điều này sẽ giúp http://stackoverflow.com/questions/14614252/how-to-fit-camera-to-object http://stackoverflow.com/questions/20059612/calculate-camera-zoom-required -for-object-to-fit-in-screen-height http://stackoverflow.com/questions/11274358/adjusting-camera-for-visible-three-js-shape http://stackoverflow.com/câu hỏi/16462848/ba-js-zoom-to-fit-chiều rộng-của-đối tượng-bỏ qua-chiều cao – gaitat

Trả lời

2

Bạn có thể sử dụng THREE.Box3#setFromObject để nhận hộp giới hạn của bất kỳ Object3D nào, bao gồm mô hình được nhập, mà không phải tự mình lặp lại hình học. Vì vậy, bạn có thể làm điều gì đó như

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

để nhận được hộp giới hạn cực đoan của mô hình; sau đó bạn có thể sử dụng bất kỳ kỹ thuật nào trong các câu trả lời mà gaitat được liên kết để đặt đúng vị trí của máy ảnh. Ví dụ, bạn có thể làm theo kỹ thuật này (How to Fit Camera to Object) và làm điều gì đó như:

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

fiddle nhanh: http://jsfiddle.net/p19r9re2/.