2012-08-18 8 views
6

THREE.Frustumオブジェクトを扱うにはいくつかの助けが必要です。THREE.Frustumを使用して近平面/遠平面の頂点を計算します。

私の問題:私は遠い/近い平面の頂点を計算する必要が

。私はこれらのチュートリアル

  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/

を見て撮影したと私はちょうど左上取得する(正確に実装し、この関数(私はそう願っています)手順を説明スケッチしました/右の頂点、カメラを仮定すると、唯一の左と右の見ることができます):

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

これは動作するようですが、...

私の質問:THREE.Frustumオブジェクトを使用して、より洗練された(多分正しい)方法で同じ結果を得ることができますか?

答えて

5

Three.Frustumは実際にあなたを助けるつもりはありません - それは飛行機のセットです。良いニュースはあなたの解決策が正しいように見えますが、これについて簡単に考える方法があります。

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

正しいwNearhNearのあなたの定義を、使用して:

近い平面の右上隅には、これらの座標とカメラ空間内のポイントです。その後、

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

、他の三つの角を取得するためにサインを反転し、遠くのための計算を繰り返す:今すぐ

camera.matrixWorldが更新されたことを確認して、あなたは世界にそのポイントを変換するので、同様に座標飛行機。

ご覧ください。あなたはちょうどもっと複雑なルートをとった。 :-)

EDIT:r.66

+0

はどうもありがとうございましthree.jsように更新!私は無駄に私の人生を複雑にしていた:-)このソリューションは簡単で、より良い作品です! – Skarafaz

+0

私は目に見える空間の外に粒子を置くのを避けるために、基本的に同じことをしようとしていますが、正しいことが起きているようには見えません。 http://jsfiddle.net/cZb66/は、私が意味するものの一例です。私は角の四角が画面の角にあることを期待しましたが、彼らはそうではありません.... –

+0

@ChrisMorganあなたは質問がある場合は、新しい投稿をする必要があります。 – WestLangley

関連する問題