"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const THREE = require("three"); const KeyEnum_1 = require("./KeyEnum"); const three_1 = require("three"); //控制类型 var CameraControlsEnabled; (function (CameraControlsEnabled) { CameraControlsEnabled[CameraControlsEnabled["Rotate"] = 1] = "Rotate"; CameraControlsEnabled[CameraControlsEnabled["Zoom"] = 2] = "Zoom"; CameraControlsEnabled[CameraControlsEnabled["Pan"] = 4] = "Pan"; })(CameraControlsEnabled || (CameraControlsEnabled = {})); //相机控制状态 var CameraControlState; (function (CameraControlState) { CameraControlState[CameraControlState["Null"] = 0] = "Null"; CameraControlState[CameraControlState["Pan"] = 1] = "Pan"; CameraControlState[CameraControlState["Rotate"] = 2] = "Rotate"; CameraControlState[CameraControlState["Scale"] = 3] = "Scale"; })(CameraControlState = exports.CameraControlState || (exports.CameraControlState = {})); class CameraControls { constructor(viewer) { this.m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale, CameraControlState.Pan]; //起始点击 this.m_StartClickPoint = new THREE.Vector3(); this.m_EndClickPoint = new THREE.Vector3(); this.m_DollyStart = new THREE.Vector2(); this.m_DollyEnd = new THREE.Vector2(); this.m_KeyDown = new Map(); this.m_MouseDown = new Map(); //状态 this.m_State = CameraControlState.Null; //左键使用旋转 this.m_LeftUseRotate = true; /** * 窗体失去焦点时. * * @memberof CameraControls */ this.onBlur = () => { this.m_KeyDown.clear(); this.m_MouseDown.clear(); }; //触屏开始事件 this.onTouchStart = (event) => { this.m_Viewer.UpdateLockTarget(); this.m_StartClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0); if (event.touches.length < 4) { if (event.touches.length == 2) { var dx = event.touches[0].pageX - event.touches[1].pageX; var dy = event.touches[0].pageY - event.touches[1].pageY; var distance = Math.sqrt(dx * dx + dy * dy); this.m_DollyStart.set(0, distance); } this.m_State = this.m_TouthTypeList[event.touches.length - 1]; } }; this.onTouchEnd = (event) => { this.m_State = CameraControlState.Null; }; this.onTouchMove = (event) => { event.preventDefault(); event.stopPropagation(); this.m_EndClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0); let vec = this.m_EndClickPoint.clone().sub(this.m_StartClickPoint); switch (this.m_State) { case CameraControlState.Pan: { this.m_Viewer.Pan(vec); break; } case CameraControlState.Scale: { var dx = event.touches[0].pageX - event.touches[1].pageX; var dy = event.touches[0].pageY - event.touches[1].pageY; var distance = Math.sqrt(dx * dx + dy * dy); this.m_DollyEnd.set(0, distance); if (distance > this.m_DollyStart.y) { this.m_Viewer.Zoom(0.95); } else { this.m_Viewer.Zoom(1.05); } this.m_DollyStart.copy(this.m_DollyEnd); break; } case CameraControlState.Rotate: { this.m_Viewer.Rotate(vec.multiplyScalar(2)); break; } } this.m_StartClickPoint.copy(this.m_EndClickPoint); this.m_Viewer.m_bNeedUpdate = true; }; //最后一次按中键的时间 this.lastMiddleClickTime = 0; //鼠标 this.onMouseDown = (event) => { event.preventDefault(); let key = event.button; this.m_MouseDown.set(key, true); this.m_StartClickPoint.set(event.offsetX, event.offsetY, 0); switch (key) { case KeyEnum_1.MouseKey.Left: { if (this.m_LeftUseRotate) { this.beginRotate(); } break; } case KeyEnum_1.MouseKey.Middle: { let curTime = Date.now(); let t = curTime - this.lastMiddleClickTime; this.lastMiddleClickTime = curTime; if (t < 350) { this.m_Viewer.ZoomAll(); return; } if (this.m_KeyDown.get(KeyEnum_1.KeyBoard.Control)) { this.beginRotate(); } else { this.m_State = CameraControlState.Pan; } break; } case KeyEnum_1.MouseKey.Right: { break; } } }; this.onMouseUp = (event) => { event.preventDefault(); this.m_State = CameraControlState.Null; this.m_MouseDown.set(event.button, false); }; this.onMouseMove = (event) => { event.preventDefault(); this.m_EndClickPoint.set(event.offsetX, event.offsetY, 0); let changeVec = this.m_EndClickPoint.clone().sub(this.m_StartClickPoint); this.m_StartClickPoint.copy(this.m_EndClickPoint); if ((this.m_LeftUseRotate || (this.m_KeyDown.get(KeyEnum_1.KeyBoard.Control))) && this.m_State == CameraControlState.Rotate) { this.m_Viewer.Rotate(changeVec); } switch (this.m_State) { case CameraControlState.Pan: { this.m_Viewer.Pan(changeVec); break; } case CameraControlState.Rotate: { break; } case CameraControlState.Scale: { break; } } }; /** * 鼠标滚轮事件 * * @memberof CameraControls */ this.onMouseWheel = (event) => { event.preventDefault(); event.stopPropagation(); let pt = new THREE.Vector3(event.offsetX, event.offsetY, 0); this.m_Viewer.ScreenToWorld(pt, new three_1.Vector3().setFromMatrixColumn(this.m_Viewer.m_Camera.Camera.matrixWorld, 2)); if (event.deltaY < 0) { this.m_Viewer.Zoom(0.6, pt); } else if (event.deltaY > 0) { this.m_Viewer.Zoom(1.4, pt); } }; //按键 this.onKeyDown = (event) => { this.m_KeyDown.set(event.keyCode, true); }; this.onKeyUp = (event) => { this.m_KeyDown.set(event.keyCode, false); }; this.m_Viewer = viewer; this.m_domElement = viewer.m_Render.domElement.parentElement; this.RegisterEvent(); } RegisterEvent() { if (this.m_domElement) { this.m_domElement.addEventListener("mousedown", this.onMouseDown, false); this.m_domElement.addEventListener("mousemove", this.onMouseMove, false); this.m_domElement.addEventListener("mouseup", this.onMouseUp, false); window.addEventListener("keydown", this.onKeyDown, false); window.addEventListener("keyup", this.onKeyUp, false); this.m_domElement.addEventListener('wheel', this.onMouseWheel, false); this.m_domElement.addEventListener('touchstart', this.onTouchStart, false); this.m_domElement.addEventListener('touchend', this.onTouchEnd, false); this.m_domElement.addEventListener('touchmove', this.onTouchMove, false); window.addEventListener("blur", this.onBlur, false); } } beginRotate() { this.m_State = CameraControlState.Rotate; this.m_Viewer.UpdateLockTarget(); } } exports.CameraControls = CameraControls; //# sourceMappingURL=CameraControls.js.map