Raycaster.js 2.7 KB
Newer Older
1
/**
M
Mr.doob 已提交
2
 * @author mrdoob / http://mrdoob.com/
3
 * @author bhouston / http://clara.io/
4
 * @author stephomi / http://stephaneginier.com/
5
 */
M
Mr.doob 已提交
6 7 8

( function ( THREE ) {

9
	THREE.Raycaster = function ( origin, direction, near, far ) {
M
Mr.doob 已提交
10

11
		this.ray = new THREE.Ray( origin, direction );
12
		// direction is assumed to be normalized (for accurate distance calculations)
13

L
libra guest 已提交
14 15
		this.near = near || 0;
		this.far = far || Infinity;
M
Mr.doob 已提交
16

17 18
		this.params = {
			Mesh: {},
M
Mr.doob 已提交
19
			Line: {},
20
			LOD: {},
M
Mr.doob 已提交
21 22
			Points: { threshold: 1 },
			Sprite: {}
23
		};
M
Mr.doob 已提交
24

25 26 27 28 29 30 31 32 33
		Object.defineProperties( this.params, {
			PointCloud: {
				get: function () {
					console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );
					return this.Points;
				}
			}
		} );

M
Mr.doob 已提交
34
	};
M
Mr.doob 已提交
35

S
simonThiele 已提交
36
	function ascSort( a, b ) {
M
Mr.doob 已提交
37

L
libra guest 已提交
38
		return a.distance - b.distance;
M
Mr.doob 已提交
39

40
	}
M
Mr.doob 已提交
41

M
Mr.doob 已提交
42
	function intersectObject( object, raycaster, intersects, recursive ) {
M
Mr.doob 已提交
43

44 45
		if ( object.visible === false ) return;

M
Mr.doob 已提交
46
		object.raycast( raycaster, intersects );
M
Mr.doob 已提交
47

M
Mr.doob 已提交
48 49 50 51 52 53 54
		if ( recursive === true ) {

			var children = object.children;

			for ( var i = 0, l = children.length; i < l; i ++ ) {

				intersectObject( children[ i ], raycaster, intersects, true );
M
Mr.doob 已提交
55

M
Mr.doob 已提交
56
			}
M
Mr.doob 已提交
57

M
Mr.doob 已提交
58
		}
M
Mr.doob 已提交
59

M
Mr.doob 已提交
60
	}
M
Mr.doob 已提交
61

M
Mr.doob 已提交
62
	//
63

M
Mr.doob 已提交
64
	THREE.Raycaster.prototype = {
M
Mr.doob 已提交
65

M
Mr.doob 已提交
66
		constructor: THREE.Raycaster,
67

M
Mr.doob 已提交
68
		linePrecision: 1,
69

M
Mr.doob 已提交
70
		set: function ( origin, direction ) {
71

M
Mr.doob 已提交
72
			// direction is assumed to be normalized (for accurate distance calculations)
M
Mr.doob 已提交
73

74 75 76 77 78 79 80 81
			this.ray.set( origin, direction );

		},

		setFromCamera: function ( coords, camera ) {

			if ( camera instanceof THREE.PerspectiveCamera ) {

82 83
				this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
				this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
84 85 86

			} else if ( camera instanceof THREE.OrthographicCamera ) {

87
				this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
88 89 90 91
				this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );

			} else {

92
				console.error( 'THREE.Raycaster: Unsupported camera type.' );
93 94 95

			}

M
Mr.doob 已提交
96
		},
M
Mr.doob 已提交
97

M
Mr.doob 已提交
98
		intersectObject: function ( object, recursive ) {
99

M
Mr.doob 已提交
100
			var intersects = [];
M
Mr.doob 已提交
101

M
Mr.doob 已提交
102
			intersectObject( object, this, intersects, recursive );
M
Mr.doob 已提交
103

S
simonThiele 已提交
104
			intersects.sort( ascSort );
M
Mr.doob 已提交
105

M
Mr.doob 已提交
106
			return intersects;
M
Mr.doob 已提交
107

M
Mr.doob 已提交
108
		},
M
Mr.doob 已提交
109

M
Mr.doob 已提交
110
		intersectObjects: function ( objects, recursive ) {
M
Mr.doob 已提交
111

M
Mr.doob 已提交
112
			var intersects = [];
M
Mr.doob 已提交
113

114
			if ( Array.isArray( objects ) === false ) {
M
Mr.doob 已提交
115

116
				console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );
117
				return intersects;
M
Mr.doob 已提交
118

119 120
			}

M
Mr.doob 已提交
121
			for ( var i = 0, l = objects.length; i < l; i ++ ) {
M
Mr.doob 已提交
122

M
Mr.doob 已提交
123
				intersectObject( objects[ i ], this, intersects, recursive );
M
Mr.doob 已提交
124

M
Mr.doob 已提交
125 126
			}

S
simonThiele 已提交
127
			intersects.sort( ascSort );
M
Mr.doob 已提交
128

M
Mr.doob 已提交
129 130 131
			return intersects;

		}
M
Mr.doob 已提交
132

M
Mr.doob 已提交
133
	};
M
Mr.doob 已提交
134 135

}( THREE ) );