Raycaster.js 2.4 KB
Newer Older
1
/**
M
Mr.doob 已提交
2
 * @author mrdoob / http://mrdoob.com/
3
 * @author bhouston / http://exocortex.com/
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 19 20 21 22 23
		this.params = {
			Sprite: {},
			Mesh: {},
			PointCloud: { threshold: 1 },
			LOD: {},
			Line: {}
		};
M
Mr.doob 已提交
24

M
Mr.doob 已提交
25
	};
M
Mr.doob 已提交
26

27
	var descSort = function ( a, b ) {
M
Mr.doob 已提交
28

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

31
	};
M
Mr.doob 已提交
32

M
Mr.doob 已提交
33
	var intersectObject = function ( object, raycaster, intersects, recursive ) {
M
Mr.doob 已提交
34

M
Mr.doob 已提交
35
		object.raycast( raycaster, intersects );
M
Mr.doob 已提交
36

M
Mr.doob 已提交
37 38 39 40 41 42 43
		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 已提交
44

M
Mr.doob 已提交
45
			}
M
Mr.doob 已提交
46

M
Mr.doob 已提交
47
		}
M
Mr.doob 已提交
48

M
Mr.doob 已提交
49
	};
M
Mr.doob 已提交
50

M
Mr.doob 已提交
51
	//
52

M
Mr.doob 已提交
53
	THREE.Raycaster.prototype = {
M
Mr.doob 已提交
54

M
Mr.doob 已提交
55
		constructor: THREE.Raycaster,
56

M
Mr.doob 已提交
57
		linePrecision: 1,
58

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

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

63 64 65 66 67 68 69 70
			this.ray.set( origin, direction );

		},

		setFromCamera: function ( coords, camera ) {

			if ( camera instanceof THREE.PerspectiveCamera ) {

71 72
				this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
				this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
73 74 75 76 77 78 79 80

			} else if ( camera instanceof THREE.OrthographicCamera ) {

				this.ray.origin.set( coords.x, coords.y, - 1 ).unproject( camera );
				this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );

			} else {

81
				console.error( 'THREE.Raycaster: Unsupported camera type.' );
82 83 84

			}

M
Mr.doob 已提交
85
		},
M
Mr.doob 已提交
86

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

M
Mr.doob 已提交
89
			var intersects = [];
M
Mr.doob 已提交
90

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

M
Mr.doob 已提交
93
			intersects.sort( descSort );
M
Mr.doob 已提交
94

M
Mr.doob 已提交
95
			return intersects;
M
Mr.doob 已提交
96

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

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

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

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

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

108 109
			}

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

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

M
Mr.doob 已提交
114 115 116
			}

			intersects.sort( descSort );
M
Mr.doob 已提交
117

M
Mr.doob 已提交
118 119 120
			return intersects;

		}
M
Mr.doob 已提交
121

M
Mr.doob 已提交
122
	};
M
Mr.doob 已提交
123 124

}( THREE ) );