|
/** |
|
* @author WestLangley / http://github.com/WestLangley |
|
* @author zz85 / http://github.com/zz85 |
|
* @author bhouston / http://clara.io |
|
* |
|
* Creates an arrow for visualizing directions |
|
* |
|
* Parameters: |
|
* dir - Vector3 |
|
* origin - Vector3 |
|
* length - Number |
|
* color - color in hex value |
|
* headLength - Number |
|
* headWidth - Number |
|
*/ |
|
|
|
THREE.ArrowHelper = ( function () { |
|
|
|
var lineGeometry = new THREE.Geometry(); |
|
lineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 1, 0 ) ); |
|
|
|
var coneGeometry = new THREE.CylinderGeometry( 0, 0.5, 1, 5, 1 ); |
|
coneGeometry.translate( 0, - 0.5, 0 ); |
|
|
|
return function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { |
|
|
|
// dir is assumed to be normalized |
|
|
|
THREE.Object3D.call( this ); |
|
|
|
if ( color === undefined ) color = 0xffff00; |
|
if ( length === undefined ) length = 1; |
|
if ( headLength === undefined ) headLength = 0.2 * length; |
|
if ( headWidth === undefined ) headWidth = 0.2 * headLength; |
|
|
|
this.position.copy( origin ); |
|
|
|
this.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: color } ) ); |
|
this.line.matrixAutoUpdate = false; |
|
this.add( this.line ); |
|
|
|
this.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: color } ) ); |
|
this.cone.matrixAutoUpdate = false; |
|
this.add( this.cone ); |
|
|
|
this.setDirection( dir ); |
|
this.setLength( length, headLength, headWidth ); |
|
|
|
} |
|
|
|
}() ); |
|
|
|
THREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype ); |
|
THREE.ArrowHelper.prototype.constructor = THREE.ArrowHelper; |
|
|
|
THREE.ArrowHelper.prototype.setDirection = ( function () { |
|
|
|
var axis = new THREE.Vector3(); |
|
var radians; |
|
|
|
return function setDirection( dir ) { |
|
|
|
// dir is assumed to be normalized |
|
|
|
if ( dir.y > 0.99999 ) { |
|
|
|
this.quaternion.set( 0, 0, 0, 1 ); |
|
|
|
} else if ( dir.y < - 0.99999 ) { |
|
|
|
this.quaternion.set( 1, 0, 0, 0 ); |
|
|
|
} else { |
|
|
|
axis.set( dir.z, 0, - dir.x ).normalize(); |
|
|
|
radians = Math.acos( dir.y ); |
|
|
|
this.quaternion.setFromAxisAngle( axis, radians ); |
|
|
|
} |
|
|
|
}; |
|
|
|
}() ); |
|
|
|
THREE.ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { |
|
|
|
if ( headLength === undefined ) headLength = 0.2 * length; |
|
if ( headWidth === undefined ) headWidth = 0.2 * headLength; |
|
|
|
this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); |
|
this.line.updateMatrix(); |
|
|
|
this.cone.scale.set( headWidth, headLength, headWidth ); |
|
this.cone.position.y = length; |
|
this.cone.updateMatrix(); |
|
|
|
}; |
|
|
|
THREE.ArrowHelper.prototype.setColor = function ( color ) { |
|
|
|
this.line.material.color.set( color ); |
|
this.cone.material.color.set( color ); |
|
|
|
}; |