"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var KeyEnum_1 = require("./KeyEnum"); var three_1 = require("three"); //相机控制状态 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 = {})); var CameraControls = /** @class */ (function () { function CameraControls(viewer) { var _this = this; 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 = function () { _this.m_KeyDown.clear(); _this.m_MouseDown.clear(); }; //触屏开始事件 this.onTouchStart = function (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 = function (event) { _this.m_State = CameraControlState.Null; }; this.onTouchMove = function (event) { event.preventDefault(); event.stopPropagation(); _this.m_EndClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0); var 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 = function (event) { event.preventDefault(); var 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: { var curTime = Date.now(); var 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 = function (event) { event.preventDefault(); _this.m_State = CameraControlState.Null; _this.m_MouseDown.set(event.button, false); }; this.onMouseMove = function (event) { event.preventDefault(); _this.m_EndClickPoint.set(event.offsetX, event.offsetY, 0); var 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 = function (event) { event.preventDefault(); event.stopPropagation(); var 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 = function (event) { _this.m_KeyDown.set(event.keyCode, true); }; this.onKeyUp = function (event) { _this.m_KeyDown.set(event.keyCode, false); }; this.m_Viewer = viewer; this.m_domElement = viewer.m_Render.domElement.parentElement; this.RegisterEvent(); } CameraControls.prototype.RegisterEvent = function () { 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); } }; CameraControls.prototype.beginRotate = function () { this.m_State = CameraControlState.Rotate; this.m_Viewer.UpdateLockTarget(); }; return CameraControls; }()); exports.CameraControls = CameraControls; //# sourceMappingURL=CameraControls.js.map