Raycaster.js 2.6 KB
Newer Older
R
Rich Harris 已提交
1 2
import { Ray } from '../math/Ray';

3
/**
M
Mr.doob 已提交
4
 * @author mrdoob / http://mrdoob.com/
5
 * @author bhouston / http://clara.io/
6
 * @author stephomi / http://stephaneginier.com/
7
 */
M
Mr.doob 已提交
8

R
Rich Harris 已提交
9 10
function Raycaster ( origin, direction, near, far ) {
	this.isRaycaster = true;
M
Mr.doob 已提交
11

R
Rich Harris 已提交
12 13
	this.ray = new Ray( origin, direction );
	// direction is assumed to be normalized (for accurate distance calculations)
14

R
Rich Harris 已提交
15 16
	this.near = near || 0;
	this.far = far || Infinity;
17

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

R
Rich Harris 已提交
26 27 28 29 30 31 32 33 34 35
	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 已提交
36

R
Rich Harris 已提交
37
function ascSort( a, b ) {
M
Mr.doob 已提交
38

R
Rich Harris 已提交
39
	return a.distance - b.distance;
M
Mr.doob 已提交
40

R
Rich Harris 已提交
41
}
M
Mr.doob 已提交
42

R
Rich Harris 已提交
43
function intersectObject( object, raycaster, intersects, recursive ) {
44

R
Rich Harris 已提交
45
	if ( object.visible === false ) return;
M
Mr.doob 已提交
46

R
Rich Harris 已提交
47
	object.raycast( raycaster, intersects );
M
Mr.doob 已提交
48

R
Rich Harris 已提交
49
	if ( recursive === true ) {
M
Mr.doob 已提交
50

R
Rich Harris 已提交
51
		var children = object.children;
M
Mr.doob 已提交
52

R
Rich Harris 已提交
53
		for ( var i = 0, l = children.length; i < l; i ++ ) {
M
Mr.doob 已提交
54

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

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

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

R
Rich Harris 已提交
61
}
62

R
Rich Harris 已提交
63
//
M
Mr.doob 已提交
64

R
Rich Harris 已提交
65
Raycaster.prototype = {
66

R
Rich Harris 已提交
67
	constructor: Raycaster,
68

R
Rich Harris 已提交
69
	linePrecision: 1,
70

R
Rich Harris 已提交
71
	set: function ( origin, direction ) {
M
Mr.doob 已提交
72

R
Rich Harris 已提交
73
		// direction is assumed to be normalized (for accurate distance calculations)
74

R
Rich Harris 已提交
75
		this.ray.set( origin, direction );
76

R
Rich Harris 已提交
77
	},
78

R
Rich Harris 已提交
79
	setFromCamera: function ( coords, camera ) {
80

R
Rich Harris 已提交
81
		if ( (camera && camera.isPerspectiveCamera) ) {
82

R
Rich Harris 已提交
83 84
			this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
			this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
85

R
Rich Harris 已提交
86
		} else if ( (camera && camera.isOrthographicCamera) ) {
87

R
Rich Harris 已提交
88 89
			this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
			this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
90

R
Rich Harris 已提交
91
		} else {
92

R
Rich Harris 已提交
93 94 95
			console.error( 'THREE.Raycaster: Unsupported camera type.' );

		}
96

R
Rich Harris 已提交
97
	},
M
Mr.doob 已提交
98

R
Rich Harris 已提交
99
	intersectObject: function ( object, recursive ) {
100

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

R
Rich Harris 已提交
103
		intersectObject( object, this, intersects, recursive );
M
Mr.doob 已提交
104

R
Rich Harris 已提交
105
		intersects.sort( ascSort );
M
Mr.doob 已提交
106

R
Rich Harris 已提交
107
		return intersects;
M
Mr.doob 已提交
108

R
Rich Harris 已提交
109
	},
M
Mr.doob 已提交
110

R
Rich Harris 已提交
111
	intersectObjects: function ( objects, recursive ) {
M
Mr.doob 已提交
112

R
Rich Harris 已提交
113
		var intersects = [];
M
Mr.doob 已提交
114

R
Rich Harris 已提交
115
		if ( Array.isArray( objects ) === false ) {
M
Mr.doob 已提交
116

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

R
Rich Harris 已提交
120
		}
121

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

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

R
Rich Harris 已提交
126
		}
M
Mr.doob 已提交
127

R
Rich Harris 已提交
128
		intersects.sort( ascSort );
M
Mr.doob 已提交
129

R
Rich Harris 已提交
130
		return intersects;
M
Mr.doob 已提交
131

R
Rich Harris 已提交
132 133 134
	}

};
M
Mr.doob 已提交
135 136


R
Rich Harris 已提交
137
export { Raycaster };