Frustum.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. * @author alteredq / http://alteredqualia.com/
  4. */
  5. THREE.Frustum = function ( ) {
  6. this.planes = [
  7. new THREE.Vector4(),
  8. new THREE.Vector4(),
  9. new THREE.Vector4(),
  10. new THREE.Vector4(),
  11. new THREE.Vector4(),
  12. new THREE.Vector4()
  13. ];
  14. };
  15. THREE.Frustum.prototype.setFromMatrix = function ( m ) {
  16. var i, plane,
  17. planes = this.planes;
  18. var me = m.elements;
  19. planes[ 0 ].set( me[3] - me[0], me[7] - me[4], me[11] - me[8], me[15] - me[12] );
  20. planes[ 1 ].set( me[3] + me[0], me[7] + me[4], me[11] + me[8], me[15] + me[12] );
  21. planes[ 2 ].set( me[3] + me[1], me[7] + me[5], me[11] + me[9], me[15] + me[13] );
  22. planes[ 3 ].set( me[3] - me[1], me[7] - me[5], me[11] - me[9], me[15] - me[13] );
  23. planes[ 4 ].set( me[3] - me[2], me[7] - me[6], me[11] - me[10], me[15] - me[14] );
  24. planes[ 5 ].set( me[3] + me[2], me[7] + me[6], me[11] + me[10], me[15] + me[14] );
  25. for ( i = 0; i < 6; i ++ ) {
  26. plane = planes[ i ];
  27. plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) );
  28. }
  29. };
  30. THREE.Frustum.prototype.contains = function ( object ) {
  31. var distance,
  32. planes = this.planes,
  33. matrix = object.matrixWorld,
  34. me = matrix.elements,
  35. scale = THREE.Frustum.__v1.set( matrix.getColumnX().length(), matrix.getColumnY().length(), matrix.getColumnZ().length() ),
  36. radius = - object.geometry.boundingSphere.radius * Math.max( scale.x, Math.max( scale.y, scale.z ) );
  37. for ( var i = 0; i < 6; i ++ ) {
  38. distance = planes[ i ].x * me[12] + planes[ i ].y * me[13] + planes[ i ].z * me[14] + planes[ i ].w;
  39. if ( distance <= radius ) return false;
  40. }
  41. return true;
  42. };
  43. THREE.Frustum.__v1 = new THREE.Vector3();