2012-06-30 26 views
5

Tôi có một CubeGeometry mà máy ảnh đang xem và tôi muốn máy ảnh phóng to để hình khối có thể nhìn thấy hoàn toàn, nhưng không lớn hơn.Điều chỉnh camera cho hình ảnh Three.js có thể nhìn thấy

nỗ lực ban đầu của tôi là để chuyển đổi verticies cube để camera phối hợp hệ thống,

function toScreenXY(position, camera) { 
    var pos = position.clone(); 
    var projScreenMat = new THREE.Matrix4(); 
    projScreenMat.multiply(camera.projectionMatrix, camera.matrixWorldInverse); 
    projScreenMat.multiplyVector3(pos); 

    return pos; 
} 
function ScaleInView() { 
    camera.fov = 0.0; 
    for (var i=0; i<8; i++) { 
    proj2d = toScreenXY(cube.geometry.vertices[i],camera); 
    angle = 57.296 * Math.max(Math.atan(proj2d.x/proj2d.z), Math.atan(proj2d.y/proj2d.z)); 
    camera.fov = Math.max(camera.fov,angle); 
    } 
    camera.updateProjectionMatrix(); 
} 

Tôi nghĩ điều này sẽ làm việc, nhưng đôi khi nó quá nhỏ, và thời điểm khác quá lớn (tùy thuộc vào vị trí của các Máy ảnh).

Tôi cũng cần thực hiện việc này cho Máy ảnh chỉnh hình.

Edit: tôi biết làm thế nào để làm điều này khi khối lập phương đang đối mặt với máy ảnh, tôi đang tìm kiếm một cách để làm điều đó khi camera được chuyển đến một số tùy ý (r, theta, phi) vị trí (tọa độ cực hình cầu; r thực sự là hằng số cho mục đích của tôi).

Trả lời

2

Nhân với camera.matrixWorldInverse cho một vectơ trong tọa độ của máy ảnh, nhưng quan trọng không áp dụng phối cảnh.

function toCameraCoords(position) { 
    return camera.matrixWorldInverse.multiplyVector3(position.clone()); 
} 

Sau đó, chúng tôi có thể tìm thấy góc nhỏ nhất phù hợp với tất cả các góc hộp trong cảnh. arctan (D.x/D.z) cho góc BCD trong đó B là cái mà máy ảnh đang xem, C là vị trí của máy ảnh và D vị trí của vật thể bạn muốn hiển thị trong tọa độ camera.

Trong trường hợp của tôi, những điều sau đây đảm bảo rằng hộp giới hạn khối lập phương hiển thị đầy đủ.

function ScaleInView() { 
    var tmp_fov = 0.0; 

    for (var i=0; i<8; i++) { 
    proj2d = toCameraCoords(boundbox.geometry.vertices[i]); 

    angle = 114.59 * Math.max(// 2 * (Pi/180) 
     Math.abs(Math.atan(proj2d.x/proj2d.z)/camera.aspect), 
     Math.abs(Math.atan(proj2d.y/proj2d.z)) 
    ); 
    tmp_fov = Math.max(tmp_fov, angle); 
} 

camera.fov = tmp_fov + 5; // An extra 5 degrees keeps all lines visible 
camera.updateProjectionMatrix(); 
} 
3

Camera quan sát. Nếu máy ảnh tập trung và xem khối trực diện, xác định

dist = khoảng cách từ máy ảnh vào mặt trước (quan trọng!) Của khối

height = chiều cao của khối lập phương.

Nếu bạn đặt lĩnh vực-of-view camera như sau

fov = 2 * Math.atan(height/(2 * dist)) * (180/Math.PI); 

sau đó chiều cao khối sẽ phù hợp với chiều cao có thể nhìn thấy.

Máy ảnh chính thống. Nếu máy ảnh tập trung và xem khối trực diện, xác định

aspect = tỷ lệ khía cạnh của cửa sổ của bạn (ví dụ, chiều rộng/chiều cao)

height = chiều cao của khối này.

Sau đó xây dựng máy ảnh của bạn theo cách này:

camera = new THREE.OrthographicCamera(-aspect * height/2, aspect * height/2, height/2, -height/2, near, far); 

Chiều cao khối sẽ phù hợp với chiều cao có thể nhìn thấy.

Trong cả hai trường hợp, nếu máy ảnh không được căn giữa, hoặc nếu không xem khối lập phương ở một góc thì vấn đề sẽ phức tạp hơn.

Ngoài ra, nếu cửa sổ hẹp hơn chiều cao thì chiều rộng là yếu tố hạn chế và vấn đề phức tạp hơn.

+0

Tôi phải rõ ràng hơn trong câu hỏi ban đầu của mình. Những gì tôi đang cố gắng làm là tự động phóng to hoặc thu nhỏ khi camera quay xung quanh khối lập phương. Đó là, khi nó đang xem khối lập phương ở một góc. Tôi đã chỉnh sửa câu hỏi để làm rõ điều này. – sn6uv

+0

Bạn sẽ tìm thấy chiều cao của khối lập phương bằng cách tính toán hộp giới hạn như thế nào? Chúng ta sẽ nhận được hộp giới hạn của mô hình sau khi khởi tạo máy ảnh. –

Các vấn đề liên quan