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
- http://www.lighthouse3d.com/tutorials/view-frustum-culling/view-frustums-shape/
- 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?
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
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à ... –
@ChrisMorgan Bạn cần tạo một bài đăng mới nếu bạn có câu hỏi. – WestLangley