如果飞机在相机的视锥体内,我很难制作一个返回 true 的函数。我在 github 上找到了这篇文章,但无论对象是否在截锥体中,配方总是返回 false。
有人已经智能地实现了这一点吗?非常感谢。
如果飞机在相机的视锥体内,我很难制作一个返回 true 的函数。我在 github 上找到了这篇文章,但无论对象是否在截锥体中,配方总是返回 false。
有人已经智能地实现了这一点吗?非常感谢。
也许矩阵没有更新?
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 ) );
如果我错了,请纠正我,但为什么要第二次计算截锥体?
我正在从事一个复杂的项目,而接受的答案对我来说并不是最好的解决方案。我认为没有必要重新计算 aleady 的计算结果。出于我的目的,我修改了我的 three.js 的副本,如果在截锥体中检测到某些东西,我会提出一个标志。稍后只需检查您的对象 if object.inFrustum === true
下面一行
if ( webglObjects && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {
添加
object.inFrustum = true;
还在 if 块结束的地方添加一个相反的标志
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;
}