ArrowHelper.js 2.0 KB
Newer Older
W
WestLangley 已提交
1
/**
W
WestLangley 已提交
2
 * @author WestLangley / http://github.com/WestLangley
W
WestLangley 已提交
3 4
 * @author zz85 / http://github.com/zz85
 * @author bhouston / http://exocortex.com
5 6 7 8 9 10 11 12
 *
 * Creates an arrow for visualizing directions
 *
 * Parameters:
 *  dir - Vector3
 *  origin - Vector3
 *  length - Number
 *  hex - color in hex value
W
WestLangley 已提交
13
 */
A
alteredq 已提交
14

15
THREE.ArrowHelper = function ( dir, origin, length, hex ) {
W
WestLangley 已提交
16

W
WestLangley 已提交
17 18
	// dir is assumed to be normalized

M
Mr.doob 已提交
19
	THREE.Object3D.call( this );
W
WestLangley 已提交
20

M
Mr.doob 已提交
21
	if ( hex === undefined ) hex = 0xffff00;
W
WestLangley 已提交
22 23 24 25 26
	if ( length === undefined ) length = 1;

	this.position = origin;

	this.useQuaternion = true;
27

M
Mr.doob 已提交
28 29 30
	var lineGeometry = new THREE.Geometry();
	lineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ) );
	lineGeometry.vertices.push( new THREE.Vector3( 0, 1, 0 ) );
A
alteredq 已提交
31

M
Mr.doob 已提交
32
	this.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: hex } ) );
W
WestLangley 已提交
33
	this.line.matrixAutoUpdate = false;
M
Mr.doob 已提交
34
	this.add( this.line );
A
alteredq 已提交
35

M
Mr.doob 已提交
36
	var coneGeometry = new THREE.CylinderGeometry( 0, 0.05, 0.25, 5, 1 );
W
WestLangley 已提交
37
	coneGeometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, 0.875, 0 ) );
A
alteredq 已提交
38

M
Mr.doob 已提交
39
	this.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: hex } ) );
W
WestLangley 已提交
40
	this.cone.matrixAutoUpdate = false;
M
Mr.doob 已提交
41
	this.add( this.cone );
A
alteredq 已提交
42

M
Mr.doob 已提交
43 44
	this.setDirection( dir );
	this.setLength( length );
W
WestLangley 已提交
45 46 47

};

48
THREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype );
W
WestLangley 已提交
49

W
WestLangley 已提交
50
THREE.ArrowHelper.prototype.setDirection = function () {
W
WestLangley 已提交
51

W
WestLangley 已提交
52 53
	var axis = new THREE.Vector3();
	var radians;
A
alteredq 已提交
54

W
WestLangley 已提交
55
	return function ( dir ) {
A
alteredq 已提交
56

W
WestLangley 已提交
57
		// dir is assumed to be normalized
58

W
WestLangley 已提交
59
		if ( dir.y > 0.999 ) {
60

W
WestLangley 已提交
61
			this.quaternion.set( 0, 0, 0, 1 );
62

W
WestLangley 已提交
63
		} else if ( dir.y < - 0.999 ) {
M
Mr.doob 已提交
64

W
WestLangley 已提交
65
			this.quaternion.set( 1, 0, 0, 0 );
66

W
WestLangley 已提交
67
		} else {
A
alteredq 已提交
68

W
WestLangley 已提交
69 70 71 72 73 74 75 76 77 78 79
			axis.set( dir.z, 0, - dir.x ).normalize();

			radians = Math.acos( dir.y );

			this.quaternion.setFromAxisAngle( axis, radians );

		}

	};

}();
W
WestLangley 已提交
80

M
Mr.doob 已提交
81
THREE.ArrowHelper.prototype.setLength = function ( length ) {
W
WestLangley 已提交
82

M
Mr.doob 已提交
83
	this.scale.set( length, length, length );
W
WestLangley 已提交
84 85 86

};

M
Mr.doob 已提交
87
THREE.ArrowHelper.prototype.setColor = function ( hex ) {
W
WestLangley 已提交
88

M
Mr.doob 已提交
89 90
	this.line.material.color.setHex( hex );
	this.cone.material.color.setHex( hex );
W
WestLangley 已提交
91 92

};