diff --git a/3DProject.html b/3DProject.html index 54b243edf43b9c1743e41a1076e98ecc3a1c83c7..bfd46b1b32ea7b289e7d40087c401dfb6fd79237 100644 --- a/3DProject.html +++ b/3DProject.html @@ -28,6 +28,7 @@ + @@ -43,6 +44,7 @@ + @@ -53,17 +55,13 @@ */ -THREE.ThreeJs_Drag = function ( _camera, _domElement, _scene, _controls) { +THREE.ThreeJs_Drag = function ( _camera, _domElement, _scene, _controls, _isPaused) { // 过滤不是 Mesh 的物体,例如辅助网格 var objects = []; for (var i = 0; i < _scene.children.length; i++) { @@ -21,9 +21,11 @@ THREE.ThreeJs_Drag = function ( _camera, _domElement, _scene, _controls) { var dragControls = new THREE.DragControls( objects, _camera, _domElement ); dragControls.addEventListener( 'dragstart', function ( event ) { _controls.enabled = false; + _isPaused = true; } ); dragControls.addEventListener( 'dragend', function ( event ) { _controls.enabled = true; + _isPaused = false; } ); // // 添加平移控件 // var transformControls = new THREE.TransformControls(_camera, _domElement); diff --git a/ThreeJs/config.js b/ThreeJs/config.js new file mode 100644 index 0000000000000000000000000000000000000000..2b5e05f8b7246178fe71227f3f53f595c44ea877 --- /dev/null +++ b/ThreeJs/config.js @@ -0,0 +1,65 @@ +/** + * 这是模型的静态常量配置 + * 和货架的配置(一般要从数据库读取,这里仅做演示) + * @author 谢宁, Created on 2020-01-07 + */ +/** ***************************************************************** */ + +var PLANE_LENGTH = 24; //货架板面长度 +var PLANE_WIDTH = 55; //货架板面宽度 +var PLANE_HEIGHT = 2; //货架板面高度 +var HOLDER_LENGTH = 2; //支架长度 +var HOLDER_WIDTH = 2; //支架宽度 +var HOLDER_HEIGHT = 25; //支架高度 +var LAYER_NUM = 3; //货架层数 +var COLUMN_NUM = 2; //货架每层列数 +var BOX_SIZE = 16; //货物的大小(立方体) + +//货架数组 +var shelf_list = new Array(); +shelf_list.push({StorageZoneId:'Z1',shelfId:'A1',shelfName:'货架A1',x:-100,y:27,z:0}); +shelf_list.push({StorageZoneId:'Z1',shelfId:'A2',shelfName:'货架A2',x:0,y:27,z:0}); +shelf_list.push({StorageZoneId:'Z1',shelfId:'A3',shelfName:'货架A3',x:100,y:27,z:0}); +shelf_list.push({StorageZoneId:'Z1',shelfId:'A4',shelfName:'货架A4',x:200,y:27,z:0}); +shelf_list.push({StorageZoneId:'Z1',shelfId:'A5',shelfName:'货架A5',x:300,y:27,z:0}); +shelf_list.push({StorageZoneId:'Z1',shelfId:'A6',shelfName:'货架A6',x:400,y:27,z:0}); + +function GET_PLANE_LENGTH(){ + return PLANE_LENGTH; +} + +function GET_PLANE_WIDTH(){ + return PLANE_WIDTH; +} + +function GET_PLANE_HEIGHT(){ + return PLANE_HEIGHT; +} + +function GET_HOLDER_LENGTH(){ + return HOLDER_LENGTH; +} + +function GET_HOLDER_WIDTH(){ + return HOLDER_WIDTH; +} + +function GET_HOLDER_HEIGHT(){ + return HOLDER_HEIGHT; +} + +function GET_LAYER_NUM(){ + return LAYER_NUM; +} + +function GET_COLUMN_NUM(){ + return COLUMN_NUM; +} + +function GET_BOX_SIZE(){ + return BOX_SIZE; +} + +function GET_SHELF_LIST(){ + return shelf_list; +} diff --git a/ThreeJs/js/FirstPersonControls.js b/ThreeJs/js/FirstPersonControls.js new file mode 100644 index 0000000000000000000000000000000000000000..4994e003073250ce1eb9c658f181671545dcaad3 --- /dev/null +++ b/ThreeJs/js/FirstPersonControls.js @@ -0,0 +1,300 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author paulirish / http://paulirish.com/ + */ + +THREE.FirstPersonControls = function ( object, domElement ) { + + this.object = object; + this.target = new THREE.Vector3( 0, 0, 0 ); + + this.domElement = ( domElement !== undefined ) ? domElement : document; + + this.enabled = true; + + this.movementSpeed = 1.0; + this.lookSpeed = 0.005; + + this.lookVertical = true; + this.autoForward = false; + + this.activeLook = true; + + this.heightSpeed = false; + this.heightCoef = 1.0; + this.heightMin = 0.0; + this.heightMax = 1.0; + + this.constrainVertical = false; + this.verticalMin = 0; + this.verticalMax = Math.PI; + + this.autoSpeedFactor = 0.0; + + this.mouseX = 0; + this.mouseY = 0; + + this.lat = 0; + this.lon = 0; + this.phi = 0; + this.theta = 0; + + this.moveForward = false; + this.moveBackward = false; + this.moveLeft = false; + this.moveRight = false; + + this.mouseDragOn = false; + + this.viewHalfX = 0; + this.viewHalfY = 0; + + if ( this.domElement !== document ) { + + this.domElement.setAttribute( 'tabindex', - 1 ); + + } + + // + + this.handleResize = function () { + + if ( this.domElement === document ) { + + this.viewHalfX = window.innerWidth / 2; + this.viewHalfY = window.innerHeight / 2; + + } else { + + this.viewHalfX = this.domElement.offsetWidth / 2; + this.viewHalfY = this.domElement.offsetHeight / 2; + + } + + }; + + this.onMouseDown = function ( event ) { + + if ( this.domElement !== document ) { + + this.domElement.focus(); + + } + + event.preventDefault(); + event.stopPropagation(); + + if ( this.activeLook ) { + + switch ( event.button ) { + + case 0: this.moveForward = true; break; + case 2: this.moveBackward = true; break; + + } + + } + + this.mouseDragOn = true; + + }; + + this.onMouseUp = function ( event ) { + + event.preventDefault(); + event.stopPropagation(); + + if ( this.activeLook ) { + + switch ( event.button ) { + + case 0: this.moveForward = false; break; + case 2: this.moveBackward = false; break; + + } + + } + + this.mouseDragOn = false; + + }; + + this.onMouseMove = function ( event ) { + + if ( this.domElement === document ) { + + this.mouseX = event.pageX - this.viewHalfX; + this.mouseY = event.pageY - this.viewHalfY; + + } else { + + this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX; + this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY; + + } + + }; + + this.onKeyDown = function ( event ) { + + //event.preventDefault(); + + 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; + + case 82: /*R*/ this.moveUp = true; break; + case 70: /*F*/ this.moveDown = true; break; + + } + + }; + + this.onKeyUp = 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; + + case 82: /*R*/ this.moveUp = false; break; + case 70: /*F*/ this.moveDown = false; break; + + } + + }; + + this.update = function ( delta ) { + + if ( this.enabled === false ) return; + + if ( this.heightSpeed ) { + + var y = THREE.Math.clamp( this.object.position.y, this.heightMin, this.heightMax ); + var heightDelta = y - this.heightMin; + + this.autoSpeedFactor = delta * ( heightDelta * this.heightCoef ); + + } else { + + this.autoSpeedFactor = 0.0; + + } + + var actualMoveSpeed = delta * this.movementSpeed; + + if ( this.moveForward || ( this.autoForward && ! this.moveBackward ) ) this.object.translateZ( - ( actualMoveSpeed + this.autoSpeedFactor ) ); + if ( this.moveBackward ) this.object.translateZ( actualMoveSpeed ); + + if ( this.moveLeft ) this.object.translateX( - actualMoveSpeed ); + if ( this.moveRight ) this.object.translateX( actualMoveSpeed ); + + if ( this.moveUp ) this.object.translateY( actualMoveSpeed ); + if ( this.moveDown ) this.object.translateY( - actualMoveSpeed ); + + var actualLookSpeed = delta * this.lookSpeed; + + if ( ! this.activeLook ) { + + actualLookSpeed = 0; + + } + + var verticalLookRatio = 1; + + if ( this.constrainVertical ) { + + verticalLookRatio = Math.PI / ( this.verticalMax - this.verticalMin ); + + } + + this.lon += this.mouseX * actualLookSpeed; + if ( this.lookVertical ) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio; + + this.lat = Math.max( - 85, Math.min( 85, this.lat ) ); + this.phi = THREE.Math.degToRad( 90 - this.lat ); + + this.theta = THREE.Math.degToRad( this.lon ); + + if ( this.constrainVertical ) { + + this.phi = THREE.Math.mapLinear( this.phi, 0, Math.PI, this.verticalMin, this.verticalMax ); + + } + + var targetPosition = this.target, + position = this.object.position; + + targetPosition.x = position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta ); + targetPosition.y = position.y + 100 * Math.cos( this.phi ); + targetPosition.z = position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta ); + + this.object.lookAt( targetPosition ); + + }; + + function contextmenu( event ) { + + event.preventDefault(); + + } + + this.dispose = function () { + + this.domElement.removeEventListener( 'contextmenu', contextmenu, false ); + this.domElement.removeEventListener( 'mousedown', _onMouseDown, false ); + this.domElement.removeEventListener( 'mousemove', _onMouseMove, false ); + this.domElement.removeEventListener( 'mouseup', _onMouseUp, false ); + + window.removeEventListener( 'keydown', _onKeyDown, false ); + window.removeEventListener( 'keyup', _onKeyUp, false ); + + }; + + var _onMouseMove = bind( this, this.onMouseMove ); + var _onMouseDown = bind( this, this.onMouseDown ); + var _onMouseUp = bind( this, this.onMouseUp ); + var _onKeyDown = bind( this, this.onKeyDown ); + var _onKeyUp = bind( this, this.onKeyUp ); + + this.domElement.addEventListener( 'contextmenu', contextmenu, false ); + this.domElement.addEventListener( 'mousemove', _onMouseMove, false ); + this.domElement.addEventListener( 'mousedown', _onMouseDown, false ); + this.domElement.addEventListener( 'mouseup', _onMouseUp, false ); + + window.addEventListener( 'keydown', _onKeyDown, false ); + window.addEventListener( 'keyup', _onKeyUp, false ); + + function bind( scope, fn ) { + + return function () { + + fn.apply( scope, arguments ); + + }; + + } + + this.handleResize(); + +}; diff --git a/images/lunbo1.jpg b/images/lunbo1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0a9c817135dba8a4aea8edf247722b1bfc46244 Binary files /dev/null and b/images/lunbo1.jpg differ diff --git a/images/lunbo2.jpg b/images/lunbo2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..062a8975562aa9c1d4bf0759b69ed6eeee332725 Binary files /dev/null and b/images/lunbo2.jpg differ diff --git a/images/lunbo3.jpg b/images/lunbo3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1c8d27f0a22f7d4a9594fface2983874d7d7ab1 Binary files /dev/null and b/images/lunbo3.jpg differ