Frustum.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. * @author alteredq / http://alteredqualia.com/
  4. * @author bhouston / http://exocortex.com
  5. */
  6. THREE.Frustum = function ( p0, p1, p2, p3, p4, p5 ) {
  7. this.planes = [
  8. ( p0 !== undefined ) ? p0 : new THREE.Plane(),
  9. ( p1 !== undefined ) ? p1 : new THREE.Plane(),
  10. ( p2 !== undefined ) ? p2 : new THREE.Plane(),
  11. ( p3 !== undefined ) ? p3 : new THREE.Plane(),
  12. ( p4 !== undefined ) ? p4 : new THREE.Plane(),
  13. ( p5 !== undefined ) ? p5 : new THREE.Plane()
  14. ];
  15. };
  16. THREE.extend( THREE.Frustum.prototype, {
  17. set: function ( p0, p1, p2, p3, p4, p5 ) {
  18. var planes = this.planes;
  19. planes[0].copy( p0 );
  20. planes[1].copy( p1 );
  21. planes[2].copy( p2 );
  22. planes[3].copy( p3 );
  23. planes[4].copy( p4 );
  24. planes[5].copy( p5 );
  25. return this;
  26. },
  27. copy: function ( frustum ) {
  28. var planes = this.planes;
  29. for( var i = 0; i < 6; i ++ ) {
  30. planes[i].copy( frustum.planes[i] );
  31. }
  32. return this;
  33. },
  34. setFromMatrix: function ( m ) {
  35. var planes = this.planes;
  36. var me = m.elements;
  37. var me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3];
  38. var me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7];
  39. var me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11];
  40. var me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15];
  41. planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
  42. planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
  43. planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
  44. planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
  45. planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
  46. planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
  47. return this;
  48. },
  49. intersectsObject: function () {
  50. var center = new THREE.Vector3();
  51. return function ( object ) {
  52. // this method is expanded inlined for performance reasons.
  53. var matrix = object.matrixWorld;
  54. var planes = this.planes;
  55. var negRadius = - object.geometry.boundingSphere.radius * matrix.getMaxScaleOnAxis();
  56. center.getPositionFromMatrix( matrix );
  57. for ( var i = 0; i < 6; i ++ ) {
  58. var distance = planes[ i ].distanceToPoint( center );
  59. if ( distance < negRadius ) {
  60. return false;
  61. }
  62. }
  63. return true;
  64. };
  65. }(),
  66. intersectsSphere: function ( sphere ) {
  67. var planes = this.planes;
  68. var center = sphere.center;
  69. var negRadius = -sphere.radius;
  70. for ( var i = 0; i < 6; i ++ ) {
  71. var distance = planes[ i ].distanceToPoint( center );
  72. if ( distance < negRadius ) {
  73. return false;
  74. }
  75. }
  76. return true;
  77. },
  78. containsPoint: function ( point ) {
  79. var planes = this.planes;
  80. for ( var i = 0; i < 6; i ++ ) {
  81. if ( planes[ i ].distanceToPoint( point ) < 0 ) {
  82. return false;
  83. }
  84. }
  85. return true;
  86. },
  87. clone: function () {
  88. return new THREE.Frustum().copy( this );
  89. }
  90. } );
粤ICP备19079148号