Browse Source

Exposed rotate and zoom API of OrbitControls

Xueqiao Xu 13 years ago
parent
commit
5db114f10e
1 changed files with 100 additions and 35 deletions
  1. 100 35
      src/extras/controls/OrbitControls.js

+ 100 - 35
src/extras/controls/OrbitControls.js

@@ -3,7 +3,7 @@
  */
  */
 
 
 THREE.OrbitControls = function( object, domElement ) {
 THREE.OrbitControls = function( object, domElement ) {
-  
+	
 	this.object = object;
 	this.object = object;
 	this.domElement = ( domElement !== undefined ? domElement : document );
 	this.domElement = ( domElement !== undefined ? domElement : document );
 
 
@@ -22,6 +22,8 @@ THREE.OrbitControls = function( object, domElement ) {
 
 
 	// internals
 	// internals
 	
 	
+	var self = this;
+
 	var EPS = 0.000001;
 	var EPS = 0.000001;
 	var PIXELS_PER_ROUND = 1800;
 	var PIXELS_PER_ROUND = 1800;
 
 
@@ -33,6 +35,78 @@ THREE.OrbitControls = function( object, domElement ) {
 	var thetaDelta = 0;
 	var thetaDelta = 0;
 	var scale = 1;
 	var scale = 1;
 
 
+	this.rotateLeft = function ( angle ) {
+
+		if ( angle === undefined ) {
+
+			angle = getAutoRotationAngle();
+
+		}
+		
+		thetaDelta -= angle;
+
+	};
+
+	this.rotateRight = function ( angle ) {
+	
+		if ( angle === undefined ) {
+
+			angle = getAutoRotationAngle();
+
+		}
+
+		thetaDelta += angle;
+	
+	};
+
+	this.rotateUp = function ( angle ) {
+	
+		if ( angle === undefined ) {
+
+			angle = getAutoRotationAngle();
+
+		}
+
+		phiDelta -= angle;
+	
+	};
+
+	this.rotateDown = function ( angle ) {
+	
+		if ( angle === undefined ) {
+
+			angle = getAutoRotationAngle();
+
+		}
+		
+		phiDelta += angle;
+	
+	};
+
+	this.zoomIn = function ( zoomScale ) {
+	
+		if ( zoomScale === undefined ) {
+		
+			zoomScale = getZoomScale();
+		
+		}
+
+		scale /= zoomScale;
+	
+	};
+
+	this.zoomOut = function ( zoomScale ) {
+	
+		if ( zoomScale === undefined ) {
+		
+			zoomScale = getZoomScale();
+		
+		}
+
+		scale *= zoomScale;
+	
+	};
+
 	this.update = function () {
 	this.update = function () {
 
 
 		var position = this.object.position;
 		var position = this.object.position;
@@ -45,42 +119,43 @@ THREE.OrbitControls = function( object, domElement ) {
 		
 		
 		if ( this.autoRotate ) {
 		if ( this.autoRotate ) {
 
 
-			theta += 2 * Math.PI / 60 / 60 * this.autoRotateSpeed;
+			this.rotateLeft( getAutoRotationAngle() );
 
 
 		}
 		}
-
-		if ( this.userRotate ) {
 		
 		
-			theta += thetaDelta;
-			phi += phiDelta;
+		theta += thetaDelta;
+		phi += phiDelta;
 
 
-			// restrict phi to be betwee EPS and PI-EPS
-			phi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );
-
-			thetaDelta = 0;
-			phiDelta = 0;
-
-		}
+		// restrict phi to be betwee EPS and PI-EPS
+		phi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );
 
 
 		var radius = offset.length();
 		var radius = offset.length();
 		offset.x = radius * Math.sin( phi ) * Math.sin( theta );
 		offset.x = radius * Math.sin( phi ) * Math.sin( theta );
 		offset.y = radius * Math.cos( phi );
 		offset.y = radius * Math.cos( phi );
 		offset.z = radius * Math.sin( phi ) * Math.cos( theta );
 		offset.z = radius * Math.sin( phi ) * Math.cos( theta );
-
-		if ( this.userZoom ) {
+		offset.multiplyScalar( scale );
 		
 		
-			offset.multiplyScalar( scale );
-			scale = 1;
-		
-		}
-
 		position.copy( this.center ).addSelf( offset );
 		position.copy( this.center ).addSelf( offset );
 
 
 		this.object.lookAt( this.center );
 		this.object.lookAt( this.center );
 
 
+		thetaDelta = 0;
+		phiDelta = 0;
+		scale = 1;
 	};
 	};
 
 
-	var self = this;
+
+	function getAutoRotationAngle() {
+
+		return 2 * Math.PI / 60 / 60 * self.autoRotateSpeed;
+
+	}
+
+	function getZoomScale() {
+	
+		return Math.pow( 0.95, self.userZoomSpeed );
+	
+	}
 
 
 	function onMouseMove( event ) {
 	function onMouseMove( event ) {
 
 
@@ -89,8 +164,8 @@ THREE.OrbitControls = function( object, domElement ) {
 		rotateEnd.set( event.clientX, event.clientY );
 		rotateEnd.set( event.clientX, event.clientY );
 		rotateDelta.sub( rotateEnd, rotateStart );
 		rotateDelta.sub( rotateEnd, rotateStart );
 
 
-		thetaDelta = -2 * Math.PI * rotateDelta.x / PIXELS_PER_ROUND * self.userRotateSpeed;
-		phiDelta = -2 * Math.PI * rotateDelta.y / PIXELS_PER_ROUND * self.userRotateSpeed;
+		self.rotateLeft( 2 * Math.PI * rotateDelta.x / PIXELS_PER_ROUND * self.userRotateSpeed );
+		self.rotateUp( 2 * Math.PI * rotateDelta.y / PIXELS_PER_ROUND * self.userRotateSpeed );
 
 
 		rotateStart.copy( rotateEnd );
 		rotateStart.copy( rotateEnd );
 
 
@@ -119,30 +194,20 @@ THREE.OrbitControls = function( object, domElement ) {
 
 
 		if ( event.wheelDelta > 0 ) {
 		if ( event.wheelDelta > 0 ) {
 		
 		
-			scale = Math.pow( 0.95, self.userZoomSpeed );
+			self.zoomOut();
 		
 		
 		} else {
 		} else {
 		
 		
-			scale = 1.0 / Math.pow( 0.95, self.userZoomSpeed );
+			self.zoomIn();
 		
 		
 		}
 		}
 	
 	
 	}
 	}
 
 
-	function onKeyDown( event ) {
-
-	}
-
-	function onKeyUp( event ) {
-	
-	}
-
 	this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
 	this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
 	this.domElement.addEventListener( 'mousemove', onMouseMove, false );
 	this.domElement.addEventListener( 'mousemove', onMouseMove, false );
 	this.domElement.addEventListener( 'mousedown', onMouseDown, false );
 	this.domElement.addEventListener( 'mousedown', onMouseDown, false );
 	this.domElement.addEventListener( 'mouseup', onMouseUp, false );
 	this.domElement.addEventListener( 'mouseup', onMouseUp, false );
 	this.domElement.addEventListener( 'mousewheel', onMouseWheel, false );
 	this.domElement.addEventListener( 'mousewheel', onMouseWheel, false );
-	this.domElement.addEventListener( 'keydown', onKeyDown, false );
-	this.domElement.addEventListener( 'keyup', onKeyUp, false );
 
 
 };
 };