2012-06-01 10 views

risposta

15

Forse le matrici non sono aggiornate?

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

Voglio sapere se il tronco contiene un intero cubo, ma non funziona con questo metodo ... quale metodo posso usare? (Non vedo nessuno elencato nella [documentazione] (http://threejs.org/docs/#Reference/Math/Frustum)) – CodyBugstein

+0

Si potrebbe fare uno snapshot della tela dell'oggetto in quel momento per ottenere un prospettiva planare dell'oggetto. Trova le linee che costituiscono quell'istantanea poligonale. Conoscete già le coordinate della matrice frutum delle telecamere. Ora hai un poligono all'interno o all'esterno/sovrapposizione di un altro poligono. Utilizza un algoritmo di rilevamento "Poligono in poligono" o algoritmo della linea di scorrimento per ottenere ciò che ti serve! –

3

Correggetemi se ho torto, ma perché calcolare la seconda volta?

Sto lavorando a un progetto complesso e la risposta accettata non è la soluzione migliore per me. Non vedo il punto di ricalcolare ciò che è stato calcolato. Per il mio scopo ho modificato la mia copia di three.js alzando una bandiera se qualcosa è stato rilevato in trance o meno. In seguito basta controllare sul vostro oggetto, se object.inFrustum === vero

Sotto seguente riga

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

aggiungere

object.inFrustum = true; 

anche il luogo dove il caso finisce block Aggiungi una bandiera oposite

else { 
    object.inFrustum = false; 
} 

Il mio risultato finale in r70 che funziona perfettamente:

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; 
} 
Problemi correlati