UNPKG

4.02 kBJavaScriptView Raw
1import { Vector3 } from './Vector3.js';
2import { Sphere } from './Sphere.js';
3import { Plane } from './Plane.js';
4
5/**
6 * @author mrdoob / http://mrdoob.com/
7 * @author alteredq / http://alteredqualia.com/
8 * @author bhouston / http://clara.io
9 */
10
11function Frustum( p0, p1, p2, p3, p4, p5 ) {
12
13 this.planes = [
14
15 ( p0 !== undefined ) ? p0 : new Plane(),
16 ( p1 !== undefined ) ? p1 : new Plane(),
17 ( p2 !== undefined ) ? p2 : new Plane(),
18 ( p3 !== undefined ) ? p3 : new Plane(),
19 ( p4 !== undefined ) ? p4 : new Plane(),
20 ( p5 !== undefined ) ? p5 : new Plane()
21
22 ];
23
24}
25
26Object.assign( Frustum.prototype, {
27
28 set: function ( p0, p1, p2, p3, p4, p5 ) {
29
30 var planes = this.planes;
31
32 planes[ 0 ].copy( p0 );
33 planes[ 1 ].copy( p1 );
34 planes[ 2 ].copy( p2 );
35 planes[ 3 ].copy( p3 );
36 planes[ 4 ].copy( p4 );
37 planes[ 5 ].copy( p5 );
38
39 return this;
40
41 },
42
43 clone: function () {
44
45 return new this.constructor().copy( this );
46
47 },
48
49 copy: function ( frustum ) {
50
51 var planes = this.planes;
52
53 for ( var i = 0; i < 6; i ++ ) {
54
55 planes[ i ].copy( frustum.planes[ i ] );
56
57 }
58
59 return this;
60
61 },
62
63 setFromMatrix: function ( m ) {
64
65 var planes = this.planes;
66 var me = m.elements;
67 var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
68 var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
69 var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
70 var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
71
72 planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
73 planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
74 planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
75 planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
76 planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
77 planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
78
79 return this;
80
81 },
82
83 intersectsObject: function () {
84
85 var sphere = new Sphere();
86
87 return function intersectsObject( object ) {
88
89 var geometry = object.geometry;
90
91 if ( geometry.boundingSphere === null )
92 geometry.computeBoundingSphere();
93
94 sphere.copy( geometry.boundingSphere )
95 .applyMatrix4( object.matrixWorld );
96
97 return this.intersectsSphere( sphere );
98
99 };
100
101 }(),
102
103 intersectsSprite: function () {
104
105 var sphere = new Sphere();
106
107 return function intersectsSprite( sprite ) {
108
109 sphere.center.set( 0, 0, 0 );
110 sphere.radius = 0.7071067811865476;
111 sphere.applyMatrix4( sprite.matrixWorld );
112
113 return this.intersectsSphere( sphere );
114
115 };
116
117 }(),
118
119 intersectsSphere: function ( sphere ) {
120
121 var planes = this.planes;
122 var center = sphere.center;
123 var negRadius = - sphere.radius;
124
125 for ( var i = 0; i < 6; i ++ ) {
126
127 var distance = planes[ i ].distanceToPoint( center );
128
129 if ( distance < negRadius ) {
130
131 return false;
132
133 }
134
135 }
136
137 return true;
138
139 },
140
141 intersectsBox: function () {
142
143 var p1 = new Vector3(),
144 p2 = new Vector3();
145
146 return function intersectsBox( box ) {
147
148 var planes = this.planes;
149
150 for ( var i = 0; i < 6; i ++ ) {
151
152 var plane = planes[ i ];
153
154 p1.x = plane.normal.x > 0 ? box.min.x : box.max.x;
155 p2.x = plane.normal.x > 0 ? box.max.x : box.min.x;
156 p1.y = plane.normal.y > 0 ? box.min.y : box.max.y;
157 p2.y = plane.normal.y > 0 ? box.max.y : box.min.y;
158 p1.z = plane.normal.z > 0 ? box.min.z : box.max.z;
159 p2.z = plane.normal.z > 0 ? box.max.z : box.min.z;
160
161 var d1 = plane.distanceToPoint( p1 );
162 var d2 = plane.distanceToPoint( p2 );
163
164 // if both outside plane, no intersection
165
166 if ( d1 < 0 && d2 < 0 ) {
167
168 return false;
169
170 }
171
172 }
173
174 return true;
175
176 };
177
178 }(),
179
180 containsPoint: function ( point ) {
181
182 var planes = this.planes;
183
184 for ( var i = 0; i < 6; i ++ ) {
185
186 if ( planes[ i ].distanceToPoint( point ) < 0 ) {
187
188 return false;
189
190 }
191
192 }
193
194 return true;
195
196 }
197
198} );
199
200
201export { Frustum };