mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-09 04:56:01 +10:00
144 lines
3.6 KiB
JavaScript
144 lines
3.6 KiB
JavaScript
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author paulirish / http://paulirish.com/
|
|
*/
|
|
|
|
function bind( scope, fn ) {
|
|
return function () {
|
|
fn.apply( scope, arguments );
|
|
};
|
|
}
|
|
|
|
CameraControlWASD = function ( camera, movement_speed, look_speed, nofly, look_vertical ) {
|
|
|
|
this.movement_speed = movement_speed !== undefined ? movement_speed : 1.0;
|
|
this.look_speed = look_speed !== undefined ? look_speed : 0.005;
|
|
|
|
this.nofly = nofly;
|
|
this.look_vertical = look_vertical;
|
|
|
|
this.camera = camera;
|
|
|
|
this.mouseX = 0;
|
|
this.mouseY = 0;
|
|
|
|
this.lat = 0;
|
|
this.lon = 0;
|
|
this.phy = 0;
|
|
this.theta = 0;
|
|
|
|
this.moveForward = false;
|
|
this.moveBackward = false;
|
|
this.moveLeft = false;
|
|
this.moveRight = false;
|
|
|
|
this.windowHalfX = window.innerWidth / 2;
|
|
this.windowHalfY = window.innerHeight / 2;
|
|
|
|
this.onDocumentMouseDown = function ( event ) {
|
|
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
switch ( event.button ) {
|
|
|
|
case 0: this.moveForward = true; break;
|
|
case 2: this.moveBackward = true; break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
this.onDocumentMouseUp = function ( event ) {
|
|
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
switch ( event.button ) {
|
|
|
|
case 0: this.moveForward = false; break;
|
|
case 2: this.moveBackward = false; break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
this.onDocumentMouseMove = function (event) {
|
|
|
|
this.mouseX = event.clientX - this.windowHalfX;
|
|
this.mouseY = event.clientY - this.windowHalfY;
|
|
|
|
};
|
|
|
|
this.onDocumentKeyDown = function ( event ) {
|
|
|
|
switch( event.keyCode ) {
|
|
|
|
case 38: /*up*/
|
|
case 87: /*W*/ this.moveForward = true; break;
|
|
|
|
case 37: /*left*/
|
|
case 65: /*A*/ this.moveLeft = true; break;
|
|
|
|
case 40: /*down*/
|
|
case 83: /*S*/ this.moveBackward = true; break;
|
|
|
|
case 39: /*right*/
|
|
case 68: /*D*/ this.moveRight = true; break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
this.onDocumentKeyUp = function ( event ) {
|
|
|
|
switch( event.keyCode ) {
|
|
|
|
case 38: /*up*/
|
|
case 87: /*W*/ this.moveForward = false; break;
|
|
|
|
case 37: /*left*/
|
|
case 65: /*A*/ this.moveLeft = false; break;
|
|
|
|
case 40: /*down*/
|
|
case 83: /*S*/ this.moveBackward = false; break;
|
|
|
|
case 39: /*right*/
|
|
case 68: /*D*/ this.moveRight = false; break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
this.update = function() {
|
|
|
|
if ( this.moveForward ) this.camera.translateZ( - this.movement_speed, this.nofly );
|
|
if ( this.moveBackward ) this.camera.translateZ( this.movement_speed, this.nofly );
|
|
if ( this.moveLeft ) this.camera.translateX( - this.movement_speed, this.nofly );
|
|
if ( this.moveRight ) this.camera.translateX( this.movement_speed, this.nofly );
|
|
|
|
this.lon += this.mouseX * this.look_speed;
|
|
if( this.look_vertical ) this.lat -= this.mouseY * this.look_speed;
|
|
|
|
this.lat = Math.max( - 85, Math.min( 85, this.lat ) );
|
|
this.phi = ( 90 - this.lat ) * Math.PI / 180;
|
|
this.theta = this.lon * Math.PI / 180;
|
|
|
|
this.camera.target.position.x = 100 * Math.sin( this.phi ) * Math.cos( this.theta ) + this.camera.position.x;
|
|
this.camera.target.position.y = 100 * Math.cos( this.phi ) + this.camera.position.y;
|
|
this.camera.target.position.z = 100 * Math.sin( this.phi ) * Math.sin( this.theta ) + this.camera.position.z;
|
|
|
|
};
|
|
|
|
|
|
document.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
|
|
|
|
document.addEventListener( 'mousemove', bind( this, this.onDocumentMouseMove ), false );
|
|
document.addEventListener( 'mousedown', bind( this, this.onDocumentMouseDown ), false );
|
|
document.addEventListener( 'mouseup', bind( this, this.onDocumentMouseUp ), false );
|
|
document.addEventListener( 'keydown', bind( this, this.onDocumentKeyDown ), false );
|
|
document.addEventListener( 'keyup', bind( this, this.onDocumentKeyUp ), false );
|
|
|
|
};
|