2012-06-01 84 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; 
}