195 lines
3.7 KiB
JavaScript
195 lines
3.7 KiB
JavaScript
|
import { Vector3 } from './Vector3.js';
|
||
|
import { Sphere } from './Sphere.js';
|
||
|
import { Plane } from './Plane.js';
|
||
|
|
||
|
/**
|
||
|
* @author mrdoob / http://mrdoob.com/
|
||
|
* @author alteredq / http://alteredqualia.com/
|
||
|
* @author bhouston / http://clara.io
|
||
|
*/
|
||
|
|
||
|
function Frustum( p0, p1, p2, p3, p4, p5 ) {
|
||
|
|
||
|
this.planes = [
|
||
|
|
||
|
( p0 !== undefined ) ? p0 : new Plane(),
|
||
|
( p1 !== undefined ) ? p1 : new Plane(),
|
||
|
( p2 !== undefined ) ? p2 : new Plane(),
|
||
|
( p3 !== undefined ) ? p3 : new Plane(),
|
||
|
( p4 !== undefined ) ? p4 : new Plane(),
|
||
|
( p5 !== undefined ) ? p5 : new Plane()
|
||
|
|
||
|
];
|
||
|
|
||
|
}
|
||
|
|
||
|
Object.assign( Frustum.prototype, {
|
||
|
|
||
|
set: function ( p0, p1, p2, p3, p4, p5 ) {
|
||
|
|
||
|
var planes = this.planes;
|
||
|
|
||
|
planes[ 0 ].copy( p0 );
|
||
|
planes[ 1 ].copy( p1 );
|
||
|
planes[ 2 ].copy( p2 );
|
||
|
planes[ 3 ].copy( p3 );
|
||
|
planes[ 4 ].copy( p4 );
|
||
|
planes[ 5 ].copy( p5 );
|
||
|
|
||
|
return this;
|
||
|
|
||
|
},
|
||
|
|
||
|
clone: function () {
|
||
|
|
||
|
return new this.constructor().copy( this );
|
||
|
|
||
|
},
|
||
|
|
||
|
copy: function ( frustum ) {
|
||
|
|
||
|
var planes = this.planes;
|
||
|
|
||
|
for ( var i = 0; i < 6; i ++ ) {
|
||
|
|
||
|
planes[ i ].copy( frustum.planes[ i ] );
|
||
|
|
||
|
}
|
||
|
|
||
|
return this;
|
||
|
|
||
|
},
|
||
|
|
||
|
setFromMatrix: function ( m ) {
|
||
|
|
||
|
var planes = this.planes;
|
||
|
var me = m.elements;
|
||
|
var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
|
||
|
var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
|
||
|
var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
|
||
|
var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
|
||
|
|
||
|
planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
|
||
|
planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
|
||
|
planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
|
||
|
planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
|
||
|
planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
|
||
|
planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
|
||
|
|
||
|
return this;
|
||
|
|
||
|
},
|
||
|
|
||
|
intersectsObject: function () {
|
||
|
|
||
|
var sphere = new Sphere();
|
||
|
|
||
|
return function intersectsObject( object ) {
|
||
|
|
||
|
var geometry = object.geometry;
|
||
|
|
||
|
if ( geometry.boundingSphere === null )
|
||
|
geometry.computeBoundingSphere();
|
||
|
|
||
|
sphere.copy( geometry.boundingSphere )
|
||
|
.applyMatrix4( object.matrixWorld );
|
||
|
|
||
|
return this.intersectsSphere( sphere );
|
||
|
|
||
|
};
|
||
|
|
||
|
}(),
|
||
|
|
||
|
intersectsSprite: function () {
|
||
|
|
||
|
var sphere = new Sphere();
|
||
|
|
||
|
return function intersectsSprite( sprite ) {
|
||
|
|
||
|
sphere.center.set( 0, 0, 0 );
|
||
|
sphere.radius = 0.7071067811865476;
|
||
|
sphere.applyMatrix4( sprite.matrixWorld );
|
||
|
|
||
|
return this.intersectsSphere( sphere );
|
||
|
|
||
|
};
|
||
|
|
||
|
}(),
|
||
|
|
||
|
intersectsSphere: function ( sphere ) {
|
||
|
|
||
|
var planes = this.planes;
|
||
|
var center = sphere.center;
|
||
|
var negRadius = - sphere.radius;
|
||
|
|
||
|
for ( var i = 0; i < 6; i ++ ) {
|
||
|
|
||
|
var distance = planes[ i ].distanceToPoint( center );
|
||
|
|
||
|
if ( distance < negRadius ) {
|
||
|
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
|
||
|
},
|
||
|
|
||
|
intersectsBox: function () {
|
||
|
|
||
|
var p = new Vector3();
|
||
|
|
||
|
return function intersectsBox( box ) {
|
||
|
|
||
|
var planes = this.planes;
|
||
|
|
||
|
for ( var i = 0; i < 6; i ++ ) {
|
||
|
|
||
|
var plane = planes[ i ];
|
||
|
|
||
|
// corner at max distance
|
||
|
|
||
|
p.x = plane.normal.x > 0 ? box.max.x : box.min.x;
|
||
|
p.y = plane.normal.y > 0 ? box.max.y : box.min.y;
|
||
|
p.z = plane.normal.z > 0 ? box.max.z : box.min.z;
|
||
|
|
||
|
if ( plane.distanceToPoint( p ) < 0 ) {
|
||
|
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
|
||
|
};
|
||
|
|
||
|
}(),
|
||
|
|
||
|
containsPoint: function ( point ) {
|
||
|
|
||
|
var planes = this.planes;
|
||
|
|
||
|
for ( var i = 0; i < 6; i ++ ) {
|
||
|
|
||
|
if ( planes[ i ].distanceToPoint( point ) < 0 ) {
|
||
|
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
|
||
|
}
|
||
|
|
||
|
} );
|
||
|
|
||
|
|
||
|
export { Frustum };
|