2012-08-18 24 views
6

Tôi cần một số trợ giúp để xử lý đối tượng BA.rustum.Tính toán các đỉnh phẳng gần/xa bằng cách sử dụng BA.Frustum

Vấn đề của tôi:

Tôi cần tính các đỉnh gần/xa; Tôi đã lấy một cái nhìn tại những hướng dẫn

  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/

và tôi đã phác thảo chức năng này thực hiện một cách chính xác (Tôi hy vọng như vậy) các thủ tục giải thích (chỉ để có được trên bên trái/đỉnh phải, giả sử máy ảnh có thể chỉ nhìn bên trái và bên phải):

 // 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; 
    } 

Điều này dường như làm việc nhưng ...

Câu hỏi của tôi:

Tôi có thể có được kết quả tương tự một cách thanh lịch hơn (có thể chính xác hơn) bằng cách sử dụng đối tượng THREE.Frustum không?

Trả lời

5

Three.Frustum không thực sự giúp bạn - đó là một tập hợp các mặt phẳng. Tin tốt là giải pháp của bạn xuất hiện chính xác, nhưng có một cách dễ dàng hơn để suy nghĩ về điều này.

Các góc trên bên phải của máy bay gần là một điểm trong không gian máy ảnh với các tọa độ:

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

sử dụng định nghĩa của bạn về wNearhNear, đó là chính xác.

Bây giờ, đảm bảo rằng camera.matrixWorld được cập nhật, bạn chuyển đổi mà điểm đến trên thế giới phối như sau:

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

Bây giờ, lật những dấu hiệu để có được ba góc khác, và sau đó lặp lại các tính toán cho đến nay máy bay.

Xem, bạn đã làm đúng; bạn chỉ cần một con đường phức tạp hơn. :-)

CHỈNH SỬA: được cập nhật thành ba.js r.66

+0

Cảm ơn bạn rất nhiều! Tôi đã làm phức tạp cuộc sống của tôi vô ích :-) Giải pháp này đơn giản hơn và hoạt động tốt hơn! – Skarafaz

+0

Tôi đang cố gắng làm điều tương tự về cơ bản, để tránh đặt các hạt bên ngoài vùng hiển thị, nhưng nó không giống như điều đúng đang xảy ra. http://jsfiddle.net/cZb66/ là một ví dụ về ý tôi. Tôi hy vọng các ô vuông ở góc của màn hình nhưng chúng không phải là ... –

+0

@ChrisMorgan Bạn cần tạo một bài đăng mới nếu bạn có câu hỏi. – WestLangley

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