2012-06-01 11 views

Odpowiedz

15

Być może macierze nie są aktualizowane?

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

Chcę wiedzieć, czy stożek ścięty zawiera całą kostkę, ale nie działa przy użyciu tej metody ... jakiej metody mogę użyć? (Nie widzę żadnych wymienionych w [dokumentacja] (http://threejs.org/docs/#Reference/Math/Frustum)) – CodyBugstein

+0

Możesz wziąć migawkę płótno obiektu w tym momencie, aby uzyskać planarna perspektywa obiektu. Znajdź linie tworzące migawkę wielokąta. Znasz już współrzędne matrycy frutum kamer. Teraz masz wielokąt wewnątrz lub na zewnątrz/zachodzenie na inny wielokąt. Użyj algorytmu wykrywania "Wielobok w wielokątach" (ang. Polygon in Polygon), aby uzyskać to, czego potrzebujesz! –

3

Popraw mnie, jeśli się mylę, ale dlaczego po raz drugi policzyć frustum?

Pracuję nad złożonym projektem, a zaakceptowana odpowiedź nie jest dla mnie najlepszym rozwiązaniem. Nie widzę sensu przeliczania tego, co zostało obliczone. Dla mojego celu zmodyfikowałem kopię pliku three.js podnosząc flagę, jeśli coś zostało wykryte w kształcie stożka ściętego. Później po prostu sprawdzić na cel, jeżeli object.inFrustum === prawdziwej

Poniżej następujących linii

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

dodać

object.inFrustum = true; 

także wtedy, gdy jeśli końce blokowe dodać flagę oposite

else { 
    object.inFrustum = false; 
} 

Mój końcowy wynik w r70, który działa idealnie:

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; 
} 
Powiązane problemy