2012-06-01 8 views

Respuesta

15

¿Quizás las matrices no están actualizadas?

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

Quiero saber si el tronco contiene un cubo entero, pero no funciona con este método ... ¿qué método puedo usar? (No veo ninguno en la [documentación] (http://threejs.org/docs/#Reference/Math/Frustum)) – CodyBugstein

+0

Puede tomar una instantánea de lienzo del objeto en ese momento para obtener un perspectiva plana del objeto. Encuentra las líneas que componen esa instantánea de polígono. Ya sabes las coordenadas de las cámaras frutum matrix. Ahora tiene un polígono dentro o fuera/superposición de otro polígono. Utilice un algoritmo de detección "Polígono en el polígono", también conocido como algoritmo de línea de barrido para obtener lo que necesita. –

3

Corrija si me equivoco, pero ¿por qué calcular frustum por segunda vez?

Estoy trabajando en un proyecto complejo y la respuesta aceptada no es la mejor solución para mí. No veo el punto de volver a calcular lo que se calculó. Para mi propósito, modifiqué mi copia de three.js levantando una bandera si se detectaba algo en triturado o no. Más adelante simplemente comprobar en su objeto si object.inFrustum === cierto

A continuación siguiendo la línea

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

añadir

object.inFrustum = true; 

también donde el bloque si extremos añadir una bandera opuesto

else { 
    object.inFrustum = false; 
} 

Mi resultado final en r70 que funciona perfectamente:

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; 
} 
Cuestiones relacionadas