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

mea*_*ppl 10 three.js

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

有人已经聪明地实现了这个吗?非常感谢.

mrd*_*oob 17

也许矩阵没有更新?

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 ) );
Run Code Online (Sandbox Code Playgroud)

  • 我想知道视锥体是否包含整个立方体,但它不能使用这种方法...我可以使用什么方法?(我没有看到[文档]中列出的任何内容(http://threejs.org/docs/#Reference/Math/Frustum)) (2认同)

Paw*_*wel 5

如果我错了,请纠正我,但是为什么第二次计算视锥?

我正在做一个复杂的项目,对我来说,公认的答案并不是最好的解决方案。我认为没有必要重新计算铅的计算方式。出于我的目的,我通过举一个标志(无论是否在视锥体中检测到了东西)来修改了Three.js的副本。以后只要检查您的对象是否为object.inFrustum === true

在下面的行下面

if ( webglObjects && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {
Run Code Online (Sandbox Code Playgroud)

object.inFrustum = true;
Run Code Online (Sandbox Code Playgroud)

还在if块结束的地方添加一个相反的标志

else {
    object.inFrustum = false;
}
Run Code Online (Sandbox Code Playgroud)

我在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;
}
Run Code Online (Sandbox Code Playgroud)