mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-09 04:56:01 +10:00
added minMaxDistances to TrackballCamera and some refactorings
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @author Eberhard Gräther / http://egraether.com/
|
||||
* @author Eberhard Graether / http://egraether.com/
|
||||
|
||||
* parameters = {
|
||||
* fov: <float>,
|
||||
@@ -11,6 +11,7 @@
|
||||
* radius: <float>,
|
||||
* screen: { width : <float>, height : <float>, offsetLeft : <float>, offsetTop : <float> },
|
||||
|
||||
* rotateSpeed: <float>,
|
||||
* zoomSpeed: <float>,
|
||||
* panSpeed: <float>,
|
||||
|
||||
@@ -20,6 +21,9 @@
|
||||
* staticMoving: <bool>,
|
||||
* dynamicDampingFactor: <float>,
|
||||
|
||||
* minDistance: <float>,
|
||||
* maxDistance: <float>,
|
||||
|
||||
* keys: <Array>, // [ rotateKey, zoomKey, panKey ],
|
||||
|
||||
* domElement: <HTMLElement>,
|
||||
@@ -39,6 +43,7 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
this.screen = parameters.screen || { width : window.innerWidth, height : window.innerHeight, offsetLeft : 0, offsetTop : 0 };
|
||||
this.radius = parameters.radius || ( this.screen.width + this.screen.height ) / 4;
|
||||
|
||||
this.rotateSpeed = parameters.rotateSpeed || 1.0;
|
||||
this.zoomSpeed = parameters.zoomSpeed || 1.2;
|
||||
this.panSpeed = parameters.panSpeed || 0.3;
|
||||
|
||||
@@ -48,7 +53,10 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
this.staticMoving = parameters.staticMoving || false;
|
||||
this.dynamicDampingFactor = parameters.dynamicDampingFactor || 0.2;
|
||||
|
||||
this.keys = parameters.keys || [ 65 /*A*/, 83 /*S*/, 68 /*D*/ ];
|
||||
this.minDistance = parameters.minDistance || 0;
|
||||
this.maxDistance = parameters.maxDistance || Infinity;
|
||||
|
||||
this.keys = parameters.keys || [ 16 /*SHIFT*/, 18 /*ALT*/, 17 /*CTRL*/ ];
|
||||
|
||||
this.useTarget = true;
|
||||
|
||||
@@ -126,14 +134,20 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
var axis = (new THREE.Vector3()).cross( _rotateStart, _rotateEnd ).normalize(),
|
||||
quaternion = new THREE.Quaternion();
|
||||
|
||||
angle *= this.rotateSpeed;
|
||||
|
||||
quaternion.setFromAxisAngle( axis, -angle );
|
||||
|
||||
quaternion.multiplyVector3( this.position );
|
||||
quaternion.multiplyVector3( this.up );
|
||||
|
||||
if ( !this.staticMoving ) {
|
||||
quaternion.multiplyVector3( _rotateEnd );
|
||||
|
||||
quaternion.multiplyVector3( _rotateEnd );
|
||||
if ( this.staticMoving ) {
|
||||
|
||||
_rotateStart = _rotateEnd;
|
||||
|
||||
} else {
|
||||
|
||||
quaternion.setFromAxisAngle( axis, angle * ( this.dynamicDampingFactor - 1.0 ) );
|
||||
quaternion.multiplyVector3( _rotateStart );
|
||||
@@ -196,15 +210,33 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
this.update = function( parentMatrixWorld, forceUpdate, camera ) {
|
||||
|
||||
if ( !this.staticMoving ) {
|
||||
|
||||
this.rotateCamera();
|
||||
this.checkDistances = function() {
|
||||
|
||||
if ( !this.noZoom || !this.noPan ) {
|
||||
|
||||
if ( this.position.lengthSq() > this.maxDistance * this.maxDistance ) {
|
||||
|
||||
this.position.setLength( this.maxDistance );
|
||||
|
||||
}
|
||||
|
||||
var eye = this.position.clone().subSelf( this.target.position );
|
||||
|
||||
if ( eye.lengthSq() < this.minDistance * this.minDistance ) {
|
||||
|
||||
this.position.add( this.target.position, eye.setLength( this.minDistance ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
this.update = function( parentMatrixWorld, forceUpdate, camera ) {
|
||||
|
||||
this.rotateCamera();
|
||||
|
||||
if ( !this.noZoom ) {
|
||||
|
||||
this.zoomCamera();
|
||||
@@ -216,11 +248,14 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
this.panCamera();
|
||||
|
||||
}
|
||||
|
||||
|
||||
this.checkDistances();
|
||||
|
||||
this.supr.update.call( this, parentMatrixWorld, forceUpdate, camera );
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
// listeners
|
||||
|
||||
function keydown( event ) {
|
||||
@@ -232,16 +267,19 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
} else if ( event.keyCode === this.keys[ this.STATE.ROTATE ] ) {
|
||||
|
||||
_state = this.STATE.ROTATE;
|
||||
_keyPressed = true;
|
||||
|
||||
} else if ( event.keyCode === this.keys[ this.STATE.ZOOM ] ) {
|
||||
} else if ( event.keyCode === this.keys[ this.STATE.ZOOM ] && !this.noZoom ) {
|
||||
|
||||
_state = this.STATE.ZOOM;
|
||||
_keyPressed = true;
|
||||
|
||||
} else if ( event.keyCode === this.keys[ this.STATE.PAN ] ) {
|
||||
} else if ( event.keyCode === this.keys[ this.STATE.PAN ] && !this.noPan ) {
|
||||
|
||||
_state = this.STATE.PAN;
|
||||
|
||||
}
|
||||
|
||||
if ( _state !== this.STATE.NONE ) {
|
||||
|
||||
_keyPressed = true;
|
||||
|
||||
}
|
||||
@@ -271,11 +309,11 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
|
||||
_rotateStart = _rotateEnd = this.getMouseProjectionOnBall( event.clientX, event.clientY );
|
||||
|
||||
} else if ( _state === this.STATE.ZOOM ) {
|
||||
} else if ( _state === this.STATE.ZOOM && !this.noZoom ) {
|
||||
|
||||
_zoomStart = _zoomEnd = this.getMouseOnScreen( event.clientX, event.clientY );
|
||||
|
||||
} else {
|
||||
} else if ( !this.noPan ) {
|
||||
|
||||
_panStart = _panEnd = this.getMouseOnScreen( event.clientX, event.clientY );
|
||||
|
||||
@@ -305,12 +343,6 @@ THREE.TrackballCamera = function ( parameters ) {
|
||||
|
||||
_rotateEnd = this.getMouseProjectionOnBall( event.clientX, event.clientY );
|
||||
|
||||
if ( this.staticMoving ) {
|
||||
|
||||
this.rotateCamera();
|
||||
|
||||
}
|
||||
|
||||
} else if ( _state === this.STATE.ZOOM && !this.noZoom ) {
|
||||
|
||||
_zoomEnd = this.getMouseOnScreen( event.clientX, event.clientY );
|
||||
|
||||
Reference in New Issue
Block a user