Frustum.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import { Vector3 } from './Vector3';
  2. import { Sphere } from './Sphere';
  3. import { Plane } from './Plane';
  4. /**
  5. * @author mrdoob / http://mrdoob.com/
  6. * @author alteredq / http://alteredqualia.com/
  7. * @author bhouston / http://clara.io
  8. */
  9. function Frustum( p0, p1, p2, p3, p4, p5 ) {
  10. this.planes = [
  11. ( p0 !== undefined ) ? p0 : new Plane(),
  12. ( p1 !== undefined ) ? p1 : new Plane(),
  13. ( p2 !== undefined ) ? p2 : new Plane(),
  14. ( p3 !== undefined ) ? p3 : new Plane(),
  15. ( p4 !== undefined ) ? p4 : new Plane(),
  16. ( p5 !== undefined ) ? p5 : new Plane()
  17. ];
  18. }
  19. Frustum.prototype = {
  20. constructor: Frustum,
  21. set: function ( p0, p1, p2, p3, p4, p5 ) {
  22. var planes = this.planes;
  23. planes[ 0 ].copy( p0 );
  24. planes[ 1 ].copy( p1 );
  25. planes[ 2 ].copy( p2 );
  26. planes[ 3 ].copy( p3 );
  27. planes[ 4 ].copy( p4 );
  28. planes[ 5 ].copy( p5 );
  29. return this;
  30. },
  31. clone: function () {
  32. return new this.constructor().copy( this );
  33. },
  34. copy: function ( frustum ) {
  35. var planes = this.planes;
  36. for ( var i = 0; i < 6; i ++ ) {
  37. planes[ i ].copy( frustum.planes[ i ] );
  38. }
  39. return this;
  40. },
  41. setFromMatrix: function ( m ) {
  42. var planes = this.planes;
  43. var me = m.elements;
  44. var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
  45. var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
  46. var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
  47. var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
  48. planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
  49. planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
  50. planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
  51. planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
  52. planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
  53. planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
  54. return this;
  55. },
  56. intersectsObject: function () {
  57. var sphere = new Sphere();
  58. return function intersectsObject( object ) {
  59. var geometry = object.geometry;
  60. if ( geometry.boundingSphere === null )
  61. geometry.computeBoundingSphere();
  62. sphere.copy( geometry.boundingSphere )
  63. .applyMatrix4( object.matrixWorld );
  64. return this.intersectsSphere( sphere );
  65. };
  66. }(),
  67. intersectsSprite: function () {
  68. var sphere = new Sphere();
  69. return function intersectsSprite( sprite ) {
  70. sphere.center.set( 0, 0, 0 );
  71. sphere.radius = 0.7071067811865476;
  72. sphere.applyMatrix4( sprite.matrixWorld );
  73. return this.intersectsSphere( sphere );
  74. };
  75. }(),
  76. intersectsSphere: function ( sphere ) {
  77. var planes = this.planes;
  78. var center = sphere.center;
  79. var negRadius = - sphere.radius;
  80. for ( var i = 0; i < 6; i ++ ) {
  81. var distance = planes[ i ].distanceToPoint( center );
  82. if ( distance < negRadius ) {
  83. return false;
  84. }
  85. }
  86. return true;
  87. },
  88. intersectsBox: function () {
  89. var p1 = new Vector3(),
  90. p2 = new Vector3();
  91. return function intersectsBox( box ) {
  92. var planes = this.planes;
  93. for ( var i = 0; i < 6 ; i ++ ) {
  94. var plane = planes[ i ];
  95. p1.x = plane.normal.x > 0 ? box.min.x : box.max.x;
  96. p2.x = plane.normal.x > 0 ? box.max.x : box.min.x;
  97. p1.y = plane.normal.y > 0 ? box.min.y : box.max.y;
  98. p2.y = plane.normal.y > 0 ? box.max.y : box.min.y;
  99. p1.z = plane.normal.z > 0 ? box.min.z : box.max.z;
  100. p2.z = plane.normal.z > 0 ? box.max.z : box.min.z;
  101. var d1 = plane.distanceToPoint( p1 );
  102. var d2 = plane.distanceToPoint( p2 );
  103. // if both outside plane, no intersection
  104. if ( d1 < 0 && d2 < 0 ) {
  105. return false;
  106. }
  107. }
  108. return true;
  109. };
  110. }(),
  111. containsPoint: function ( point ) {
  112. var planes = this.planes;
  113. for ( var i = 0; i < 6; i ++ ) {
  114. if ( planes[ i ].distanceToPoint( point ) < 0 ) {
  115. return false;
  116. }
  117. }
  118. return true;
  119. }
  120. };
  121. export { Frustum };