Как определить, находится ли самолет в камере Three.js Frustum

Мне трудно сделать функцию, которая возвращает истину, если плоскость находится внутри области видимости камеры. Я нашел этот пост,на GitHub, но рецепт всегда возвращает false независимо от того, находится объект в усеченном месте или нет.

Кто-нибудь уже реализовал это разумно? Большое спасибо.

Ответы на вопрос(2)

Поправьте меня, если я ошибаюсь, но зачем рассчитывать усеченный кончик во второй раз?

Я работаю над сложным проектом, и принятый ответ - не лучшее решение для меня. Я не вижу смысла пересчитывать то, что было рассчитано. Для моей цели я изменил свою копию three.js, подняв флаг, если что-то было обнаружено в frustum или нет. Позже просто проверьте ваш объект, если object.inFrustum === true

Ниже следующей строки

if ( webglObjects && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {

добавлять

object.inFrustum = true;

также там, где заканчивается блок if, добавьте флаг 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;
}
Решение Вопроса

Может быть, матрицы не обновляются?

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 ) );
 01 июн. 2018 г., 12:55
@mrdoob, почему бы не добавить реквизит & quot; inFrustum & quot; как предложено в ответе ниже? Таким образом, мы можем использовать статус теста Frustum из предыдущего кадра, не пересчитывая все заново.
 10 нояб. 2013 г., 13:42
Я хочу знать, содержит ли усеченный элемент целый куб, но он не работает с использованием этого метода ... какой метод я могу использовать? (Я не вижу ни одного из перечисленных вdocumentation)
 02 окт. 2016 г., 00:49
Вы можете сделать снимок холста объекта в тот момент времени, чтобы получить плоскую перспективу объекта. Найдите линии, которые составляют этот снимок многоугольника. Вы уже знаете координаты матрицы камеры. Теперь у вас есть многоугольник внутри или снаружи / перекрытие другого многоугольника. Используйте & quot; Polygon in Polygon & quot; Алгоритм обнаружения ака алгоритм стреловидности, чтобы получить то, что вам нужно!

Ваш ответ на вопрос