如何判断飞机是否在Three.js相机中

时间:2012-06-01 23:41:45

标签: three.js

如果飞机位于相机的视野中,我很难制作一个返回true的函数。我找到了这篇文章on github,但无论对象是否在平截头体中,配方总是返回false。

任何人都已经聪明地实现了这一点吗?非常感谢。

2 个答案:

答案 0 :(得分:16)

也许矩阵没有更新?

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 ) );

答案 1 :(得分:5)

如果我错了,请纠正我,但为什么要第二次计算平截头体?

我正在处理一个复杂的项目,并且接受的答案对我来说不是最好的解决方案。我认为没有必要重新计算aleady的计算方法。为了我的目的,如果在平截头体中检测到某些东西,我通过提高标志来修改我的三个.js副本。如果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;
}