import { Vector3 } from 'three'; import type { Viewer } from './Viewer'; /** * 材质编辑器的场景鼠标控制. */ export class MaterialEditorCamerControl { private Viewer: Viewer; //State. private _MouseIsDown: boolean = false; private _StartPoint: Vector3 = new Vector3(); private _EndPoint = new Vector3(); private pointId: number; constructor(view: Viewer) { this.Viewer = view; this.initMouseControl(); } initMouseControl() { let el = this.Viewer.Renderer.domElement; el.addEventListener("pointerdown", (e) => { this.pointId = e.pointerId; }, false); el.addEventListener("mousedown", this.onMouseDown, false); el.addEventListener("mousemove", this.onMouseMove, false); el.addEventListener("mouseup", this.onMouseUp, false); el.addEventListener('wheel', this.onMouseWheel, false); } onMouseDown = (event: MouseEvent) => { this.requestPointerLock(); this._MouseIsDown = true; this._StartPoint.set(event.offsetX, event.offsetY, 0); }; onMouseUp = (event: MouseEvent) => { this._MouseIsDown = false; this.exitPointerLock(); }; onMouseMove = (event: MouseEvent) => { event.preventDefault(); if (this._MouseIsDown) { this._EndPoint.set(event.offsetX, event.offsetY, 0); let changeVec: Vector3 = new Vector3(); changeVec.subVectors(this._EndPoint, this._StartPoint); this._StartPoint.copy(this._EndPoint); this.Viewer.Rotate(changeVec); } }; onMouseWheel = (event: WheelEvent) => { if (event.deltaY < 0) { this.Viewer.Zoom(0.6); } else if (event.deltaY > 0) { this.Viewer.Zoom(1.4); } }; requestPointerLock() { if (this.Viewer.Renderer.domElement.setPointerCapture) this.Viewer.Renderer.domElement.setPointerCapture(this.pointId); } exitPointerLock() { if (this.Viewer.Renderer.domElement.releasePointerCapture && this.pointId !== undefined) { try { this.Viewer.Renderer.domElement.releasePointerCapture(this.pointId); } catch (error) { } } } }