11

平面がカメラの視錐台の内側にある場合にtrueを返す関数を作成するのに苦労しています。この投稿はgithubで見つかりましたが、オブジェクトが錐台にあるかどうかに関係なく、レシピは常にfalseを返します。

誰かがすでにこれをインテリジェントに実装していますか?どうもありがとう。

4

2 に答える 2

20

たぶん、マトリックスは更新されていませんか?

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 ) );
于 2012-06-02T00:38:06.650 に答える
6

私が間違っている場合は訂正してください。しかし、なぜ錐台を2回計算するのですか?

私は複雑なプロジェクトに取り組んでいますが、受け入れられた答えは私にとって最善の解決策ではありません。aleadyが計算されたものを再計算する意味がありません。私の目的のために、錐台で何かが検出されたかどうかにかかわらず、フラグを立ててthree.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;
}
于 2015-04-03T00:47:29.597 に答える