| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- /**
- * @author alteredq / http://alteredqualia.com/
- */
- THREE.PointCloud = function ( geometry, material ) {
- THREE.Object3D.call( this );
- this.type = 'PointCloud';
- this.geometry = geometry !== undefined ? geometry : new THREE.Geometry();
- this.material = material !== undefined ? material : new THREE.PointCloudMaterial( { color: Math.random() * 0xffffff } );
- this.sortParticles = false;
- };
- THREE.PointCloud.prototype = Object.create( THREE.Object3D.prototype );
- THREE.PointCloud.prototype.constructor = THREE.PointCloud;
- THREE.PointCloud.prototype.raycast = ( function () {
- var inverseMatrix = new THREE.Matrix4();
- var ray = new THREE.Ray();
- return function ( raycaster, intersects ) {
- var object = this;
- var geometry = object.geometry;
- var threshold = raycaster.params.PointCloud.threshold;
- inverseMatrix.getInverse( this.matrixWorld );
- ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
- if ( geometry.boundingBox !== null ) {
- if ( ray.isIntersectionBox( geometry.boundingBox ) === false ) {
- return;
- }
- }
- var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );
- var position = new THREE.Vector3();
- var testPoint = function ( point, index ) {
- var rayPointDistance = ray.distanceToPoint( point );
- if ( rayPointDistance < localThreshold ) {
- var intersectPoint = ray.closestPointToPoint( point );
- intersectPoint.applyMatrix4( object.matrixWorld );
- var distance = raycaster.ray.origin.distanceTo( intersectPoint );
- intersects.push( {
- distance: distance,
- distanceToRay: rayPointDistance,
- point: intersectPoint.clone(),
- index: index,
- face: null,
- object: object
- } );
- }
- };
- if ( geometry instanceof THREE.BufferGeometry ) {
- var attributes = geometry.attributes;
- var positions = attributes.position.array;
- if ( attributes.index !== undefined ) {
- var indices = attributes.index.array;
- var offsets = geometry.offsets;
- if ( offsets.length === 0 ) {
- var offset = {
- start: 0,
- count: indices.length,
- index: 0
- };
- offsets = [ offset ];
- }
- for ( var oi = 0, ol = offsets.length; oi < ol; ++oi ) {
- var start = offsets[ oi ].start;
- var count = offsets[ oi ].count;
- var index = offsets[ oi ].index;
- for ( var i = start, il = start + count; i < il; i ++ ) {
- var a = index + indices[ i ];
- position.fromArray( positions, a * 3 );
- testPoint( position, a );
- }
- }
- } else {
- var pointCount = positions.length / 3;
- for ( var i = 0; i < pointCount; i ++ ) {
- position.set(
- positions[ 3 * i ],
- positions[ 3 * i + 1 ],
- positions[ 3 * i + 2 ]
- );
- testPoint( position, i );
- }
- }
- } else {
- var vertices = this.geometry.vertices;
- for ( var i = 0; i < vertices.length; i ++ ) {
- testPoint( vertices[ i ], i );
- }
- }
- };
- }() );
- THREE.PointCloud.prototype.clone = function ( object ) {
- if ( object === undefined ) object = new THREE.PointCloud( this.geometry, this.material );
- object.sortParticles = this.sortParticles;
- THREE.Object3D.prototype.clone.call( this, object );
- return object;
- };
- // Backwards compatibility
- THREE.ParticleSystem = function ( geometry, material ) {
- console.warn( 'THREE.ParticleSystem has been renamed to THREE.PointCloud.' );
- return new THREE.PointCloud( geometry, material );
- };
|