2012-06-01 40 views

回答

15

也許矩陣不更新?

camera.updateMatrix(); // make sure camera's local matrix is updated 
camera.updateMatrixWorld(); // make sure camera's world matrix is updated 
camera.matrixWorldInverse.getInverse(camera.matrixWorld); 

plane.updateMatrix(); // make sure plane's local matrix is updated 
plane.updateMatrixWorld(); // make sure plane's world matrix is updated 

var frustum = new THREE.Frustum(); 
frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse)); 
alert(frustum.contains(plane)); 
+2

我想知道如果平截頭體包含整個立方體,但它不能使用此方法...我可以使用什麼方法? (我沒有看到[文檔](http://threejs.org/docs/#Reference/Math/Frustum)中列出的任何東西) – CodyBugstein

+0

您可以在該時間點拍攝對象的畫布快照以獲得物體的平面透視圖。找到組成該多邊形快照的行。你已經知道相機矩陣的座標。現在你有一個多邊形在裏面,或者在另一個多邊形的外面/重疊。使用「多邊形多邊形」檢測算法又名掃描線算法來獲得您所需要的! –

3

糾正我,如果我錯了,但爲什麼計算視錐第二次?

我正在處理一個複雜的項目,並且接受的答案對我來說不是最好的解決方案。我看不出重新計算什麼意思。爲了達到我的目的,我修改了我的three.js副本,如果在平截頭體中發現了某種東西,請舉起一面旗幟。後來只是檢查你的對象,如果object.inFrustum ===真

下面以下行

if (webglObjects && (object.frustumCulled === false || _frustum.intersectsObject(object) === true)) { 

添加

object.inFrustum = true; 

也是其中如果塊結束時添加oposite標誌

else { 
    object.inFrustum = false; 
} 

我在r70中的最終結果是完美的:

if (webglObjects && (object.frustumCulled === false || _frustum.intersectsObject(object) === true)) { 

    object.inFrustum = true; // The line to add 

    for (var i = 0, l = webglObjects.length; i < l; i ++) { 

     var webglObject = webglObjects[i]; 

     unrollBufferMaterial(webglObject); 

     webglObject.render = true; 

     if (_this.sortObjects === true) { 

      _vector3.setFromMatrixPosition(object.matrixWorld); 
      _vector3.applyProjection(_projScreenMatrix); 

      webglObject.z = _vector3.z; 

     } 

    } 

} else { // Create second condition like that 
    object.inFrustum = false; 
}