three-stdlib 2.31.0 → 2.32.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- {"version":3,"file":"ArcballControls.cjs","sources":["../../src/controls/ArcballControls.ts"],"sourcesContent":["import {\n GridHelper,\n EllipseCurve,\n BufferGeometry,\n Line,\n LineBasicMaterial,\n Raycaster,\n Group,\n Box3,\n Sphere,\n Quaternion,\n Vector2,\n Vector3,\n Matrix4,\n MathUtils,\n Scene,\n PerspectiveCamera,\n OrthographicCamera,\n Mesh,\n Material,\n EventDispatcher,\n} from 'three'\n\ntype Camera = OrthographicCamera | PerspectiveCamera\ntype Operation = 'PAN' | 'ROTATE' | 'ZOOM' | 'FOV'\ntype MouseButtonType = number | 'WHEEL'\ntype ModifierKey = 'CTRL' | 'SHIFT'\ntype MouseAction = {\n operation: Operation\n mouse: MouseButtonType\n key: ModifierKey | null\n}\n\ntype Transformation = {\n camera: Matrix4 | null\n gizmos: Matrix4 | null\n}\n\n//trackball state\nconst STATE = {\n IDLE: Symbol(),\n ROTATE: Symbol(),\n PAN: Symbol(),\n SCALE: Symbol(),\n FOV: Symbol(),\n FOCUS: Symbol(),\n ZROTATE: Symbol(),\n TOUCH_MULTI: Symbol(),\n ANIMATION_FOCUS: Symbol(),\n ANIMATION_ROTATE: Symbol(),\n}\n\nconst INPUT = {\n NONE: Symbol(),\n ONE_FINGER: Symbol(),\n ONE_FINGER_SWITCHED: Symbol(),\n TWO_FINGER: Symbol(),\n MULT_FINGER: Symbol(),\n CURSOR: Symbol(),\n}\n\n//cursor center coordinates\nconst _center = {\n x: 0,\n y: 0,\n}\n\n//transformation matrices for gizmos and camera\nconst _transformation: Transformation = {\n camera: new Matrix4(),\n gizmos: new Matrix4(),\n}\n\n//events\nconst _changeEvent = { type: 'change' }\nconst _startEvent = { type: 'start' }\nconst _endEvent = { type: 'end' }\n\n/**\n *\n * @param {CamOrthographicCamera | PerspectiveCameraera} camera Virtual camera used in the scene\n * @param {HTMLElement=null} domElement Renderer's dom element\n * @param {Scene=null} scene The scene to be rendered\n */\nclass ArcballControls extends EventDispatcher {\n private camera: OrthographicCamera | PerspectiveCamera | null\n private domElement: HTMLElement | null | undefined\n private scene: Scene | null | undefined\n\n private mouseActions: (MouseAction & { state: Symbol })[]\n private _mouseOp: Operation | null\n\n private _v2_1: Vector2\n private _v3_1: Vector3\n private _v3_2: Vector3\n\n private _m4_1: Matrix4\n private _m4_2: Matrix4\n\n private _quat: Quaternion\n\n private _translationMatrix: Matrix4\n private _rotationMatrix: Matrix4\n private _scaleMatrix: Matrix4\n\n private _rotationAxis: Vector3\n\n private _cameraMatrixState: Matrix4\n private _cameraProjectionState: Matrix4\n\n private _fovState: number\n private _upState: Vector3\n private _zoomState: number\n private _nearPos: number\n private _farPos: number\n\n private _gizmoMatrixState: Matrix4\n\n private _up0: Vector3\n private _zoom0: number\n private _fov0: number\n private _initialNear: number\n private _nearPos0: number\n private _initialFar: number\n private _farPos0: number\n private _cameraMatrixState0: Matrix4\n private _gizmoMatrixState0: Matrix4\n\n private _button: MouseButtonType\n private _touchStart: PointerEvent[]\n private _touchCurrent: PointerEvent[]\n private _input: Symbol\n\n private _switchSensibility: number\n private _startFingerDistance: number\n private _currentFingerDistance: number\n private _startFingerRotation: number\n private _currentFingerRotation: number\n\n private _devPxRatio: number\n private _downValid: boolean\n private _nclicks: number\n private _downEvents: PointerEvent[]\n private _clickStart: number\n private _maxDownTime: number\n private _maxInterval: number\n private _posThreshold: number\n private _movementThreshold: number\n\n private _currentCursorPosition: Vector3\n private _startCursorPosition: Vector3\n\n private _grid: GridHelper | null\n private _gridPosition: Vector3\n\n private _gizmos: Group\n private _curvePts: number\n\n private _timeStart: number\n private _animationId: number\n\n public focusAnimationTime: number\n\n private _timePrev: number\n private _timeCurrent: number\n private _anglePrev: number\n private _angleCurrent: number\n private _cursorPosPrev: Vector3\n private _cursorPosCurr: Vector3\n private _wPrev: number\n private _wCurr: number\n\n public adjustNearFar: boolean\n public scaleFactor: number\n public dampingFactor: number\n public wMax: number\n public enableAnimations: boolean\n public enableGrid: boolean\n public cursorZoom: boolean\n public minFov: number\n public maxFov: number\n\n public enabled: boolean\n public enablePan: boolean\n public enableRotate: boolean\n public enableZoom: boolean\n\n public minDistance: number\n public maxDistance: number\n public minZoom: number\n public maxZoom: number\n\n private target: Vector3\n private _currentTarget: Vector3\n\n private _tbRadius: number\n\n private _state: Symbol\n\n constructor(\n camera: Camera | null,\n domElement: HTMLElement | null | undefined = null,\n scene: Scene | null | undefined = null,\n ) {\n super()\n this.camera = null\n this.domElement = domElement\n this.scene = scene\n\n this.mouseActions = []\n this._mouseOp = null\n\n //global vectors and matrices that are used in some operations to avoid creating new objects every time (e.g. every time cursor moves)\n this._v2_1 = new Vector2()\n this._v3_1 = new Vector3()\n this._v3_2 = new Vector3()\n\n this._m4_1 = new Matrix4()\n this._m4_2 = new Matrix4()\n\n this._quat = new Quaternion()\n\n //transformation matrices\n this._translationMatrix = new Matrix4() //matrix for translation operation\n this._rotationMatrix = new Matrix4() //matrix for rotation operation\n this._scaleMatrix = new Matrix4() //matrix for scaling operation\n\n this._rotationAxis = new Vector3() //axis for rotate operation\n\n //camera state\n this._cameraMatrixState = new Matrix4()\n this._cameraProjectionState = new Matrix4()\n\n this._fovState = 1\n this._upState = new Vector3()\n this._zoomState = 1\n this._nearPos = 0\n this._farPos = 0\n\n this._gizmoMatrixState = new Matrix4()\n\n //initial values\n this._up0 = new Vector3()\n this._zoom0 = 1\n this._fov0 = 0\n this._initialNear = 0\n this._nearPos0 = 0\n this._initialFar = 0\n this._farPos0 = 0\n this._cameraMatrixState0 = new Matrix4()\n this._gizmoMatrixState0 = new Matrix4()\n\n //pointers array\n this._button = -1\n this._touchStart = []\n this._touchCurrent = []\n this._input = INPUT.NONE\n\n //two fingers touch interaction\n this._switchSensibility = 32 //minimum movement to be performed to fire single pan start after the second finger has been released\n this._startFingerDistance = 0 //distance between two fingers\n this._currentFingerDistance = 0\n this._startFingerRotation = 0 //amount of rotation performed with two fingers\n this._currentFingerRotation = 0\n\n //double tap\n this._devPxRatio = 0\n this._downValid = true\n this._nclicks = 0\n this._downEvents = []\n this._clickStart = 0 //first click time\n this._maxDownTime = 250\n this._maxInterval = 300\n this._posThreshold = 24\n this._movementThreshold = 24\n\n //cursor positions\n this._currentCursorPosition = new Vector3()\n this._startCursorPosition = new Vector3()\n\n //grid\n this._grid = null //grid to be visualized during pan operation\n this._gridPosition = new Vector3()\n\n //gizmos\n this._gizmos = new Group()\n this._curvePts = 128\n\n //animations\n this._timeStart = -1 //initial time\n this._animationId = -1\n\n //focus animation\n this.focusAnimationTime = 500 //duration of focus animation in ms\n\n //rotate animation\n this._timePrev = 0 //time at which previous rotate operation has been detected\n this._timeCurrent = 0 //time at which current rotate operation has been detected\n this._anglePrev = 0 //angle of previous rotation\n this._angleCurrent = 0 //angle of current rotation\n this._cursorPosPrev = new Vector3() //cursor position when previous rotate operation has been detected\n this._cursorPosCurr = new Vector3() //cursor position when current rotate operation has been detected\n this._wPrev = 0 //angular velocity of the previous rotate operation\n this._wCurr = 0 //angular velocity of the current rotate operation\n\n //parameters\n this.adjustNearFar = false\n this.scaleFactor = 1.1 //zoom/distance multiplier\n this.dampingFactor = 25\n this.wMax = 20 //maximum angular velocity allowed\n this.enableAnimations = true //if animations should be performed\n this.enableGrid = false //if grid should be showed during pan operation\n this.cursorZoom = false //if wheel zoom should be cursor centered\n this.minFov = 5\n this.maxFov = 90\n\n this.enabled = true\n this.enablePan = true\n this.enableRotate = true\n this.enableZoom = true\n\n this.minDistance = 0\n this.maxDistance = Infinity\n this.minZoom = 0\n this.maxZoom = Infinity\n\n //trackball parameters\n this.target = new Vector3(0, 0, 0)\n this._currentTarget = new Vector3(0, 0, 0)\n\n this._tbRadius = 1\n\n //FSA\n this._state = STATE.IDLE\n\n this.setCamera(camera)\n\n if (this.scene) {\n this.scene.add(this._gizmos)\n }\n\n this._devPxRatio = window.devicePixelRatio\n\n this.initializeMouseActions()\n\n if (this.domElement) this.connect(this.domElement)\n\n window.addEventListener('resize', this.onWindowResize)\n }\n\n //listeners\n\n private onWindowResize = (): void => {\n const scale = (this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z) / 3\n if (this.camera) {\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n }\n\n const newRadius = this._tbRadius / scale\n // @ts-ignore\n const curve = new EllipseCurve(0, 0, newRadius, newRadius)\n const points = curve.getPoints(this._curvePts)\n const curveGeometry = new BufferGeometry().setFromPoints(points)\n\n for (const gizmo in this._gizmos.children) {\n const child = this._gizmos.children[gizmo] as Mesh\n child.geometry = curveGeometry\n }\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n private onContextMenu = (event: MouseEvent): void => {\n if (!this.enabled) {\n return\n }\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n if (this.mouseActions[i].mouse == 2) {\n //prevent only if button 2 is actually used\n event.preventDefault()\n break\n }\n }\n }\n\n private onPointerCancel = (): void => {\n this._touchStart.splice(0, this._touchStart.length)\n this._touchCurrent.splice(0, this._touchCurrent.length)\n this._input = INPUT.NONE\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n if (event.button == 0 && event.isPrimary) {\n this._downValid = true\n this._downEvents.push(event)\n } else {\n this._downValid = false\n }\n\n if (event.pointerType == 'touch' && this._input != INPUT.CURSOR) {\n this._touchStart.push(event)\n this._touchCurrent.push(event)\n\n switch (this._input) {\n case INPUT.NONE:\n //singleStart\n this._input = INPUT.ONE_FINGER\n this.onSinglePanStart(event, 'ROTATE')\n\n window.addEventListener('pointermove', this.onPointerMove)\n window.addEventListener('pointerup', this.onPointerUp)\n\n break\n\n case INPUT.ONE_FINGER:\n case INPUT.ONE_FINGER_SWITCHED:\n //doubleStart\n this._input = INPUT.TWO_FINGER\n\n this.onRotateStart()\n this.onPinchStart()\n this.onDoublePanStart()\n\n break\n\n case INPUT.TWO_FINGER:\n //multipleStart\n this._input = INPUT.MULT_FINGER\n this.onTriplePanStart()\n break\n }\n } else if (event.pointerType != 'touch' && this._input == INPUT.NONE) {\n let modifier: ModifierKey | null = null\n\n if (event.ctrlKey || event.metaKey) {\n modifier = 'CTRL'\n } else if (event.shiftKey) {\n modifier = 'SHIFT'\n }\n\n this._mouseOp = this.getOpFromAction(event.button, modifier)\n if (this._mouseOp) {\n window.addEventListener('pointermove', this.onPointerMove)\n window.addEventListener('pointerup', this.onPointerUp)\n\n //singleStart\n this._input = INPUT.CURSOR\n this._button = event.button\n this.onSinglePanStart(event, this._mouseOp)\n }\n }\n }\n\n private onPointerMove = (event: PointerEvent): void => {\n if (event.pointerType == 'touch' && this._input != INPUT.CURSOR) {\n switch (this._input) {\n case INPUT.ONE_FINGER:\n //singleMove\n this.updateTouchEvent(event)\n\n this.onSinglePanMove(event, STATE.ROTATE)\n break\n\n case INPUT.ONE_FINGER_SWITCHED:\n const movement = this.calculatePointersDistance(this._touchCurrent[0], event) * this._devPxRatio\n\n if (movement >= this._switchSensibility) {\n //singleMove\n this._input = INPUT.ONE_FINGER\n this.updateTouchEvent(event)\n\n this.onSinglePanStart(event, 'ROTATE')\n break\n }\n\n break\n\n case INPUT.TWO_FINGER:\n //rotate/pan/pinchMove\n this.updateTouchEvent(event)\n\n this.onRotateMove()\n this.onPinchMove()\n this.onDoublePanMove()\n\n break\n\n case INPUT.MULT_FINGER:\n //multMove\n this.updateTouchEvent(event)\n\n this.onTriplePanMove()\n break\n }\n } else if (event.pointerType != 'touch' && this._input == INPUT.CURSOR) {\n let modifier: ModifierKey | null = null\n\n if (event.ctrlKey || event.metaKey) {\n modifier = 'CTRL'\n } else if (event.shiftKey) {\n modifier = 'SHIFT'\n }\n\n const mouseOpState = this.getOpStateFromAction(this._button, modifier)\n\n if (mouseOpState) {\n this.onSinglePanMove(event, mouseOpState)\n }\n }\n\n //checkDistance\n if (this._downValid) {\n const movement =\n this.calculatePointersDistance(this._downEvents[this._downEvents.length - 1], event) * this._devPxRatio\n if (movement > this._movementThreshold) {\n this._downValid = false\n }\n }\n }\n\n private onPointerUp = (event: PointerEvent): void => {\n if (event.pointerType == 'touch' && this._input != INPUT.CURSOR) {\n const nTouch = this._touchCurrent.length\n\n for (let i = 0; i < nTouch; i++) {\n if (this._touchCurrent[i].pointerId == event.pointerId) {\n this._touchCurrent.splice(i, 1)\n this._touchStart.splice(i, 1)\n break\n }\n }\n\n switch (this._input) {\n case INPUT.ONE_FINGER:\n case INPUT.ONE_FINGER_SWITCHED:\n //singleEnd\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n this._input = INPUT.NONE\n this.onSinglePanEnd()\n\n break\n\n case INPUT.TWO_FINGER:\n //doubleEnd\n this.onDoublePanEnd()\n this.onPinchEnd()\n this.onRotateEnd()\n\n //switching to singleStart\n this._input = INPUT.ONE_FINGER_SWITCHED\n\n break\n\n case INPUT.MULT_FINGER:\n if (this._touchCurrent.length == 0) {\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n //multCancel\n this._input = INPUT.NONE\n this.onTriplePanEnd()\n }\n\n break\n }\n } else if (event.pointerType != 'touch' && this._input == INPUT.CURSOR) {\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n this._input = INPUT.NONE\n this.onSinglePanEnd()\n this._button = -1\n }\n\n if (event.isPrimary) {\n if (this._downValid) {\n const downTime = event.timeStamp - this._downEvents[this._downEvents.length - 1].timeStamp\n\n if (downTime <= this._maxDownTime) {\n if (this._nclicks == 0) {\n //first valid click detected\n this._nclicks = 1\n this._clickStart = performance.now()\n } else {\n const clickInterval = event.timeStamp - this._clickStart\n const movement = this.calculatePointersDistance(this._downEvents[1], this._downEvents[0]) * this._devPxRatio\n\n if (clickInterval <= this._maxInterval && movement <= this._posThreshold) {\n //second valid click detected\n //fire double tap and reset values\n this._nclicks = 0\n this._downEvents.splice(0, this._downEvents.length)\n this.onDoubleTap(event)\n } else {\n //new 'first click'\n this._nclicks = 1\n this._downEvents.shift()\n this._clickStart = performance.now()\n }\n }\n } else {\n this._downValid = false\n this._nclicks = 0\n this._downEvents.splice(0, this._downEvents.length)\n }\n } else {\n this._nclicks = 0\n this._downEvents.splice(0, this._downEvents.length)\n }\n }\n }\n\n private onWheel = (event: WheelEvent): void => {\n if (this.enabled && this.enableZoom && this.domElement) {\n let modifier: ModifierKey | null = null\n\n if (event.ctrlKey || event.metaKey) {\n modifier = 'CTRL'\n } else if (event.shiftKey) {\n modifier = 'SHIFT'\n }\n\n const mouseOp = this.getOpFromAction('WHEEL', modifier)\n\n if (mouseOp) {\n event.preventDefault()\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n const notchDeltaY = 125 //distance of one notch of mouse wheel\n let sgn = event.deltaY / notchDeltaY\n\n let size = 1\n\n if (sgn > 0) {\n size = 1 / this.scaleFactor\n } else if (sgn < 0) {\n size = this.scaleFactor\n }\n\n switch (mouseOp) {\n case 'ZOOM':\n this.updateTbState(STATE.SCALE, true)\n\n if (sgn > 0) {\n size = 1 / Math.pow(this.scaleFactor, sgn)\n } else if (sgn < 0) {\n size = Math.pow(this.scaleFactor, -sgn)\n }\n\n if (this.cursorZoom && this.enablePan) {\n let scalePoint\n\n if (this.camera instanceof OrthographicCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, event.clientX, event.clientY, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .multiplyScalar(1 / this.camera.zoom)\n .add(this._gizmos.position)\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, event.clientX, event.clientY, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .add(this._gizmos.position)\n }\n\n if (scalePoint !== undefined) this.applyTransformMatrix(this.applyScale(size, scalePoint))\n } else {\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position))\n }\n\n if (this._grid) {\n this.disposeGrid()\n this.drawGrid()\n }\n\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n\n break\n\n case 'FOV':\n if (this.camera instanceof PerspectiveCamera) {\n this.updateTbState(STATE.FOV, true)\n\n //Vertigo effect\n\n //\t fov / 2\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\tx\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t\t| _ _ _\\\n //\t\t\ty\n\n //check for iOs shift shortcut\n if (event.deltaX != 0) {\n sgn = event.deltaX / notchDeltaY\n\n size = 1\n\n if (sgn > 0) {\n size = 1 / Math.pow(this.scaleFactor, sgn)\n } else if (sgn < 0) {\n size = Math.pow(this.scaleFactor, -sgn)\n }\n }\n\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n const x = this._v3_1.distanceTo(this._gizmos.position)\n let xNew = x / size //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n //check min and max distance\n xNew = MathUtils.clamp(xNew, this.minDistance, this.maxDistance)\n\n const y = x * Math.tan(MathUtils.DEG2RAD * this.camera.fov * 0.5)\n\n //calculate new fov\n let newFov = MathUtils.RAD2DEG * (Math.atan(y / xNew) * 2)\n\n //check min and max fov\n if (newFov > this.maxFov) {\n newFov = this.maxFov\n } else if (newFov < this.minFov) {\n newFov = this.minFov\n }\n\n const newDistance = y / Math.tan(MathUtils.DEG2RAD * (newFov / 2))\n size = x / newDistance\n\n this.setFov(newFov)\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position, false))\n }\n\n if (this._grid) {\n this.disposeGrid()\n this.drawGrid()\n }\n\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n\n break\n }\n }\n }\n }\n\n private onSinglePanStart = (event: PointerEvent, operation: Operation): void => {\n if (this.enabled && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.setCenter(event.clientX, event.clientY)\n\n switch (operation) {\n case 'PAN':\n if (!this.enablePan) return\n\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n if (this.camera) {\n this.updateTbState(STATE.PAN, true)\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n if (this.enableGrid) {\n this.drawGrid()\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n break\n\n case 'ROTATE':\n if (!this.enableRotate) return\n\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n }\n\n if (this.camera) {\n this.updateTbState(STATE.ROTATE, true)\n const rayDir = this.unprojectOnTbSurface(this.camera, _center.x, _center.y, this.domElement, this._tbRadius)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n this.activateGizmos(true)\n if (this.enableAnimations) {\n this._timePrev = this._timeCurrent = performance.now()\n this._angleCurrent = this._anglePrev = 0\n this._cursorPosPrev.copy(this._startCursorPosition)\n this._cursorPosCurr.copy(this._cursorPosPrev)\n this._wCurr = 0\n this._wPrev = this._wCurr\n }\n }\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n break\n\n case 'FOV':\n if (!this.enableZoom) return\n\n if (this.camera instanceof PerspectiveCamera) {\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n this.updateTbState(STATE.FOV, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n }\n break\n\n case 'ZOOM':\n if (!this.enableZoom) return\n\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n this.updateTbState(STATE.SCALE, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n break\n }\n }\n }\n\n private onSinglePanMove = (event: PointerEvent, opState: Symbol): void => {\n if (this.enabled && this.domElement) {\n const restart = opState != this._state\n this.setCenter(event.clientX, event.clientY)\n\n switch (opState) {\n case STATE.PAN:\n if (this.enablePan && this.camera) {\n if (restart) {\n //switch to pan operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n if (this.enableGrid) {\n this.drawGrid()\n }\n\n this.activateGizmos(false)\n } else {\n //continue with pan operation\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n if (rayDir !== undefined) {\n this._currentCursorPosition.copy(rayDir)\n }\n this.applyTransformMatrix(this.pan(this._startCursorPosition, this._currentCursorPosition))\n }\n }\n\n break\n\n case STATE.ROTATE:\n if (this.enableRotate && this.camera) {\n if (restart) {\n //switch to rotate operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n const rayDir = this.unprojectOnTbSurface(\n this.camera,\n _center.x,\n _center.y,\n this.domElement,\n this._tbRadius,\n )\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(true)\n } else {\n //continue with rotate operation\n const rayDir = this.unprojectOnTbSurface(\n this.camera,\n _center.x,\n _center.y,\n this.domElement,\n this._tbRadius,\n )\n if (rayDir !== undefined) {\n this._currentCursorPosition.copy(rayDir)\n }\n\n const distance = this._startCursorPosition.distanceTo(this._currentCursorPosition)\n const angle = this._startCursorPosition.angleTo(this._currentCursorPosition)\n const amount = Math.max(distance / this._tbRadius, angle) //effective rotation angle\n\n this.applyTransformMatrix(\n this.rotate(this.calculateRotationAxis(this._startCursorPosition, this._currentCursorPosition), amount),\n )\n\n if (this.enableAnimations) {\n this._timePrev = this._timeCurrent\n this._timeCurrent = performance.now()\n this._anglePrev = this._angleCurrent\n this._angleCurrent = amount\n this._cursorPosPrev.copy(this._cursorPosCurr)\n this._cursorPosCurr.copy(this._currentCursorPosition)\n this._wPrev = this._wCurr\n this._wCurr = this.calculateAngularSpeed(\n this._anglePrev,\n this._angleCurrent,\n this._timePrev,\n this._timeCurrent,\n )\n }\n }\n }\n\n break\n\n case STATE.SCALE:\n if (this.enableZoom) {\n if (restart) {\n //switch to zoom operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(false)\n } else {\n //continue with zoom operation\n const screenNotches = 8 //how many wheel notches corresponds to a full screen pan\n this._currentCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n\n const movement = this._currentCursorPosition.y - this._startCursorPosition.y\n\n let size = 1\n\n if (movement < 0) {\n size = 1 / Math.pow(this.scaleFactor, -movement * screenNotches)\n } else if (movement > 0) {\n size = Math.pow(this.scaleFactor, movement * screenNotches)\n }\n\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position))\n }\n }\n\n break\n\n case STATE.FOV:\n if (this.enableZoom && this.camera instanceof PerspectiveCamera) {\n if (restart) {\n //switch to fov operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(false)\n } else {\n //continue with fov operation\n const screenNotches = 8 //how many wheel notches corresponds to a full screen pan\n this._currentCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n\n const movement = this._currentCursorPosition.y - this._startCursorPosition.y\n\n let size = 1\n\n if (movement < 0) {\n size = 1 / Math.pow(this.scaleFactor, -movement * screenNotches)\n } else if (movement > 0) {\n size = Math.pow(this.scaleFactor, movement * screenNotches)\n }\n\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n const x = this._v3_1.distanceTo(this._gizmos.position)\n let xNew = x / size //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n //check min and max distance\n xNew = MathUtils.clamp(xNew, this.minDistance, this.maxDistance)\n\n const y = x * Math.tan(MathUtils.DEG2RAD * this._fovState * 0.5)\n\n //calculate new fov\n let newFov = MathUtils.RAD2DEG * (Math.atan(y / xNew) * 2)\n\n //check min and max fov\n newFov = MathUtils.clamp(newFov, this.minFov, this.maxFov)\n\n const newDistance = y / Math.tan(MathUtils.DEG2RAD * (newFov / 2))\n size = x / newDistance\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n\n this.setFov(newFov)\n this.applyTransformMatrix(this.applyScale(size, this._v3_2, false))\n\n //adjusting distance\n const direction = this._gizmos.position\n .clone()\n .sub(this.camera.position)\n .normalize()\n .multiplyScalar(newDistance / x)\n this._m4_1.makeTranslation(direction.x, direction.y, direction.z)\n }\n }\n\n break\n }\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onSinglePanEnd = (): void => {\n if (this._state == STATE.ROTATE) {\n if (!this.enableRotate) {\n return\n }\n\n if (this.enableAnimations) {\n //perform rotation animation\n const deltaTime = performance.now() - this._timeCurrent\n if (deltaTime < 120) {\n const w = Math.abs((this._wPrev + this._wCurr) / 2)\n\n const self = this\n this._animationId = window.requestAnimationFrame(function (t) {\n self.updateTbState(STATE.ANIMATION_ROTATE, true)\n const rotationAxis = self.calculateRotationAxis(self._cursorPosPrev, self._cursorPosCurr)\n\n self.onRotationAnim(t, rotationAxis, Math.min(w, self.wMax))\n })\n } else {\n //cursor has been standing still for over 120 ms since last movement\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n } else {\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n } else if (this._state == STATE.PAN || this._state == STATE.IDLE) {\n this.updateTbState(STATE.IDLE, false)\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onDoubleTap = (event: PointerEvent): void => {\n if (this.enabled && this.enablePan && this.scene && this.camera && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.setCenter(event.clientX, event.clientY)\n const hitP = this.unprojectOnObj(this.getCursorNDC(_center.x, _center.y, this.domElement), this.camera)\n\n if (hitP && this.enableAnimations) {\n const self = this\n if (this._animationId != -1) {\n window.cancelAnimationFrame(this._animationId)\n }\n\n this._timeStart = -1\n this._animationId = window.requestAnimationFrame(function (t) {\n self.updateTbState(STATE.ANIMATION_FOCUS, true)\n self.onFocusAnim(t, hitP, self._cameraMatrixState, self._gizmoMatrixState)\n })\n } else if (hitP && !this.enableAnimations) {\n this.updateTbState(STATE.FOCUS, true)\n this.focus(hitP, this.scaleFactor)\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onDoublePanStart = (): void => {\n if (this.enabled && this.enablePan && this.camera && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(STATE.PAN, true)\n\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement, true)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n this._currentCursorPosition.copy(this._startCursorPosition)\n\n this.activateGizmos(false)\n }\n }\n\n private onDoublePanMove = (): void => {\n if (this.enabled && this.enablePan && this.camera && this.domElement) {\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n\n if (this._state != STATE.PAN) {\n this.updateTbState(STATE.PAN, true)\n this._startCursorPosition.copy(this._currentCursorPosition)\n }\n\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement, true)\n if (rayDir !== undefined) this._currentCursorPosition.copy(rayDir)\n this.applyTransformMatrix(this.pan(this._startCursorPosition, this._currentCursorPosition, true))\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onDoublePanEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onRotateStart = (): void => {\n if (this.enabled && this.enableRotate) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(STATE.ZROTATE, true)\n\n //this._startFingerRotation = event.rotation;\n\n this._startFingerRotation =\n this.getAngle(this._touchCurrent[1], this._touchCurrent[0]) +\n this.getAngle(this._touchStart[1], this._touchStart[0])\n this._currentFingerRotation = this._startFingerRotation\n\n this.camera?.getWorldDirection(this._rotationAxis) //rotation axis\n\n if (!this.enablePan && !this.enableZoom) {\n this.activateGizmos(true)\n }\n }\n }\n\n private onRotateMove = (): void => {\n if (this.enabled && this.enableRotate && this.camera && this.domElement) {\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n let rotationPoint\n\n if (this._state != STATE.ZROTATE) {\n this.updateTbState(STATE.ZROTATE, true)\n this._startFingerRotation = this._currentFingerRotation\n }\n\n //this._currentFingerRotation = event.rotation;\n this._currentFingerRotation =\n this.getAngle(this._touchCurrent[1], this._touchCurrent[0]) +\n this.getAngle(this._touchStart[1], this._touchStart[0])\n\n if (!this.enablePan) {\n rotationPoint = new Vector3().setFromMatrixPosition(this._gizmoMatrixState)\n } else if (this.camera) {\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n rotationPoint = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .multiplyScalar(1 / this.camera.zoom)\n .add(this._v3_2)\n }\n\n const amount = MathUtils.DEG2RAD * (this._startFingerRotation - this._currentFingerRotation)\n\n if (rotationPoint !== undefined) {\n this.applyTransformMatrix(this.zRotate(rotationPoint, amount))\n }\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onRotateEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onPinchStart = (): void => {\n if (this.enabled && this.enableZoom) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n this.updateTbState(STATE.SCALE, true)\n\n this._startFingerDistance = this.calculatePointersDistance(this._touchCurrent[0], this._touchCurrent[1])\n this._currentFingerDistance = this._startFingerDistance\n\n this.activateGizmos(false)\n }\n }\n\n private onPinchMove = (): void => {\n if (this.enabled && this.enableZoom && this.domElement) {\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n const minDistance = 12 //minimum distance between fingers (in css pixels)\n\n if (this._state != STATE.SCALE) {\n this._startFingerDistance = this._currentFingerDistance\n this.updateTbState(STATE.SCALE, true)\n }\n\n this._currentFingerDistance = Math.max(\n this.calculatePointersDistance(this._touchCurrent[0], this._touchCurrent[1]),\n minDistance * this._devPxRatio,\n )\n const amount = this._currentFingerDistance / this._startFingerDistance\n\n let scalePoint\n\n if (!this.enablePan) {\n scalePoint = this._gizmos.position\n } else {\n if (this.camera instanceof OrthographicCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .multiplyScalar(1 / this.camera.zoom)\n .add(this._gizmos.position)\n } else if (this.camera instanceof PerspectiveCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .add(this._gizmos.position)\n }\n }\n\n if (scalePoint !== undefined) {\n this.applyTransformMatrix(this.applyScale(amount, scalePoint))\n }\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onPinchEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onTriplePanStart = (): void => {\n if (this.enabled && this.enableZoom && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(STATE.SCALE, true)\n\n //const center = event.center;\n let clientX = 0\n let clientY = 0\n const nFingers = this._touchCurrent.length\n\n for (let i = 0; i < nFingers; i++) {\n clientX += this._touchCurrent[i].clientX\n clientY += this._touchCurrent[i].clientY\n }\n\n this.setCenter(clientX / nFingers, clientY / nFingers)\n\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n }\n }\n\n private onTriplePanMove = (): void => {\n if (this.enabled && this.enableZoom && this.camera && this.domElement) {\n //\t fov / 2\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\tx\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t\t| _ _ _\\\n //\t\t\ty\n\n //const center = event.center;\n let clientX = 0\n let clientY = 0\n const nFingers = this._touchCurrent.length\n\n for (let i = 0; i < nFingers; i++) {\n clientX += this._touchCurrent[i].clientX\n clientY += this._touchCurrent[i].clientY\n }\n\n this.setCenter(clientX / nFingers, clientY / nFingers)\n\n const screenNotches = 8 //how many wheel notches corresponds to a full screen pan\n this._currentCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n\n const movement = this._currentCursorPosition.y - this._startCursorPosition.y\n\n let size = 1\n\n if (movement < 0) {\n size = 1 / Math.pow(this.scaleFactor, -movement * screenNotches)\n } else if (movement > 0) {\n size = Math.pow(this.scaleFactor, movement * screenNotches)\n }\n\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n const x = this._v3_1.distanceTo(this._gizmos.position)\n let xNew = x / size //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n //check min and max distance\n xNew = MathUtils.clamp(xNew, this.minDistance, this.maxDistance)\n\n const y = x * Math.tan(MathUtils.DEG2RAD * this._fovState * 0.5)\n\n //calculate new fov\n let newFov = MathUtils.RAD2DEG * (Math.atan(y / xNew) * 2)\n\n //check min and max fov\n newFov = MathUtils.clamp(newFov, this.minFov, this.maxFov)\n\n const newDistance = y / Math.tan(MathUtils.DEG2RAD * (newFov / 2))\n size = x / newDistance\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n\n this.setFov(newFov)\n this.applyTransformMatrix(this.applyScale(size, this._v3_2, false))\n\n //adjusting distance\n const direction = this._gizmos.position\n .clone()\n .sub(this.camera.position)\n .normalize()\n .multiplyScalar(newDistance / x)\n this._m4_1.makeTranslation(direction.x, direction.y, direction.z)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onTriplePanEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n //this.dispatchEvent( _changeEvent );\n }\n\n /**\n * Set _center's x/y coordinates\n * @param {Number} clientX\n * @param {Number} clientY\n */\n private setCenter = (clientX: number, clientY: number): void => {\n _center.x = clientX\n _center.y = clientY\n }\n\n /**\n * Set default mouse actions\n */\n private initializeMouseActions = (): void => {\n this.setMouseAction('PAN', 0, 'CTRL')\n this.setMouseAction('PAN', 2)\n\n this.setMouseAction('ROTATE', 0)\n\n this.setMouseAction('ZOOM', 'WHEEL')\n this.setMouseAction('ZOOM', 1)\n\n this.setMouseAction('FOV', 'WHEEL', 'SHIFT')\n this.setMouseAction('FOV', 1, 'SHIFT')\n }\n\n /**\n * Set a new mouse action by specifying the operation to be performed and a mouse/key combination. In case of conflict, replaces the existing one\n * @param {String} operation The operation to be performed ('PAN', 'ROTATE', 'ZOOM', 'FOV)\n * @param {*} mouse A mouse button (0, 1, 2) or 'WHEEL' for wheel notches\n * @param {*} key The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed\n * @returns {Boolean} True if the mouse action has been successfully added, false otherwise\n */\n private setMouseAction = (operation: Operation, mouse: MouseButtonType, key: ModifierKey | null = null): boolean => {\n const operationInput = ['PAN', 'ROTATE', 'ZOOM', 'FOV']\n const mouseInput = [0, 1, 2, 'WHEEL']\n const keyInput = ['CTRL', 'SHIFT', null]\n let state\n\n if (!operationInput.includes(operation) || !mouseInput.includes(mouse) || !keyInput.includes(key)) {\n //invalid parameters\n return false\n }\n\n if (mouse == 'WHEEL') {\n if (operation != 'ZOOM' && operation != 'FOV') {\n //cannot associate 2D operation to 1D input\n return false\n }\n }\n\n switch (operation) {\n case 'PAN':\n state = STATE.PAN\n break\n\n case 'ROTATE':\n state = STATE.ROTATE\n break\n\n case 'ZOOM':\n state = STATE.SCALE\n break\n\n case 'FOV':\n state = STATE.FOV\n break\n }\n\n const action = {\n operation: operation,\n mouse: mouse,\n key: key,\n state: state,\n }\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n if (this.mouseActions[i].mouse == action.mouse && this.mouseActions[i].key == action.key) {\n this.mouseActions.splice(i, 1, action)\n return true\n }\n }\n\n this.mouseActions.push(action)\n return true\n }\n\n /**\n * Return the operation associated to a mouse/keyboard combination\n * @param {*} mouse A mouse button (0, 1, 2) or 'WHEEL' for wheel notches\n * @param {*} key The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed\n * @returns The operation if it has been found, null otherwise\n */\n private getOpFromAction = (mouse: MouseButtonType, key: ModifierKey | null): Operation | null => {\n let action\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == key) {\n return action.operation\n }\n }\n\n if (key) {\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == null) {\n return action.operation\n }\n }\n }\n\n return null\n }\n\n /**\n * Get the operation associated to mouse and key combination and returns the corresponding FSA state\n * @param {Number} mouse Mouse button\n * @param {String} key Keyboard modifier\n * @returns The FSA state obtained from the operation associated to mouse/keyboard combination\n */\n private getOpStateFromAction = (mouse: MouseButtonType, key: ModifierKey | null): Symbol | null => {\n let action\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == key) {\n return action.state\n }\n }\n\n if (key) {\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == null) {\n return action.state\n }\n }\n }\n\n return null\n }\n\n /**\n * Calculate the angle between two pointers\n * @param {PointerEvent} p1\n * @param {PointerEvent} p2\n * @returns {Number} The angle between two pointers in degrees\n */\n private getAngle = (p1: PointerEvent, p2: PointerEvent): number => {\n return (Math.atan2(p2.clientY - p1.clientY, p2.clientX - p1.clientX) * 180) / Math.PI\n }\n\n /**\n * Update a PointerEvent inside current pointerevents array\n * @param {PointerEvent} event\n */\n private updateTouchEvent = (event: PointerEvent): void => {\n for (let i = 0; i < this._touchCurrent.length; i++) {\n if (this._touchCurrent[i].pointerId == event.pointerId) {\n this._touchCurrent.splice(i, 1, event)\n break\n }\n }\n }\n\n /**\n * Apply a transformation matrix, to the camera and gizmos\n * @param {Object} transformation Object containing matrices to apply to camera and gizmos\n */\n private applyTransformMatrix(transformation: Transformation | undefined): void {\n if (transformation?.camera && this.camera) {\n this._m4_1.copy(this._cameraMatrixState).premultiply(transformation.camera)\n this._m4_1.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n this.camera.updateMatrix()\n\n //update camera up vector\n if (this._state == STATE.ROTATE || this._state == STATE.ZROTATE || this._state == STATE.ANIMATION_ROTATE) {\n this.camera.up.copy(this._upState).applyQuaternion(this.camera.quaternion)\n }\n }\n\n if (transformation?.gizmos) {\n this._m4_1.copy(this._gizmoMatrixState).premultiply(transformation.gizmos)\n this._m4_1.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n this._gizmos.updateMatrix()\n }\n\n if (\n (this._state == STATE.SCALE || this._state == STATE.FOCUS || this._state == STATE.ANIMATION_FOCUS) &&\n this.camera\n ) {\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n\n if (this.adjustNearFar) {\n const cameraDistance = this.camera.position.distanceTo(this._gizmos.position)\n\n const bb = new Box3()\n bb.setFromObject(this._gizmos)\n const sphere = new Sphere()\n bb.getBoundingSphere(sphere)\n\n const adjustedNearPosition = Math.max(this._nearPos0, sphere.radius + sphere.center.length())\n const regularNearPosition = cameraDistance - this._initialNear\n\n const minNearPos = Math.min(adjustedNearPosition, regularNearPosition)\n this.camera.near = cameraDistance - minNearPos\n\n const adjustedFarPosition = Math.min(this._farPos0, -sphere.radius + sphere.center.length())\n const regularFarPosition = cameraDistance - this._initialFar\n\n const minFarPos = Math.min(adjustedFarPosition, regularFarPosition)\n this.camera.far = cameraDistance - minFarPos\n\n this.camera.updateProjectionMatrix()\n } else {\n let update = false\n\n if (this.camera.near != this._initialNear) {\n this.camera.near = this._initialNear\n update = true\n }\n\n if (this.camera.far != this._initialFar) {\n this.camera.far = this._initialFar\n update = true\n }\n\n if (update) {\n this.camera.updateProjectionMatrix()\n }\n }\n }\n }\n\n /**\n * Calculate the angular speed\n * @param {Number} p0 Position at t0\n * @param {Number} p1 Position at t1\n * @param {Number} t0 Initial time in milliseconds\n * @param {Number} t1 Ending time in milliseconds\n */\n private calculateAngularSpeed = (p0: number, p1: number, t0: number, t1: number): number => {\n const s = p1 - p0\n const t = (t1 - t0) / 1000\n if (t == 0) {\n return 0\n }\n\n return s / t\n }\n\n /**\n * Calculate the distance between two pointers\n * @param {PointerEvent} p0 The first pointer\n * @param {PointerEvent} p1 The second pointer\n * @returns {number} The distance between the two pointers\n */\n private calculatePointersDistance = (p0: PointerEvent, p1: PointerEvent): number => {\n return Math.sqrt(Math.pow(p1.clientX - p0.clientX, 2) + Math.pow(p1.clientY - p0.clientY, 2))\n }\n\n /**\n * Calculate the rotation axis as the vector perpendicular between two vectors\n * @param {Vector3} vec1 The first vector\n * @param {Vector3} vec2 The second vector\n * @returns {Vector3} The normalized rotation axis\n */\n private calculateRotationAxis = (vec1: Vector3, vec2: Vector3): Vector3 => {\n this._rotationMatrix.extractRotation(this._cameraMatrixState)\n this._quat.setFromRotationMatrix(this._rotationMatrix)\n\n this._rotationAxis.crossVectors(vec1, vec2).applyQuaternion(this._quat)\n return this._rotationAxis.normalize().clone()\n }\n\n /**\n * Calculate the trackball radius so that gizmo's diamater will be 2/3 of the minimum side of the camera frustum\n * @param {Camera} camera\n * @returns {Number} The trackball radius\n */\n private calculateTbRadius = (camera: Camera): number | undefined => {\n const factor = 0.67\n const distance = camera.position.distanceTo(this._gizmos.position)\n\n if (camera instanceof PerspectiveCamera) {\n const halfFovV = MathUtils.DEG2RAD * camera.fov * 0.5 //vertical fov/2 in radians\n const halfFovH = Math.atan(camera.aspect * Math.tan(halfFovV)) //horizontal fov/2 in radians\n return Math.tan(Math.min(halfFovV, halfFovH)) * distance * factor\n } else if (camera instanceof OrthographicCamera) {\n return Math.min(camera.top, camera.right) * factor\n }\n }\n\n /**\n * Focus operation consist of positioning the point of interest in front of the camera and a slightly zoom in\n * @param {Vector3} point The point of interest\n * @param {Number} size Scale factor\n * @param {Number} amount Amount of operation to be completed (used for focus animations, default is complete full operation)\n */\n private focus = (point: Vector3, size: number, amount = 1): void => {\n if (this.camera) {\n const focusPoint = point.clone()\n\n //move center of camera (along with gizmos) towards point of interest\n focusPoint.sub(this._gizmos.position).multiplyScalar(amount)\n this._translationMatrix.makeTranslation(focusPoint.x, focusPoint.y, focusPoint.z)\n\n const gizmoStateTemp = this._gizmoMatrixState.clone()\n this._gizmoMatrixState.premultiply(this._translationMatrix)\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n const cameraStateTemp = this._cameraMatrixState.clone()\n this._cameraMatrixState.premultiply(this._translationMatrix)\n this._cameraMatrixState.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n\n //apply zoom\n if (this.enableZoom) {\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position))\n }\n\n this._gizmoMatrixState.copy(gizmoStateTemp)\n this._cameraMatrixState.copy(cameraStateTemp)\n }\n }\n\n /**\n * Draw a grid and add it to the scene\n */\n private drawGrid = (): void => {\n if (this.scene) {\n const color = 0x888888\n const multiplier = 3\n let size, divisions, maxLength, tick\n\n if (this.camera instanceof OrthographicCamera) {\n const width = this.camera.right - this.camera.left\n const height = this.camera.bottom - this.camera.top\n\n maxLength = Math.max(width, height)\n tick = maxLength / 20\n\n size = (maxLength / this.camera.zoom) * multiplier\n divisions = (size / tick) * this.camera.zoom\n } else if (this.camera instanceof PerspectiveCamera) {\n const distance = this.camera.position.distanceTo(this._gizmos.position)\n const halfFovV = MathUtils.DEG2RAD * this.camera.fov * 0.5\n const halfFovH = Math.atan(this.camera.aspect * Math.tan(halfFovV))\n\n maxLength = Math.tan(Math.max(halfFovV, halfFovH)) * distance * 2\n tick = maxLength / 20\n\n size = maxLength * multiplier\n divisions = size / tick\n }\n\n if (this._grid == null && this.camera) {\n this._grid = new GridHelper(size, divisions, color, color)\n this._grid.position.copy(this._gizmos.position)\n this._gridPosition.copy(this._grid.position)\n this._grid.quaternion.copy(this.camera.quaternion)\n this._grid.rotateX(Math.PI * 0.5)\n\n this.scene.add(this._grid)\n }\n }\n }\n\n public connect = (domElement: HTMLElement): void => {\n // https://github.com/mrdoob/three.js/issues/20575\n\n if ((domElement as any) === document) {\n console.error(\n 'THREE.ArcballControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.',\n )\n }\n this.domElement = domElement\n // disables touch scroll\n // touch-action needs to be defined for pointer events to work on mobile\n // https://stackoverflow.com/a/48254578\n this.domElement.style.touchAction = 'none'\n this.domElement.addEventListener('contextmenu', this.onContextMenu)\n this.domElement.addEventListener('pointerdown', this.onPointerDown)\n this.domElement.addEventListener('pointercancel', this.onPointerCancel)\n this.domElement.addEventListener('wheel', this.onWheel)\n }\n\n /**\n * Remove all listeners, stop animations and clean scene\n */\n public dispose = (): void => {\n if (this._animationId != -1) {\n window.cancelAnimationFrame(this._animationId)\n }\n\n this.domElement?.removeEventListener('pointerdown', this.onPointerDown)\n this.domElement?.removeEventListener('pointercancel', this.onPointerCancel)\n this.domElement?.removeEventListener('wheel', this.onWheel)\n this.domElement?.removeEventListener('contextmenu', this.onContextMenu)\n\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n window.removeEventListener('resize', this.onWindowResize)\n\n this.scene?.remove(this._gizmos)\n this.disposeGrid()\n }\n\n /**\n * remove the grid from the scene\n */\n private disposeGrid = (): void => {\n if (this._grid && this.scene) {\n this.scene.remove(this._grid)\n this._grid = null\n }\n }\n\n /**\n * Compute the easing out cubic function for ease out effect in animation\n * @param {Number} t The absolute progress of the animation in the bound of 0 (beginning of the) and 1 (ending of animation)\n * @returns {Number} Result of easing out cubic at time t\n */\n private easeOutCubic = (t: number): number => {\n return 1 - Math.pow(1 - t, 3)\n }\n\n /**\n * Make rotation gizmos more or less visible\n * @param {Boolean} isActive If true, make gizmos more visible\n */\n private activateGizmos = (isActive: boolean): void => {\n for (const gizmo of this._gizmos.children) {\n ;(gizmo as Mesh<BufferGeometry, Material>).material.setValues({ opacity: isActive ? 1 : 0.6 })\n }\n }\n\n /**\n * Calculate the cursor position in NDC\n * @param {number} x Cursor horizontal coordinate within the canvas\n * @param {number} y Cursor vertical coordinate within the canvas\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @returns {Vector2} Cursor normalized position inside the canvas\n */\n private getCursorNDC = (cursorX: number, cursorY: number, canvas: HTMLElement): Vector2 => {\n const canvasRect = canvas.getBoundingClientRect()\n this._v2_1.setX(((cursorX - canvasRect.left) / canvasRect.width) * 2 - 1)\n this._v2_1.setY(((canvasRect.bottom - cursorY) / canvasRect.height) * 2 - 1)\n return this._v2_1.clone()\n }\n\n /**\n * Calculate the cursor position inside the canvas x/y coordinates with the origin being in the center of the canvas\n * @param {Number} x Cursor horizontal coordinate within the canvas\n * @param {Number} y Cursor vertical coordinate within the canvas\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @returns {Vector2} Cursor position inside the canvas\n */\n private getCursorPosition = (cursorX: number, cursorY: number, canvas: HTMLElement): Vector2 => {\n this._v2_1.copy(this.getCursorNDC(cursorX, cursorY, canvas))\n if (this.camera instanceof OrthographicCamera) {\n this._v2_1.x *= (this.camera.right - this.camera.left) * 0.5\n this._v2_1.y *= (this.camera.top - this.camera.bottom) * 0.5\n }\n return this._v2_1.clone()\n }\n\n /**\n * Set the camera to be controlled\n * @param {Camera} camera The virtual camera to be controlled\n */\n private setCamera = (camera: Camera | null): void => {\n if (camera) {\n camera.lookAt(this.target)\n camera.updateMatrix()\n\n //setting state\n if (camera instanceof PerspectiveCamera) {\n this._fov0 = camera.fov\n this._fovState = camera.fov\n }\n\n this._cameraMatrixState0.copy(camera.matrix)\n this._cameraMatrixState.copy(this._cameraMatrixState0)\n this._cameraProjectionState.copy(camera.projectionMatrix)\n this._zoom0 = camera.zoom\n this._zoomState = this._zoom0\n\n this._initialNear = camera.near\n this._nearPos0 = camera.position.distanceTo(this.target) - camera.near\n this._nearPos = this._initialNear\n\n this._initialFar = camera.far\n this._farPos0 = camera.position.distanceTo(this.target) - camera.far\n this._farPos = this._initialFar\n\n this._up0.copy(camera.up)\n this._upState.copy(camera.up)\n\n this.camera = camera\n\n this.camera.updateProjectionMatrix()\n\n //making gizmos\n const tbRadius = this.calculateTbRadius(camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this.target, this._tbRadius)\n }\n }\n\n /**\n * Set gizmos visibility\n * @param {Boolean} value Value of gizmos visibility\n */\n public setGizmosVisible(value: boolean): void {\n this._gizmos.visible = value\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n /**\n * Creates the rotation gizmos matching trackball center and radius\n * @param {Vector3} tbCenter The trackball center\n * @param {number} tbRadius The trackball radius\n */\n private makeGizmos = (tbCenter: Vector3, tbRadius: number): void => {\n // @ts-ignore\n const curve = new EllipseCurve(0, 0, tbRadius, tbRadius)\n const points = curve.getPoints(this._curvePts)\n\n //geometry\n const curveGeometry = new BufferGeometry().setFromPoints(points)\n\n //material\n const curveMaterialX = new LineBasicMaterial({ color: 0xff8080, fog: false, transparent: true, opacity: 0.6 })\n const curveMaterialY = new LineBasicMaterial({ color: 0x80ff80, fog: false, transparent: true, opacity: 0.6 })\n const curveMaterialZ = new LineBasicMaterial({ color: 0x8080ff, fog: false, transparent: true, opacity: 0.6 })\n\n //line\n const gizmoX = new Line(curveGeometry, curveMaterialX)\n const gizmoY = new Line(curveGeometry, curveMaterialY)\n const gizmoZ = new Line(curveGeometry, curveMaterialZ)\n\n const rotation = Math.PI * 0.5\n gizmoX.rotation.x = rotation\n gizmoY.rotation.y = rotation\n\n //setting state\n this._gizmoMatrixState0.identity().setPosition(tbCenter)\n this._gizmoMatrixState.copy(this._gizmoMatrixState0)\n\n if (this.camera && this.camera.zoom != 1) {\n //adapt gizmos size to camera zoom\n const size = 1 / this.camera.zoom\n this._scaleMatrix.makeScale(size, size, size)\n this._translationMatrix.makeTranslation(-tbCenter.x, -tbCenter.y, -tbCenter.z)\n\n this._gizmoMatrixState.premultiply(this._translationMatrix).premultiply(this._scaleMatrix)\n this._translationMatrix.makeTranslation(tbCenter.x, tbCenter.y, tbCenter.z)\n this._gizmoMatrixState.premultiply(this._translationMatrix)\n }\n\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n this._gizmos.clear()\n\n this._gizmos.add(gizmoX)\n this._gizmos.add(gizmoY)\n this._gizmos.add(gizmoZ)\n }\n\n /**\n * Perform animation for focus operation\n * @param {Number} time Instant in which this function is called as performance.now()\n * @param {Vector3} point Point of interest for focus operation\n * @param {Matrix4} cameraMatrix Camera matrix\n * @param {Matrix4} gizmoMatrix Gizmos matrix\n */\n private onFocusAnim = (time: number, point: Vector3, cameraMatrix: Matrix4, gizmoMatrix: Matrix4): void => {\n if (this._timeStart == -1) {\n //animation start\n this._timeStart = time\n }\n\n if (this._state == STATE.ANIMATION_FOCUS) {\n const deltaTime = time - this._timeStart\n const animTime = deltaTime / this.focusAnimationTime\n\n this._gizmoMatrixState.copy(gizmoMatrix)\n\n if (animTime >= 1) {\n //animation end\n\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n this.focus(point, this.scaleFactor)\n\n this._timeStart = -1\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n } else {\n const amount = this.easeOutCubic(animTime)\n const size = 1 - amount + this.scaleFactor * amount\n\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n this.focus(point, size, amount)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n const self = this\n this._animationId = window.requestAnimationFrame(function (t) {\n self.onFocusAnim(t, point, cameraMatrix, gizmoMatrix.clone())\n })\n }\n } else {\n //interrupt animation\n\n this._animationId = -1\n this._timeStart = -1\n }\n }\n\n /**\n * Perform animation for rotation operation\n * @param {Number} time Instant in which this function is called as performance.now()\n * @param {Vector3} rotationAxis Rotation axis\n * @param {number} w0 Initial angular velocity\n */\n private onRotationAnim = (time: number, rotationAxis: Vector3, w0: number): void => {\n if (this._timeStart == -1) {\n //animation start\n this._anglePrev = 0\n this._angleCurrent = 0\n this._timeStart = time\n }\n\n if (this._state == STATE.ANIMATION_ROTATE) {\n //w = w0 + alpha * t\n const deltaTime = (time - this._timeStart) / 1000\n const w = w0 + -this.dampingFactor * deltaTime\n\n if (w > 0) {\n //tetha = 0.5 * alpha * t^2 + w0 * t + tetha0\n this._angleCurrent = 0.5 * -this.dampingFactor * Math.pow(deltaTime, 2) + w0 * deltaTime + 0\n this.applyTransformMatrix(this.rotate(rotationAxis, this._angleCurrent))\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n const self = this\n this._animationId = window.requestAnimationFrame(function (t) {\n self.onRotationAnim(t, rotationAxis, w0)\n })\n } else {\n this._animationId = -1\n this._timeStart = -1\n\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n } else {\n //interrupt animation\n\n this._animationId = -1\n this._timeStart = -1\n\n if (this._state != STATE.ROTATE) {\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n }\n\n /**\n * Perform pan operation moving camera between two points\n * @param {Vector3} p0 Initial point\n * @param {Vector3} p1 Ending point\n * @param {Boolean} adjust If movement should be adjusted considering camera distance (Perspective only)\n */\n private pan = (p0: Vector3, p1: Vector3, adjust = false): Transformation => {\n if (this.camera) {\n const movement = p0.clone().sub(p1)\n\n if (this.camera instanceof OrthographicCamera) {\n //adjust movement amount\n movement.multiplyScalar(1 / this.camera.zoom)\n }\n\n if (this.camera instanceof PerspectiveCamera && adjust) {\n //adjust movement amount\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState0) //camera's initial position\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState0) //gizmo's initial position\n const distanceFactor =\n this._v3_1.distanceTo(this._v3_2) / this.camera.position.distanceTo(this._gizmos.position)\n movement.multiplyScalar(1 / distanceFactor)\n }\n\n this._v3_1.set(movement.x, movement.y, 0).applyQuaternion(this.camera.quaternion)\n\n this._m4_1.makeTranslation(this._v3_1.x, this._v3_1.y, this._v3_1.z)\n\n this.setTransformationMatrices(this._m4_1, this._m4_1)\n }\n return _transformation\n }\n\n /**\n * Reset trackball\n */\n public reset = (): void => {\n if (this.camera) {\n this.camera.zoom = this._zoom0\n\n if (this.camera instanceof PerspectiveCamera) {\n this.camera.fov = this._fov0\n }\n\n this.camera.near = this._nearPos\n this.camera.far = this._farPos\n this._cameraMatrixState.copy(this._cameraMatrixState0)\n this._cameraMatrixState.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n this.camera.up.copy(this._up0)\n\n this.camera.updateMatrix()\n this.camera.updateProjectionMatrix()\n\n this._gizmoMatrixState.copy(this._gizmoMatrixState0)\n this._gizmoMatrixState0.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n this._gizmos.updateMatrix()\n\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this._gizmos.position, this._tbRadius)\n\n this.camera.lookAt(this._gizmos.position)\n\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n /**\n * Rotate the camera around an axis passing by trackball's center\n * @param {Vector3} axis Rotation axis\n * @param {number} angle Angle in radians\n * @returns {Object} Object with 'camera' field containing transformation matrix resulting from the operation to be applied to the camera\n */\n private rotate = (axis: Vector3, angle: number): Transformation => {\n const point = this._gizmos.position //rotation center\n this._translationMatrix.makeTranslation(-point.x, -point.y, -point.z)\n this._rotationMatrix.makeRotationAxis(axis, -angle)\n\n //rotate camera\n this._m4_1.makeTranslation(point.x, point.y, point.z)\n this._m4_1.multiply(this._rotationMatrix)\n this._m4_1.multiply(this._translationMatrix)\n\n this.setTransformationMatrices(this._m4_1)\n\n return _transformation\n }\n\n public copyState = (): void => {\n if (this.camera) {\n const state = JSON.stringify(\n this.camera instanceof OrthographicCamera\n ? {\n arcballState: {\n cameraFar: this.camera.far,\n cameraMatrix: this.camera.matrix,\n cameraNear: this.camera.near,\n cameraUp: this.camera.up,\n cameraZoom: this.camera.zoom,\n gizmoMatrix: this._gizmos.matrix,\n },\n }\n : {\n arcballState: {\n cameraFar: this.camera.far,\n cameraFov: this.camera.fov,\n cameraMatrix: this.camera.matrix,\n cameraNear: this.camera.near,\n cameraUp: this.camera.up,\n cameraZoom: this.camera.zoom,\n gizmoMatrix: this._gizmos.matrix,\n },\n },\n )\n\n navigator.clipboard.writeText(state)\n }\n }\n\n public pasteState = (): void => {\n const self = this\n navigator.clipboard.readText().then(function resolved(value) {\n self.setStateFromJSON(value)\n })\n }\n\n /**\n * Save the current state of the control. This can later be recovered with .reset\n */\n public saveState = (): void => {\n if (!this.camera) return\n\n this._cameraMatrixState0.copy(this.camera.matrix)\n this._gizmoMatrixState0.copy(this._gizmos.matrix)\n this._nearPos = this.camera.near\n this._farPos = this.camera.far\n this._zoom0 = this.camera.zoom\n this._up0.copy(this.camera.up)\n\n if (this.camera instanceof PerspectiveCamera) {\n this._fov0 = this.camera.fov\n }\n }\n\n /**\n * Perform uniform scale operation around a given point\n * @param {Number} size Scale factor\n * @param {Vector3} point Point around which scale\n * @param {Boolean} scaleGizmos If gizmos should be scaled (Perspective only)\n * @returns {Object} Object with 'camera' and 'gizmo' fields containing transformation matrices resulting from the operation to be applied to the camera and gizmos\n */\n private applyScale = (size: number, point: Vector3, scaleGizmos = true): Transformation | undefined => {\n if (!this.camera) return\n\n const scalePoint = point.clone()\n let sizeInverse = 1 / size\n\n if (this.camera instanceof OrthographicCamera) {\n //camera zoom\n this.camera.zoom = this._zoomState\n this.camera.zoom *= size\n\n //check min and max zoom\n if (this.camera.zoom > this.maxZoom) {\n this.camera.zoom = this.maxZoom\n sizeInverse = this._zoomState / this.maxZoom\n } else if (this.camera.zoom < this.minZoom) {\n this.camera.zoom = this.minZoom\n sizeInverse = this._zoomState / this.minZoom\n }\n\n this.camera.updateProjectionMatrix()\n\n this._v3_1.setFromMatrixPosition(this._gizmoMatrixState) //gizmos position\n\n //scale gizmos so they appear in the same spot having the same dimension\n this._scaleMatrix.makeScale(sizeInverse, sizeInverse, sizeInverse)\n this._translationMatrix.makeTranslation(-this._v3_1.x, -this._v3_1.y, -this._v3_1.z)\n\n this._m4_2.makeTranslation(this._v3_1.x, this._v3_1.y, this._v3_1.z).multiply(this._scaleMatrix)\n this._m4_2.multiply(this._translationMatrix)\n\n //move camera and gizmos to obtain pinch effect\n scalePoint.sub(this._v3_1)\n\n const amount = scalePoint.clone().multiplyScalar(sizeInverse)\n scalePoint.sub(amount)\n\n this._m4_1.makeTranslation(scalePoint.x, scalePoint.y, scalePoint.z)\n this._m4_2.premultiply(this._m4_1)\n\n this.setTransformationMatrices(this._m4_1, this._m4_2)\n return _transformation\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n\n //move camera\n let distance = this._v3_1.distanceTo(scalePoint)\n let amount = distance - distance * sizeInverse\n\n //check min and max distance\n const newDistance = distance - amount\n if (newDistance < this.minDistance) {\n sizeInverse = this.minDistance / distance\n amount = distance - distance * sizeInverse\n } else if (newDistance > this.maxDistance) {\n sizeInverse = this.maxDistance / distance\n amount = distance - distance * sizeInverse\n }\n\n let direction = scalePoint.clone().sub(this._v3_1).normalize().multiplyScalar(amount)\n\n this._m4_1.makeTranslation(direction.x, direction.y, direction.z)\n\n if (scaleGizmos) {\n //scale gizmos so they appear in the same spot having the same dimension\n const pos = this._v3_2\n\n distance = pos.distanceTo(scalePoint)\n amount = distance - distance * sizeInverse\n direction = scalePoint.clone().sub(this._v3_2).normalize().multiplyScalar(amount)\n\n this._translationMatrix.makeTranslation(pos.x, pos.y, pos.z)\n this._scaleMatrix.makeScale(sizeInverse, sizeInverse, sizeInverse)\n\n this._m4_2.makeTranslation(direction.x, direction.y, direction.z).multiply(this._translationMatrix)\n this._m4_2.multiply(this._scaleMatrix)\n\n this._translationMatrix.makeTranslation(-pos.x, -pos.y, -pos.z)\n\n this._m4_2.multiply(this._translationMatrix)\n this.setTransformationMatrices(this._m4_1, this._m4_2)\n } else {\n this.setTransformationMatrices(this._m4_1)\n }\n\n return _transformation\n }\n }\n\n /**\n * Set camera fov\n * @param {Number} value fov to be setted\n */\n private setFov = (value: number): void => {\n if (this.camera instanceof PerspectiveCamera) {\n this.camera.fov = MathUtils.clamp(value, this.minFov, this.maxFov)\n this.camera.updateProjectionMatrix()\n }\n }\n\n /**\n * Set the trackball's center point\n * @param {Number} x X coordinate\n * @param {Number} y Y coordinate\n * @param {Number} z Z coordinate\n */\n public setTarget = (x: number, y: number, z: number): void => {\n if (this.camera) {\n this.target.set(x, y, z)\n this._gizmos.position.set(x, y, z) //for correct radius calculation\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this.target, this._tbRadius)\n this.camera.lookAt(this.target)\n }\n }\n\n /**\n * Set values in transformation object\n * @param {Matrix4} camera Transformation to be applied to the camera\n * @param {Matrix4} gizmos Transformation to be applied to gizmos\n */\n private setTransformationMatrices(camera: Matrix4 | null = null, gizmos: Matrix4 | null = null): void {\n if (camera) {\n if (_transformation.camera) {\n _transformation.camera.copy(camera)\n } else {\n _transformation.camera = camera.clone()\n }\n } else {\n _transformation.camera = null\n }\n\n if (gizmos) {\n if (_transformation.gizmos) {\n _transformation.gizmos.copy(gizmos)\n } else {\n _transformation.gizmos = gizmos.clone()\n }\n } else {\n _transformation.gizmos = null\n }\n }\n\n /**\n * Rotate camera around its direction axis passing by a given point by a given angle\n * @param {Vector3} point The point where the rotation axis is passing trough\n * @param {Number} angle Angle in radians\n * @returns The computed transormation matix\n */\n private zRotate = (point: Vector3, angle: number): Transformation => {\n this._rotationMatrix.makeRotationAxis(this._rotationAxis, angle)\n this._translationMatrix.makeTranslation(-point.x, -point.y, -point.z)\n\n this._m4_1.makeTranslation(point.x, point.y, point.z)\n this._m4_1.multiply(this._rotationMatrix)\n this._m4_1.multiply(this._translationMatrix)\n\n this._v3_1.setFromMatrixPosition(this._gizmoMatrixState).sub(point) //vector from rotation center to gizmos position\n this._v3_2.copy(this._v3_1).applyAxisAngle(this._rotationAxis, angle) //apply rotation\n this._v3_2.sub(this._v3_1)\n\n this._m4_2.makeTranslation(this._v3_2.x, this._v3_2.y, this._v3_2.z)\n\n this.setTransformationMatrices(this._m4_1, this._m4_2)\n return _transformation\n }\n\n /**\n * Unproject the cursor on the 3D object surface\n * @param {Vector2} cursor Cursor coordinates in NDC\n * @param {Camera} camera Virtual camera\n * @returns {Vector3} The point of intersection with the model, if exist, null otherwise\n */\n private unprojectOnObj = (cursor: Vector2, camera: Camera): Vector3 | null => {\n if (!this.scene) return null\n\n const raycaster = new Raycaster()\n raycaster.near = camera.near\n raycaster.far = camera.far\n raycaster.setFromCamera(cursor, camera)\n\n const intersect = raycaster.intersectObjects(this.scene.children, true)\n for (let i = 0; i < intersect.length; i++) {\n if (intersect[i].object.uuid != this._gizmos.uuid && intersect[i].face) {\n return intersect[i].point.clone()\n }\n }\n\n return null\n }\n\n /**\n * Unproject the cursor on the trackball surface\n * @param {Camera} camera The virtual camera\n * @param {Number} cursorX Cursor horizontal coordinate on screen\n * @param {Number} cursorY Cursor vertical coordinate on screen\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @param {number} tbRadius The trackball radius\n * @returns {Vector3} The unprojected point on the trackball surface\n */\n private unprojectOnTbSurface = (\n camera: Camera,\n cursorX: number,\n cursorY: number,\n canvas: HTMLElement,\n tbRadius: number,\n ): Vector3 | undefined => {\n if (camera instanceof OrthographicCamera) {\n this._v2_1.copy(this.getCursorPosition(cursorX, cursorY, canvas))\n this._v3_1.set(this._v2_1.x, this._v2_1.y, 0)\n\n const x2 = Math.pow(this._v2_1.x, 2)\n const y2 = Math.pow(this._v2_1.y, 2)\n const r2 = Math.pow(this._tbRadius, 2)\n\n if (x2 + y2 <= r2 * 0.5) {\n //intersection with sphere\n this._v3_1.setZ(Math.sqrt(r2 - (x2 + y2)))\n } else {\n //intersection with hyperboloid\n this._v3_1.setZ((r2 * 0.5) / Math.sqrt(x2 + y2))\n }\n\n return this._v3_1\n }\n\n if (camera instanceof PerspectiveCamera) {\n //unproject cursor on the near plane\n this._v2_1.copy(this.getCursorNDC(cursorX, cursorY, canvas))\n\n this._v3_1.set(this._v2_1.x, this._v2_1.y, -1)\n this._v3_1.applyMatrix4(camera.projectionMatrixInverse)\n\n const rayDir = this._v3_1.clone().normalize() //unprojected ray direction\n const cameraGizmoDistance = camera.position.distanceTo(this._gizmos.position)\n const radius2 = Math.pow(tbRadius, 2)\n\n //\t camera\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\th\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t_ _ | _ _ _\\ _ _ near plane\n //\t\t\tl\n\n const h = this._v3_1.z\n const l = Math.sqrt(Math.pow(this._v3_1.x, 2) + Math.pow(this._v3_1.y, 2))\n\n if (l == 0) {\n //ray aligned with camera\n rayDir.set(this._v3_1.x, this._v3_1.y, tbRadius)\n return rayDir\n }\n\n const m = h / l\n const q = cameraGizmoDistance\n\n /*\n * calculate intersection point between unprojected ray and trackball surface\n *|y = m * x + q\n *|x^2 + y^2 = r^2\n *\n * (m^2 + 1) * x^2 + (2 * m * q) * x + q^2 - r^2 = 0\n */\n let a = Math.pow(m, 2) + 1\n let b = 2 * m * q\n let c = Math.pow(q, 2) - radius2\n let delta = Math.pow(b, 2) - 4 * a * c\n\n if (delta >= 0) {\n //intersection with sphere\n this._v2_1.setX((-b - Math.sqrt(delta)) / (2 * a))\n this._v2_1.setY(m * this._v2_1.x + q)\n\n const angle = MathUtils.RAD2DEG * this._v2_1.angle()\n\n if (angle >= 45) {\n //if angle between intersection point and X' axis is >= 45°, return that point\n //otherwise, calculate intersection point with hyperboloid\n\n const rayLength = Math.sqrt(Math.pow(this._v2_1.x, 2) + Math.pow(cameraGizmoDistance - this._v2_1.y, 2))\n rayDir.multiplyScalar(rayLength)\n rayDir.z += cameraGizmoDistance\n return rayDir\n }\n }\n\n //intersection with hyperboloid\n /*\n *|y = m * x + q\n *|y = (1 / x) * (r^2 / 2)\n *\n * m * x^2 + q * x - r^2 / 2 = 0\n */\n\n a = m\n b = q\n c = -radius2 * 0.5\n delta = Math.pow(b, 2) - 4 * a * c\n this._v2_1.setX((-b - Math.sqrt(delta)) / (2 * a))\n this._v2_1.setY(m * this._v2_1.x + q)\n\n const rayLength = Math.sqrt(Math.pow(this._v2_1.x, 2) + Math.pow(cameraGizmoDistance - this._v2_1.y, 2))\n\n rayDir.multiplyScalar(rayLength)\n rayDir.z += cameraGizmoDistance\n return rayDir\n }\n }\n\n /**\n * Unproject the cursor on the plane passing through the center of the trackball orthogonal to the camera\n * @param {Camera} camera The virtual camera\n * @param {Number} cursorX Cursor horizontal coordinate on screen\n * @param {Number} cursorY Cursor vertical coordinate on screen\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @param {Boolean} initialDistance If initial distance between camera and gizmos should be used for calculations instead of current (Perspective only)\n * @returns {Vector3} The unprojected point on the trackball plane\n */\n private unprojectOnTbPlane = (\n camera: Camera,\n cursorX: number,\n cursorY: number,\n canvas: HTMLElement,\n initialDistance = false,\n ): Vector3 | undefined => {\n if (camera instanceof OrthographicCamera) {\n this._v2_1.copy(this.getCursorPosition(cursorX, cursorY, canvas))\n this._v3_1.set(this._v2_1.x, this._v2_1.y, 0)\n\n return this._v3_1.clone()\n }\n\n if (camera instanceof PerspectiveCamera) {\n this._v2_1.copy(this.getCursorNDC(cursorX, cursorY, canvas))\n\n //unproject cursor on the near plane\n this._v3_1.set(this._v2_1.x, this._v2_1.y, -1)\n this._v3_1.applyMatrix4(camera.projectionMatrixInverse)\n\n const rayDir = this._v3_1.clone().normalize() //unprojected ray direction\n\n //\t camera\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\th\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t_ _ | _ _ _\\ _ _ near plane\n //\t\t\tl\n\n const h = this._v3_1.z\n const l = Math.sqrt(Math.pow(this._v3_1.x, 2) + Math.pow(this._v3_1.y, 2))\n let cameraGizmoDistance\n\n if (initialDistance) {\n cameraGizmoDistance = this._v3_1\n .setFromMatrixPosition(this._cameraMatrixState0)\n .distanceTo(this._v3_2.setFromMatrixPosition(this._gizmoMatrixState0))\n } else {\n cameraGizmoDistance = camera.position.distanceTo(this._gizmos.position)\n }\n\n /*\n * calculate intersection point between unprojected ray and the plane\n *|y = mx + q\n *|y = 0\n *\n * x = -q/m\n */\n if (l == 0) {\n //ray aligned with camera\n rayDir.set(0, 0, 0)\n return rayDir\n }\n\n const m = h / l\n const q = cameraGizmoDistance\n const x = -q / m\n\n const rayLength = Math.sqrt(Math.pow(q, 2) + Math.pow(x, 2))\n rayDir.multiplyScalar(rayLength)\n rayDir.z = 0\n return rayDir\n }\n }\n\n /**\n * Update camera and gizmos state\n */\n private updateMatrixState = (): void => {\n if (!this.camera) return\n\n //update camera and gizmos state\n this._cameraMatrixState.copy(this.camera.matrix)\n this._gizmoMatrixState.copy(this._gizmos.matrix)\n\n if (this.camera instanceof OrthographicCamera) {\n this._cameraProjectionState.copy(this.camera.projectionMatrix)\n this.camera.updateProjectionMatrix()\n this._zoomState = this.camera.zoom\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n this._fovState = this.camera.fov\n }\n }\n\n /**\n * Update the trackball FSA\n * @param {STATE} newState New state of the FSA\n * @param {Boolean} updateMatrices If matriices state should be updated\n */\n private updateTbState = (newState: Symbol, updateMatrices: boolean): void => {\n this._state = newState\n if (updateMatrices) {\n this.updateMatrixState()\n }\n }\n\n public update = (): void => {\n const EPS = 0.000001\n\n // Update target and gizmos state\n if (!this.target.equals(this._currentTarget) && this.camera) {\n this._gizmos.position.set(this.target.x, this.target.y, this.target.z) //for correct radius calculation\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this.target, this._tbRadius)\n this._currentTarget.copy(this.target)\n }\n\n if (!this.camera) return\n\n //check min/max parameters\n if (this.camera instanceof OrthographicCamera) {\n //check zoom\n if (this.camera.zoom > this.maxZoom || this.camera.zoom < this.minZoom) {\n const newZoom = MathUtils.clamp(this.camera.zoom, this.minZoom, this.maxZoom)\n this.applyTransformMatrix(this.applyScale(newZoom / this.camera.zoom, this._gizmos.position, true))\n }\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n //check distance\n const distance = this.camera.position.distanceTo(this._gizmos.position)\n\n if (distance > this.maxDistance + EPS || distance < this.minDistance - EPS) {\n const newDistance = MathUtils.clamp(distance, this.minDistance, this.maxDistance)\n this.applyTransformMatrix(this.applyScale(newDistance / distance, this._gizmos.position))\n this.updateMatrixState()\n }\n\n //check fov\n if (this.camera.fov < this.minFov || this.camera.fov > this.maxFov) {\n this.camera.fov = MathUtils.clamp(this.camera.fov, this.minFov, this.maxFov)\n this.camera.updateProjectionMatrix()\n }\n\n const oldRadius = this._tbRadius\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n\n if (oldRadius < this._tbRadius - EPS || oldRadius > this._tbRadius + EPS) {\n const scale = (this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z) / 3\n const newRadius = this._tbRadius / scale\n // @ts-ignore\n const curve = new EllipseCurve(0, 0, newRadius, newRadius)\n const points = curve.getPoints(this._curvePts)\n const curveGeometry = new BufferGeometry().setFromPoints(points)\n\n for (const gizmo in this._gizmos.children) {\n const child = this._gizmos.children[gizmo] as Mesh\n child.geometry = curveGeometry\n }\n }\n }\n\n this.camera.lookAt(this._gizmos.position)\n }\n\n private setStateFromJSON = (json: string): void => {\n const state = JSON.parse(json)\n\n if (state.arcballState && this.camera) {\n this._cameraMatrixState.fromArray(state.arcballState.cameraMatrix.elements)\n this._cameraMatrixState.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n\n this.camera.up.copy(state.arcballState.cameraUp)\n this.camera.near = state.arcballState.cameraNear\n this.camera.far = state.arcballState.cameraFar\n\n this.camera.zoom = state.arcballState.cameraZoom\n\n if (this.camera instanceof PerspectiveCamera) {\n this.camera.fov = state.arcballState.cameraFov\n }\n\n this._gizmoMatrixState.fromArray(state.arcballState.gizmoMatrix.elements)\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n this.camera.updateMatrix()\n this.camera.updateProjectionMatrix()\n\n this._gizmos.updateMatrix()\n\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n const gizmoTmp = new Matrix4().copy(this._gizmoMatrixState0)\n this.makeGizmos(this._gizmos.position, this._tbRadius)\n this._gizmoMatrixState0.copy(gizmoTmp)\n\n this.camera.lookAt(this._gizmos.position)\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n}\n\nexport { ArcballControls }\n"],"names":["Matrix4","EventDispatcher","EllipseCurve","BufferGeometry","OrthographicCamera","PerspectiveCamera","MathUtils","Vector3","GridHelper","LineBasicMaterial","Line","Raycaster","rayLength","Vector2","Quaternion","Group","Box3","Sphere"],"mappings":"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"}
1
+ {"version":3,"file":"ArcballControls.cjs","sources":["../../src/controls/ArcballControls.ts"],"sourcesContent":["import {\n GridHelper,\n EllipseCurve,\n BufferGeometry,\n Line,\n LineBasicMaterial,\n Raycaster,\n Group,\n Box3,\n Sphere,\n Quaternion,\n Vector2,\n Vector3,\n Matrix4,\n MathUtils,\n Scene,\n PerspectiveCamera,\n OrthographicCamera,\n Mesh,\n Material,\n EventDispatcher,\n} from 'three'\n\ntype Camera = OrthographicCamera | PerspectiveCamera\ntype Operation = 'PAN' | 'ROTATE' | 'ZOOM' | 'FOV'\ntype MouseButtonType = number | 'WHEEL'\ntype ModifierKey = 'CTRL' | 'SHIFT'\ntype MouseAction = {\n operation: Operation\n mouse: MouseButtonType\n key: ModifierKey | null\n}\n\ntype Transformation = {\n camera: Matrix4 | null\n gizmos: Matrix4 | null\n}\n\n//trackball state\nconst STATE = {\n IDLE: Symbol(),\n ROTATE: Symbol(),\n PAN: Symbol(),\n SCALE: Symbol(),\n FOV: Symbol(),\n FOCUS: Symbol(),\n ZROTATE: Symbol(),\n TOUCH_MULTI: Symbol(),\n ANIMATION_FOCUS: Symbol(),\n ANIMATION_ROTATE: Symbol(),\n}\n\nconst INPUT = {\n NONE: Symbol(),\n ONE_FINGER: Symbol(),\n ONE_FINGER_SWITCHED: Symbol(),\n TWO_FINGER: Symbol(),\n MULT_FINGER: Symbol(),\n CURSOR: Symbol(),\n}\n\n//cursor center coordinates\nconst _center = {\n x: 0,\n y: 0,\n}\n\n//transformation matrices for gizmos and camera\nconst _transformation: Transformation = {\n camera: new Matrix4(),\n gizmos: new Matrix4(),\n}\n\n//events\nconst _changeEvent = { type: 'change' }\nconst _startEvent = { type: 'start' }\nconst _endEvent = { type: 'end' }\n\n/**\n *\n * @param {CamOrthographicCamera | PerspectiveCameraera} camera Virtual camera used in the scene\n * @param {HTMLElement=null} domElement Renderer's dom element\n * @param {Scene=null} scene The scene to be rendered\n */\nclass ArcballControls extends EventDispatcher {\n private camera: OrthographicCamera | PerspectiveCamera | null\n private domElement: HTMLElement | null | undefined\n private scene: Scene | null | undefined\n\n private mouseActions: (MouseAction & { state: Symbol })[]\n private _mouseOp: Operation | null\n\n private _v2_1: Vector2\n private _v3_1: Vector3\n private _v3_2: Vector3\n\n private _m4_1: Matrix4\n private _m4_2: Matrix4\n\n private _quat: Quaternion\n\n private _translationMatrix: Matrix4\n private _rotationMatrix: Matrix4\n private _scaleMatrix: Matrix4\n\n private _rotationAxis: Vector3\n\n private _cameraMatrixState: Matrix4\n private _cameraProjectionState: Matrix4\n\n private _fovState: number\n private _upState: Vector3\n private _zoomState: number\n private _nearPos: number\n private _farPos: number\n\n private _gizmoMatrixState: Matrix4\n\n private _up0: Vector3\n private _zoom0: number\n private _fov0: number\n private _initialNear: number\n private _nearPos0: number\n private _initialFar: number\n private _farPos0: number\n private _cameraMatrixState0: Matrix4\n private _gizmoMatrixState0: Matrix4\n\n private _button: MouseButtonType\n private _touchStart: PointerEvent[]\n private _touchCurrent: PointerEvent[]\n private _input: Symbol\n\n private _switchSensibility: number\n private _startFingerDistance: number\n private _currentFingerDistance: number\n private _startFingerRotation: number\n private _currentFingerRotation: number\n\n private _devPxRatio: number\n private _downValid: boolean\n private _nclicks: number\n private _downEvents: PointerEvent[]\n private _clickStart: number\n private _maxDownTime: number\n private _maxInterval: number\n private _posThreshold: number\n private _movementThreshold: number\n\n private _currentCursorPosition: Vector3\n private _startCursorPosition: Vector3\n\n private _grid: GridHelper | null\n private _gridPosition: Vector3\n\n private _gizmos: Group\n private _curvePts: number\n\n private _timeStart: number\n private _animationId: number\n\n public focusAnimationTime: number\n\n private _timePrev: number\n private _timeCurrent: number\n private _anglePrev: number\n private _angleCurrent: number\n private _cursorPosPrev: Vector3\n private _cursorPosCurr: Vector3\n private _wPrev: number\n private _wCurr: number\n\n public adjustNearFar: boolean\n public scaleFactor: number\n public dampingFactor: number\n public wMax: number\n public enableAnimations: boolean\n public enableGrid: boolean\n public cursorZoom: boolean\n public minFov: number\n public maxFov: number\n\n public enabled: boolean\n public enablePan: boolean\n public enableRotate: boolean\n public enableZoom: boolean\n\n public minDistance: number\n public maxDistance: number\n public minZoom: number\n public maxZoom: number\n\n readonly target: Vector3\n private _currentTarget: Vector3\n\n private _tbRadius: number\n\n private _state: Symbol\n\n constructor(\n camera: Camera | null,\n domElement: HTMLElement | null | undefined = null,\n scene: Scene | null | undefined = null,\n ) {\n super()\n this.camera = null\n this.domElement = domElement\n this.scene = scene\n\n this.mouseActions = []\n this._mouseOp = null\n\n //global vectors and matrices that are used in some operations to avoid creating new objects every time (e.g. every time cursor moves)\n this._v2_1 = new Vector2()\n this._v3_1 = new Vector3()\n this._v3_2 = new Vector3()\n\n this._m4_1 = new Matrix4()\n this._m4_2 = new Matrix4()\n\n this._quat = new Quaternion()\n\n //transformation matrices\n this._translationMatrix = new Matrix4() //matrix for translation operation\n this._rotationMatrix = new Matrix4() //matrix for rotation operation\n this._scaleMatrix = new Matrix4() //matrix for scaling operation\n\n this._rotationAxis = new Vector3() //axis for rotate operation\n\n //camera state\n this._cameraMatrixState = new Matrix4()\n this._cameraProjectionState = new Matrix4()\n\n this._fovState = 1\n this._upState = new Vector3()\n this._zoomState = 1\n this._nearPos = 0\n this._farPos = 0\n\n this._gizmoMatrixState = new Matrix4()\n\n //initial values\n this._up0 = new Vector3()\n this._zoom0 = 1\n this._fov0 = 0\n this._initialNear = 0\n this._nearPos0 = 0\n this._initialFar = 0\n this._farPos0 = 0\n this._cameraMatrixState0 = new Matrix4()\n this._gizmoMatrixState0 = new Matrix4()\n\n //pointers array\n this._button = -1\n this._touchStart = []\n this._touchCurrent = []\n this._input = INPUT.NONE\n\n //two fingers touch interaction\n this._switchSensibility = 32 //minimum movement to be performed to fire single pan start after the second finger has been released\n this._startFingerDistance = 0 //distance between two fingers\n this._currentFingerDistance = 0\n this._startFingerRotation = 0 //amount of rotation performed with two fingers\n this._currentFingerRotation = 0\n\n //double tap\n this._devPxRatio = 0\n this._downValid = true\n this._nclicks = 0\n this._downEvents = []\n this._clickStart = 0 //first click time\n this._maxDownTime = 250\n this._maxInterval = 300\n this._posThreshold = 24\n this._movementThreshold = 24\n\n //cursor positions\n this._currentCursorPosition = new Vector3()\n this._startCursorPosition = new Vector3()\n\n //grid\n this._grid = null //grid to be visualized during pan operation\n this._gridPosition = new Vector3()\n\n //gizmos\n this._gizmos = new Group()\n this._curvePts = 128\n\n //animations\n this._timeStart = -1 //initial time\n this._animationId = -1\n\n //focus animation\n this.focusAnimationTime = 500 //duration of focus animation in ms\n\n //rotate animation\n this._timePrev = 0 //time at which previous rotate operation has been detected\n this._timeCurrent = 0 //time at which current rotate operation has been detected\n this._anglePrev = 0 //angle of previous rotation\n this._angleCurrent = 0 //angle of current rotation\n this._cursorPosPrev = new Vector3() //cursor position when previous rotate operation has been detected\n this._cursorPosCurr = new Vector3() //cursor position when current rotate operation has been detected\n this._wPrev = 0 //angular velocity of the previous rotate operation\n this._wCurr = 0 //angular velocity of the current rotate operation\n\n //parameters\n this.adjustNearFar = false\n this.scaleFactor = 1.1 //zoom/distance multiplier\n this.dampingFactor = 25\n this.wMax = 20 //maximum angular velocity allowed\n this.enableAnimations = true //if animations should be performed\n this.enableGrid = false //if grid should be showed during pan operation\n this.cursorZoom = false //if wheel zoom should be cursor centered\n this.minFov = 5\n this.maxFov = 90\n\n this.enabled = true\n this.enablePan = true\n this.enableRotate = true\n this.enableZoom = true\n\n this.minDistance = 0\n this.maxDistance = Infinity\n this.minZoom = 0\n this.maxZoom = Infinity\n\n //trackball parameters\n this.target = new Vector3(0, 0, 0)\n this._currentTarget = new Vector3(0, 0, 0)\n\n this._tbRadius = 1\n\n //FSA\n this._state = STATE.IDLE\n\n this.setCamera(camera)\n\n if (this.scene) {\n this.scene.add(this._gizmos)\n }\n\n this._devPxRatio = window.devicePixelRatio\n\n this.initializeMouseActions()\n\n if (this.domElement) this.connect(this.domElement)\n\n window.addEventListener('resize', this.onWindowResize)\n }\n\n //listeners\n\n private onWindowResize = (): void => {\n const scale = (this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z) / 3\n if (this.camera) {\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n }\n\n const newRadius = this._tbRadius / scale\n // @ts-ignore\n const curve = new EllipseCurve(0, 0, newRadius, newRadius)\n const points = curve.getPoints(this._curvePts)\n const curveGeometry = new BufferGeometry().setFromPoints(points)\n\n for (const gizmo in this._gizmos.children) {\n const child = this._gizmos.children[gizmo] as Mesh\n child.geometry = curveGeometry\n }\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n private onContextMenu = (event: MouseEvent): void => {\n if (!this.enabled) {\n return\n }\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n if (this.mouseActions[i].mouse == 2) {\n //prevent only if button 2 is actually used\n event.preventDefault()\n break\n }\n }\n }\n\n private onPointerCancel = (): void => {\n this._touchStart.splice(0, this._touchStart.length)\n this._touchCurrent.splice(0, this._touchCurrent.length)\n this._input = INPUT.NONE\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n if (event.button == 0 && event.isPrimary) {\n this._downValid = true\n this._downEvents.push(event)\n } else {\n this._downValid = false\n }\n\n if (event.pointerType == 'touch' && this._input != INPUT.CURSOR) {\n this._touchStart.push(event)\n this._touchCurrent.push(event)\n\n switch (this._input) {\n case INPUT.NONE:\n //singleStart\n this._input = INPUT.ONE_FINGER\n this.onSinglePanStart(event, 'ROTATE')\n\n window.addEventListener('pointermove', this.onPointerMove)\n window.addEventListener('pointerup', this.onPointerUp)\n\n break\n\n case INPUT.ONE_FINGER:\n case INPUT.ONE_FINGER_SWITCHED:\n //doubleStart\n this._input = INPUT.TWO_FINGER\n\n this.onRotateStart()\n this.onPinchStart()\n this.onDoublePanStart()\n\n break\n\n case INPUT.TWO_FINGER:\n //multipleStart\n this._input = INPUT.MULT_FINGER\n this.onTriplePanStart()\n break\n }\n } else if (event.pointerType != 'touch' && this._input == INPUT.NONE) {\n let modifier: ModifierKey | null = null\n\n if (event.ctrlKey || event.metaKey) {\n modifier = 'CTRL'\n } else if (event.shiftKey) {\n modifier = 'SHIFT'\n }\n\n this._mouseOp = this.getOpFromAction(event.button, modifier)\n if (this._mouseOp) {\n window.addEventListener('pointermove', this.onPointerMove)\n window.addEventListener('pointerup', this.onPointerUp)\n\n //singleStart\n this._input = INPUT.CURSOR\n this._button = event.button\n this.onSinglePanStart(event, this._mouseOp)\n }\n }\n }\n\n private onPointerMove = (event: PointerEvent): void => {\n if (event.pointerType == 'touch' && this._input != INPUT.CURSOR) {\n switch (this._input) {\n case INPUT.ONE_FINGER:\n //singleMove\n this.updateTouchEvent(event)\n\n this.onSinglePanMove(event, STATE.ROTATE)\n break\n\n case INPUT.ONE_FINGER_SWITCHED:\n const movement = this.calculatePointersDistance(this._touchCurrent[0], event) * this._devPxRatio\n\n if (movement >= this._switchSensibility) {\n //singleMove\n this._input = INPUT.ONE_FINGER\n this.updateTouchEvent(event)\n\n this.onSinglePanStart(event, 'ROTATE')\n break\n }\n\n break\n\n case INPUT.TWO_FINGER:\n //rotate/pan/pinchMove\n this.updateTouchEvent(event)\n\n this.onRotateMove()\n this.onPinchMove()\n this.onDoublePanMove()\n\n break\n\n case INPUT.MULT_FINGER:\n //multMove\n this.updateTouchEvent(event)\n\n this.onTriplePanMove()\n break\n }\n } else if (event.pointerType != 'touch' && this._input == INPUT.CURSOR) {\n let modifier: ModifierKey | null = null\n\n if (event.ctrlKey || event.metaKey) {\n modifier = 'CTRL'\n } else if (event.shiftKey) {\n modifier = 'SHIFT'\n }\n\n const mouseOpState = this.getOpStateFromAction(this._button, modifier)\n\n if (mouseOpState) {\n this.onSinglePanMove(event, mouseOpState)\n }\n }\n\n //checkDistance\n if (this._downValid) {\n const movement =\n this.calculatePointersDistance(this._downEvents[this._downEvents.length - 1], event) * this._devPxRatio\n if (movement > this._movementThreshold) {\n this._downValid = false\n }\n }\n }\n\n private onPointerUp = (event: PointerEvent): void => {\n if (event.pointerType == 'touch' && this._input != INPUT.CURSOR) {\n const nTouch = this._touchCurrent.length\n\n for (let i = 0; i < nTouch; i++) {\n if (this._touchCurrent[i].pointerId == event.pointerId) {\n this._touchCurrent.splice(i, 1)\n this._touchStart.splice(i, 1)\n break\n }\n }\n\n switch (this._input) {\n case INPUT.ONE_FINGER:\n case INPUT.ONE_FINGER_SWITCHED:\n //singleEnd\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n this._input = INPUT.NONE\n this.onSinglePanEnd()\n\n break\n\n case INPUT.TWO_FINGER:\n //doubleEnd\n this.onDoublePanEnd()\n this.onPinchEnd()\n this.onRotateEnd()\n\n //switching to singleStart\n this._input = INPUT.ONE_FINGER_SWITCHED\n\n break\n\n case INPUT.MULT_FINGER:\n if (this._touchCurrent.length == 0) {\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n //multCancel\n this._input = INPUT.NONE\n this.onTriplePanEnd()\n }\n\n break\n }\n } else if (event.pointerType != 'touch' && this._input == INPUT.CURSOR) {\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n this._input = INPUT.NONE\n this.onSinglePanEnd()\n this._button = -1\n }\n\n if (event.isPrimary) {\n if (this._downValid) {\n const downTime = event.timeStamp - this._downEvents[this._downEvents.length - 1].timeStamp\n\n if (downTime <= this._maxDownTime) {\n if (this._nclicks == 0) {\n //first valid click detected\n this._nclicks = 1\n this._clickStart = performance.now()\n } else {\n const clickInterval = event.timeStamp - this._clickStart\n const movement = this.calculatePointersDistance(this._downEvents[1], this._downEvents[0]) * this._devPxRatio\n\n if (clickInterval <= this._maxInterval && movement <= this._posThreshold) {\n //second valid click detected\n //fire double tap and reset values\n this._nclicks = 0\n this._downEvents.splice(0, this._downEvents.length)\n this.onDoubleTap(event)\n } else {\n //new 'first click'\n this._nclicks = 1\n this._downEvents.shift()\n this._clickStart = performance.now()\n }\n }\n } else {\n this._downValid = false\n this._nclicks = 0\n this._downEvents.splice(0, this._downEvents.length)\n }\n } else {\n this._nclicks = 0\n this._downEvents.splice(0, this._downEvents.length)\n }\n }\n }\n\n private onWheel = (event: WheelEvent): void => {\n if (this.enabled && this.enableZoom && this.domElement) {\n let modifier: ModifierKey | null = null\n\n if (event.ctrlKey || event.metaKey) {\n modifier = 'CTRL'\n } else if (event.shiftKey) {\n modifier = 'SHIFT'\n }\n\n const mouseOp = this.getOpFromAction('WHEEL', modifier)\n\n if (mouseOp) {\n event.preventDefault()\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n const notchDeltaY = 125 //distance of one notch of mouse wheel\n let sgn = event.deltaY / notchDeltaY\n\n let size = 1\n\n if (sgn > 0) {\n size = 1 / this.scaleFactor\n } else if (sgn < 0) {\n size = this.scaleFactor\n }\n\n switch (mouseOp) {\n case 'ZOOM':\n this.updateTbState(STATE.SCALE, true)\n\n if (sgn > 0) {\n size = 1 / Math.pow(this.scaleFactor, sgn)\n } else if (sgn < 0) {\n size = Math.pow(this.scaleFactor, -sgn)\n }\n\n if (this.cursorZoom && this.enablePan) {\n let scalePoint\n\n if (this.camera instanceof OrthographicCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, event.clientX, event.clientY, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .multiplyScalar(1 / this.camera.zoom)\n .add(this._gizmos.position)\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, event.clientX, event.clientY, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .add(this._gizmos.position)\n }\n\n if (scalePoint !== undefined) this.applyTransformMatrix(this.applyScale(size, scalePoint))\n } else {\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position))\n }\n\n if (this._grid) {\n this.disposeGrid()\n this.drawGrid()\n }\n\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n\n break\n\n case 'FOV':\n if (this.camera instanceof PerspectiveCamera) {\n this.updateTbState(STATE.FOV, true)\n\n //Vertigo effect\n\n //\t fov / 2\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\tx\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t\t| _ _ _\\\n //\t\t\ty\n\n //check for iOs shift shortcut\n if (event.deltaX != 0) {\n sgn = event.deltaX / notchDeltaY\n\n size = 1\n\n if (sgn > 0) {\n size = 1 / Math.pow(this.scaleFactor, sgn)\n } else if (sgn < 0) {\n size = Math.pow(this.scaleFactor, -sgn)\n }\n }\n\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n const x = this._v3_1.distanceTo(this._gizmos.position)\n let xNew = x / size //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n //check min and max distance\n xNew = MathUtils.clamp(xNew, this.minDistance, this.maxDistance)\n\n const y = x * Math.tan(MathUtils.DEG2RAD * this.camera.fov * 0.5)\n\n //calculate new fov\n let newFov = MathUtils.RAD2DEG * (Math.atan(y / xNew) * 2)\n\n //check min and max fov\n if (newFov > this.maxFov) {\n newFov = this.maxFov\n } else if (newFov < this.minFov) {\n newFov = this.minFov\n }\n\n const newDistance = y / Math.tan(MathUtils.DEG2RAD * (newFov / 2))\n size = x / newDistance\n\n this.setFov(newFov)\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position, false))\n }\n\n if (this._grid) {\n this.disposeGrid()\n this.drawGrid()\n }\n\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n\n break\n }\n }\n }\n }\n\n private onSinglePanStart = (event: PointerEvent, operation: Operation): void => {\n if (this.enabled && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.setCenter(event.clientX, event.clientY)\n\n switch (operation) {\n case 'PAN':\n if (!this.enablePan) return\n\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n if (this.camera) {\n this.updateTbState(STATE.PAN, true)\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n if (this.enableGrid) {\n this.drawGrid()\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n break\n\n case 'ROTATE':\n if (!this.enableRotate) return\n\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n }\n\n if (this.camera) {\n this.updateTbState(STATE.ROTATE, true)\n const rayDir = this.unprojectOnTbSurface(this.camera, _center.x, _center.y, this.domElement, this._tbRadius)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n this.activateGizmos(true)\n if (this.enableAnimations) {\n this._timePrev = this._timeCurrent = performance.now()\n this._angleCurrent = this._anglePrev = 0\n this._cursorPosPrev.copy(this._startCursorPosition)\n this._cursorPosCurr.copy(this._cursorPosPrev)\n this._wCurr = 0\n this._wPrev = this._wCurr\n }\n }\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n break\n\n case 'FOV':\n if (!this.enableZoom) return\n\n if (this.camera instanceof PerspectiveCamera) {\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n this.updateTbState(STATE.FOV, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n }\n break\n\n case 'ZOOM':\n if (!this.enableZoom) return\n\n if (this._animationId != -1) {\n cancelAnimationFrame(this._animationId)\n this._animationId = -1\n this._timeStart = -1\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n this.updateTbState(STATE.SCALE, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n break\n }\n }\n }\n\n private onSinglePanMove = (event: PointerEvent, opState: Symbol): void => {\n if (this.enabled && this.domElement) {\n const restart = opState != this._state\n this.setCenter(event.clientX, event.clientY)\n\n switch (opState) {\n case STATE.PAN:\n if (this.enablePan && this.camera) {\n if (restart) {\n //switch to pan operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n if (this.enableGrid) {\n this.drawGrid()\n }\n\n this.activateGizmos(false)\n } else {\n //continue with pan operation\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n if (rayDir !== undefined) {\n this._currentCursorPosition.copy(rayDir)\n }\n this.applyTransformMatrix(this.pan(this._startCursorPosition, this._currentCursorPosition))\n }\n }\n\n break\n\n case STATE.ROTATE:\n if (this.enableRotate && this.camera) {\n if (restart) {\n //switch to rotate operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n const rayDir = this.unprojectOnTbSurface(\n this.camera,\n _center.x,\n _center.y,\n this.domElement,\n this._tbRadius,\n )\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(true)\n } else {\n //continue with rotate operation\n const rayDir = this.unprojectOnTbSurface(\n this.camera,\n _center.x,\n _center.y,\n this.domElement,\n this._tbRadius,\n )\n if (rayDir !== undefined) {\n this._currentCursorPosition.copy(rayDir)\n }\n\n const distance = this._startCursorPosition.distanceTo(this._currentCursorPosition)\n const angle = this._startCursorPosition.angleTo(this._currentCursorPosition)\n const amount = Math.max(distance / this._tbRadius, angle) //effective rotation angle\n\n this.applyTransformMatrix(\n this.rotate(this.calculateRotationAxis(this._startCursorPosition, this._currentCursorPosition), amount),\n )\n\n if (this.enableAnimations) {\n this._timePrev = this._timeCurrent\n this._timeCurrent = performance.now()\n this._anglePrev = this._angleCurrent\n this._angleCurrent = amount\n this._cursorPosPrev.copy(this._cursorPosCurr)\n this._cursorPosCurr.copy(this._currentCursorPosition)\n this._wPrev = this._wCurr\n this._wCurr = this.calculateAngularSpeed(\n this._anglePrev,\n this._angleCurrent,\n this._timePrev,\n this._timeCurrent,\n )\n }\n }\n }\n\n break\n\n case STATE.SCALE:\n if (this.enableZoom) {\n if (restart) {\n //switch to zoom operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(false)\n } else {\n //continue with zoom operation\n const screenNotches = 8 //how many wheel notches corresponds to a full screen pan\n this._currentCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n\n const movement = this._currentCursorPosition.y - this._startCursorPosition.y\n\n let size = 1\n\n if (movement < 0) {\n size = 1 / Math.pow(this.scaleFactor, -movement * screenNotches)\n } else if (movement > 0) {\n size = Math.pow(this.scaleFactor, movement * screenNotches)\n }\n\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position))\n }\n }\n\n break\n\n case STATE.FOV:\n if (this.enableZoom && this.camera instanceof PerspectiveCamera) {\n if (restart) {\n //switch to fov operation\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(opState, true)\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(false)\n } else {\n //continue with fov operation\n const screenNotches = 8 //how many wheel notches corresponds to a full screen pan\n this._currentCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n\n const movement = this._currentCursorPosition.y - this._startCursorPosition.y\n\n let size = 1\n\n if (movement < 0) {\n size = 1 / Math.pow(this.scaleFactor, -movement * screenNotches)\n } else if (movement > 0) {\n size = Math.pow(this.scaleFactor, movement * screenNotches)\n }\n\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n const x = this._v3_1.distanceTo(this._gizmos.position)\n let xNew = x / size //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n //check min and max distance\n xNew = MathUtils.clamp(xNew, this.minDistance, this.maxDistance)\n\n const y = x * Math.tan(MathUtils.DEG2RAD * this._fovState * 0.5)\n\n //calculate new fov\n let newFov = MathUtils.RAD2DEG * (Math.atan(y / xNew) * 2)\n\n //check min and max fov\n newFov = MathUtils.clamp(newFov, this.minFov, this.maxFov)\n\n const newDistance = y / Math.tan(MathUtils.DEG2RAD * (newFov / 2))\n size = x / newDistance\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n\n this.setFov(newFov)\n this.applyTransformMatrix(this.applyScale(size, this._v3_2, false))\n\n //adjusting distance\n const direction = this._gizmos.position\n .clone()\n .sub(this.camera.position)\n .normalize()\n .multiplyScalar(newDistance / x)\n this._m4_1.makeTranslation(direction.x, direction.y, direction.z)\n }\n }\n\n break\n }\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onSinglePanEnd = (): void => {\n if (this._state == STATE.ROTATE) {\n if (!this.enableRotate) {\n return\n }\n\n if (this.enableAnimations) {\n //perform rotation animation\n const deltaTime = performance.now() - this._timeCurrent\n if (deltaTime < 120) {\n const w = Math.abs((this._wPrev + this._wCurr) / 2)\n\n const self = this\n this._animationId = window.requestAnimationFrame(function (t) {\n self.updateTbState(STATE.ANIMATION_ROTATE, true)\n const rotationAxis = self.calculateRotationAxis(self._cursorPosPrev, self._cursorPosCurr)\n\n self.onRotationAnim(t, rotationAxis, Math.min(w, self.wMax))\n })\n } else {\n //cursor has been standing still for over 120 ms since last movement\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n } else {\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n } else if (this._state == STATE.PAN || this._state == STATE.IDLE) {\n this.updateTbState(STATE.IDLE, false)\n\n if (this.enableGrid) {\n this.disposeGrid()\n }\n\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onDoubleTap = (event: PointerEvent): void => {\n if (this.enabled && this.enablePan && this.scene && this.camera && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.setCenter(event.clientX, event.clientY)\n const hitP = this.unprojectOnObj(this.getCursorNDC(_center.x, _center.y, this.domElement), this.camera)\n\n if (hitP && this.enableAnimations) {\n const self = this\n if (this._animationId != -1) {\n window.cancelAnimationFrame(this._animationId)\n }\n\n this._timeStart = -1\n this._animationId = window.requestAnimationFrame(function (t) {\n self.updateTbState(STATE.ANIMATION_FOCUS, true)\n self.onFocusAnim(t, hitP, self._cameraMatrixState, self._gizmoMatrixState)\n })\n } else if (hitP && !this.enableAnimations) {\n this.updateTbState(STATE.FOCUS, true)\n this.focus(hitP, this.scaleFactor)\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onDoublePanStart = (): void => {\n if (this.enabled && this.enablePan && this.camera && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(STATE.PAN, true)\n\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement, true)\n if (rayDir !== undefined) {\n this._startCursorPosition.copy(rayDir)\n }\n this._currentCursorPosition.copy(this._startCursorPosition)\n\n this.activateGizmos(false)\n }\n }\n\n private onDoublePanMove = (): void => {\n if (this.enabled && this.enablePan && this.camera && this.domElement) {\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n\n if (this._state != STATE.PAN) {\n this.updateTbState(STATE.PAN, true)\n this._startCursorPosition.copy(this._currentCursorPosition)\n }\n\n const rayDir = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement, true)\n if (rayDir !== undefined) this._currentCursorPosition.copy(rayDir)\n this.applyTransformMatrix(this.pan(this._startCursorPosition, this._currentCursorPosition, true))\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onDoublePanEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onRotateStart = (): void => {\n if (this.enabled && this.enableRotate) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(STATE.ZROTATE, true)\n\n //this._startFingerRotation = event.rotation;\n\n this._startFingerRotation =\n this.getAngle(this._touchCurrent[1], this._touchCurrent[0]) +\n this.getAngle(this._touchStart[1], this._touchStart[0])\n this._currentFingerRotation = this._startFingerRotation\n\n this.camera?.getWorldDirection(this._rotationAxis) //rotation axis\n\n if (!this.enablePan && !this.enableZoom) {\n this.activateGizmos(true)\n }\n }\n }\n\n private onRotateMove = (): void => {\n if (this.enabled && this.enableRotate && this.camera && this.domElement) {\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n let rotationPoint\n\n if (this._state != STATE.ZROTATE) {\n this.updateTbState(STATE.ZROTATE, true)\n this._startFingerRotation = this._currentFingerRotation\n }\n\n //this._currentFingerRotation = event.rotation;\n this._currentFingerRotation =\n this.getAngle(this._touchCurrent[1], this._touchCurrent[0]) +\n this.getAngle(this._touchStart[1], this._touchStart[0])\n\n if (!this.enablePan) {\n rotationPoint = new Vector3().setFromMatrixPosition(this._gizmoMatrixState)\n } else if (this.camera) {\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n rotationPoint = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .multiplyScalar(1 / this.camera.zoom)\n .add(this._v3_2)\n }\n\n const amount = MathUtils.DEG2RAD * (this._startFingerRotation - this._currentFingerRotation)\n\n if (rotationPoint !== undefined) {\n this.applyTransformMatrix(this.zRotate(rotationPoint, amount))\n }\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onRotateEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onPinchStart = (): void => {\n if (this.enabled && this.enableZoom) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n this.updateTbState(STATE.SCALE, true)\n\n this._startFingerDistance = this.calculatePointersDistance(this._touchCurrent[0], this._touchCurrent[1])\n this._currentFingerDistance = this._startFingerDistance\n\n this.activateGizmos(false)\n }\n }\n\n private onPinchMove = (): void => {\n if (this.enabled && this.enableZoom && this.domElement) {\n this.setCenter(\n (this._touchCurrent[0].clientX + this._touchCurrent[1].clientX) / 2,\n (this._touchCurrent[0].clientY + this._touchCurrent[1].clientY) / 2,\n )\n const minDistance = 12 //minimum distance between fingers (in css pixels)\n\n if (this._state != STATE.SCALE) {\n this._startFingerDistance = this._currentFingerDistance\n this.updateTbState(STATE.SCALE, true)\n }\n\n this._currentFingerDistance = Math.max(\n this.calculatePointersDistance(this._touchCurrent[0], this._touchCurrent[1]),\n minDistance * this._devPxRatio,\n )\n const amount = this._currentFingerDistance / this._startFingerDistance\n\n let scalePoint\n\n if (!this.enablePan) {\n scalePoint = this._gizmos.position\n } else {\n if (this.camera instanceof OrthographicCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .multiplyScalar(1 / this.camera.zoom)\n .add(this._gizmos.position)\n } else if (this.camera instanceof PerspectiveCamera) {\n scalePoint = this.unprojectOnTbPlane(this.camera, _center.x, _center.y, this.domElement)\n ?.applyQuaternion(this.camera.quaternion)\n .add(this._gizmos.position)\n }\n }\n\n if (scalePoint !== undefined) {\n this.applyTransformMatrix(this.applyScale(amount, scalePoint))\n }\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onPinchEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n }\n\n private onTriplePanStart = (): void => {\n if (this.enabled && this.enableZoom && this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_startEvent)\n\n this.updateTbState(STATE.SCALE, true)\n\n //const center = event.center;\n let clientX = 0\n let clientY = 0\n const nFingers = this._touchCurrent.length\n\n for (let i = 0; i < nFingers; i++) {\n clientX += this._touchCurrent[i].clientX\n clientY += this._touchCurrent[i].clientY\n }\n\n this.setCenter(clientX / nFingers, clientY / nFingers)\n\n this._startCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n this._currentCursorPosition.copy(this._startCursorPosition)\n }\n }\n\n private onTriplePanMove = (): void => {\n if (this.enabled && this.enableZoom && this.camera && this.domElement) {\n //\t fov / 2\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\tx\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t\t| _ _ _\\\n //\t\t\ty\n\n //const center = event.center;\n let clientX = 0\n let clientY = 0\n const nFingers = this._touchCurrent.length\n\n for (let i = 0; i < nFingers; i++) {\n clientX += this._touchCurrent[i].clientX\n clientY += this._touchCurrent[i].clientY\n }\n\n this.setCenter(clientX / nFingers, clientY / nFingers)\n\n const screenNotches = 8 //how many wheel notches corresponds to a full screen pan\n this._currentCursorPosition.setY(this.getCursorNDC(_center.x, _center.y, this.domElement).y * 0.5)\n\n const movement = this._currentCursorPosition.y - this._startCursorPosition.y\n\n let size = 1\n\n if (movement < 0) {\n size = 1 / Math.pow(this.scaleFactor, -movement * screenNotches)\n } else if (movement > 0) {\n size = Math.pow(this.scaleFactor, movement * screenNotches)\n }\n\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n const x = this._v3_1.distanceTo(this._gizmos.position)\n let xNew = x / size //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n //check min and max distance\n xNew = MathUtils.clamp(xNew, this.minDistance, this.maxDistance)\n\n const y = x * Math.tan(MathUtils.DEG2RAD * this._fovState * 0.5)\n\n //calculate new fov\n let newFov = MathUtils.RAD2DEG * (Math.atan(y / xNew) * 2)\n\n //check min and max fov\n newFov = MathUtils.clamp(newFov, this.minFov, this.maxFov)\n\n const newDistance = y / Math.tan(MathUtils.DEG2RAD * (newFov / 2))\n size = x / newDistance\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n\n this.setFov(newFov)\n this.applyTransformMatrix(this.applyScale(size, this._v3_2, false))\n\n //adjusting distance\n const direction = this._gizmos.position\n .clone()\n .sub(this.camera.position)\n .normalize()\n .multiplyScalar(newDistance / x)\n this._m4_1.makeTranslation(direction.x, direction.y, direction.z)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n private onTriplePanEnd = (): void => {\n this.updateTbState(STATE.IDLE, false)\n // @ts-ignore\n this.dispatchEvent(_endEvent)\n //this.dispatchEvent( _changeEvent );\n }\n\n /**\n * Set _center's x/y coordinates\n * @param {Number} clientX\n * @param {Number} clientY\n */\n private setCenter = (clientX: number, clientY: number): void => {\n _center.x = clientX\n _center.y = clientY\n }\n\n /**\n * Set default mouse actions\n */\n private initializeMouseActions = (): void => {\n this.setMouseAction('PAN', 0, 'CTRL')\n this.setMouseAction('PAN', 2)\n\n this.setMouseAction('ROTATE', 0)\n\n this.setMouseAction('ZOOM', 'WHEEL')\n this.setMouseAction('ZOOM', 1)\n\n this.setMouseAction('FOV', 'WHEEL', 'SHIFT')\n this.setMouseAction('FOV', 1, 'SHIFT')\n }\n\n /**\n * Set a new mouse action by specifying the operation to be performed and a mouse/key combination. In case of conflict, replaces the existing one\n * @param {String} operation The operation to be performed ('PAN', 'ROTATE', 'ZOOM', 'FOV)\n * @param {*} mouse A mouse button (0, 1, 2) or 'WHEEL' for wheel notches\n * @param {*} key The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed\n * @returns {Boolean} True if the mouse action has been successfully added, false otherwise\n */\n private setMouseAction = (operation: Operation, mouse: MouseButtonType, key: ModifierKey | null = null): boolean => {\n const operationInput = ['PAN', 'ROTATE', 'ZOOM', 'FOV']\n const mouseInput = [0, 1, 2, 'WHEEL']\n const keyInput = ['CTRL', 'SHIFT', null]\n let state\n\n if (!operationInput.includes(operation) || !mouseInput.includes(mouse) || !keyInput.includes(key)) {\n //invalid parameters\n return false\n }\n\n if (mouse == 'WHEEL') {\n if (operation != 'ZOOM' && operation != 'FOV') {\n //cannot associate 2D operation to 1D input\n return false\n }\n }\n\n switch (operation) {\n case 'PAN':\n state = STATE.PAN\n break\n\n case 'ROTATE':\n state = STATE.ROTATE\n break\n\n case 'ZOOM':\n state = STATE.SCALE\n break\n\n case 'FOV':\n state = STATE.FOV\n break\n }\n\n const action = {\n operation: operation,\n mouse: mouse,\n key: key,\n state: state,\n }\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n if (this.mouseActions[i].mouse == action.mouse && this.mouseActions[i].key == action.key) {\n this.mouseActions.splice(i, 1, action)\n return true\n }\n }\n\n this.mouseActions.push(action)\n return true\n }\n\n /**\n * Return the operation associated to a mouse/keyboard combination\n * @param {*} mouse A mouse button (0, 1, 2) or 'WHEEL' for wheel notches\n * @param {*} key The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed\n * @returns The operation if it has been found, null otherwise\n */\n private getOpFromAction = (mouse: MouseButtonType, key: ModifierKey | null): Operation | null => {\n let action\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == key) {\n return action.operation\n }\n }\n\n if (key) {\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == null) {\n return action.operation\n }\n }\n }\n\n return null\n }\n\n /**\n * Get the operation associated to mouse and key combination and returns the corresponding FSA state\n * @param {Number} mouse Mouse button\n * @param {String} key Keyboard modifier\n * @returns The FSA state obtained from the operation associated to mouse/keyboard combination\n */\n private getOpStateFromAction = (mouse: MouseButtonType, key: ModifierKey | null): Symbol | null => {\n let action\n\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == key) {\n return action.state\n }\n }\n\n if (key) {\n for (let i = 0; i < this.mouseActions.length; i++) {\n action = this.mouseActions[i]\n if (action.mouse == mouse && action.key == null) {\n return action.state\n }\n }\n }\n\n return null\n }\n\n /**\n * Calculate the angle between two pointers\n * @param {PointerEvent} p1\n * @param {PointerEvent} p2\n * @returns {Number} The angle between two pointers in degrees\n */\n private getAngle = (p1: PointerEvent, p2: PointerEvent): number => {\n return (Math.atan2(p2.clientY - p1.clientY, p2.clientX - p1.clientX) * 180) / Math.PI\n }\n\n /**\n * Update a PointerEvent inside current pointerevents array\n * @param {PointerEvent} event\n */\n private updateTouchEvent = (event: PointerEvent): void => {\n for (let i = 0; i < this._touchCurrent.length; i++) {\n if (this._touchCurrent[i].pointerId == event.pointerId) {\n this._touchCurrent.splice(i, 1, event)\n break\n }\n }\n }\n\n /**\n * Apply a transformation matrix, to the camera and gizmos\n * @param {Object} transformation Object containing matrices to apply to camera and gizmos\n */\n private applyTransformMatrix(transformation: Transformation | undefined): void {\n if (transformation?.camera && this.camera) {\n this._m4_1.copy(this._cameraMatrixState).premultiply(transformation.camera)\n this._m4_1.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n this.camera.updateMatrix()\n\n //update camera up vector\n if (this._state == STATE.ROTATE || this._state == STATE.ZROTATE || this._state == STATE.ANIMATION_ROTATE) {\n this.camera.up.copy(this._upState).applyQuaternion(this.camera.quaternion)\n }\n }\n\n if (transformation?.gizmos) {\n this._m4_1.copy(this._gizmoMatrixState).premultiply(transformation.gizmos)\n this._m4_1.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n this._gizmos.updateMatrix()\n }\n\n if (\n (this._state == STATE.SCALE || this._state == STATE.FOCUS || this._state == STATE.ANIMATION_FOCUS) &&\n this.camera\n ) {\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n\n if (this.adjustNearFar) {\n const cameraDistance = this.camera.position.distanceTo(this._gizmos.position)\n\n const bb = new Box3()\n bb.setFromObject(this._gizmos)\n const sphere = new Sphere()\n bb.getBoundingSphere(sphere)\n\n const adjustedNearPosition = Math.max(this._nearPos0, sphere.radius + sphere.center.length())\n const regularNearPosition = cameraDistance - this._initialNear\n\n const minNearPos = Math.min(adjustedNearPosition, regularNearPosition)\n this.camera.near = cameraDistance - minNearPos\n\n const adjustedFarPosition = Math.min(this._farPos0, -sphere.radius + sphere.center.length())\n const regularFarPosition = cameraDistance - this._initialFar\n\n const minFarPos = Math.min(adjustedFarPosition, regularFarPosition)\n this.camera.far = cameraDistance - minFarPos\n\n this.camera.updateProjectionMatrix()\n } else {\n let update = false\n\n if (this.camera.near != this._initialNear) {\n this.camera.near = this._initialNear\n update = true\n }\n\n if (this.camera.far != this._initialFar) {\n this.camera.far = this._initialFar\n update = true\n }\n\n if (update) {\n this.camera.updateProjectionMatrix()\n }\n }\n }\n }\n\n /**\n * Calculate the angular speed\n * @param {Number} p0 Position at t0\n * @param {Number} p1 Position at t1\n * @param {Number} t0 Initial time in milliseconds\n * @param {Number} t1 Ending time in milliseconds\n */\n private calculateAngularSpeed = (p0: number, p1: number, t0: number, t1: number): number => {\n const s = p1 - p0\n const t = (t1 - t0) / 1000\n if (t == 0) {\n return 0\n }\n\n return s / t\n }\n\n /**\n * Calculate the distance between two pointers\n * @param {PointerEvent} p0 The first pointer\n * @param {PointerEvent} p1 The second pointer\n * @returns {number} The distance between the two pointers\n */\n private calculatePointersDistance = (p0: PointerEvent, p1: PointerEvent): number => {\n return Math.sqrt(Math.pow(p1.clientX - p0.clientX, 2) + Math.pow(p1.clientY - p0.clientY, 2))\n }\n\n /**\n * Calculate the rotation axis as the vector perpendicular between two vectors\n * @param {Vector3} vec1 The first vector\n * @param {Vector3} vec2 The second vector\n * @returns {Vector3} The normalized rotation axis\n */\n private calculateRotationAxis = (vec1: Vector3, vec2: Vector3): Vector3 => {\n this._rotationMatrix.extractRotation(this._cameraMatrixState)\n this._quat.setFromRotationMatrix(this._rotationMatrix)\n\n this._rotationAxis.crossVectors(vec1, vec2).applyQuaternion(this._quat)\n return this._rotationAxis.normalize().clone()\n }\n\n /**\n * Calculate the trackball radius so that gizmo's diamater will be 2/3 of the minimum side of the camera frustum\n * @param {Camera} camera\n * @returns {Number} The trackball radius\n */\n private calculateTbRadius = (camera: Camera): number | undefined => {\n const factor = 0.67\n const distance = camera.position.distanceTo(this._gizmos.position)\n\n if (camera instanceof PerspectiveCamera) {\n const halfFovV = MathUtils.DEG2RAD * camera.fov * 0.5 //vertical fov/2 in radians\n const halfFovH = Math.atan(camera.aspect * Math.tan(halfFovV)) //horizontal fov/2 in radians\n return Math.tan(Math.min(halfFovV, halfFovH)) * distance * factor\n } else if (camera instanceof OrthographicCamera) {\n return Math.min(camera.top, camera.right) * factor\n }\n }\n\n /**\n * Focus operation consist of positioning the point of interest in front of the camera and a slightly zoom in\n * @param {Vector3} point The point of interest\n * @param {Number} size Scale factor\n * @param {Number} amount Amount of operation to be completed (used for focus animations, default is complete full operation)\n */\n private focus = (point: Vector3, size: number, amount = 1): void => {\n if (this.camera) {\n const focusPoint = point.clone()\n\n //move center of camera (along with gizmos) towards point of interest\n focusPoint.sub(this._gizmos.position).multiplyScalar(amount)\n this._translationMatrix.makeTranslation(focusPoint.x, focusPoint.y, focusPoint.z)\n\n const gizmoStateTemp = this._gizmoMatrixState.clone()\n this._gizmoMatrixState.premultiply(this._translationMatrix)\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n const cameraStateTemp = this._cameraMatrixState.clone()\n this._cameraMatrixState.premultiply(this._translationMatrix)\n this._cameraMatrixState.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n\n //apply zoom\n if (this.enableZoom) {\n this.applyTransformMatrix(this.applyScale(size, this._gizmos.position))\n }\n\n this._gizmoMatrixState.copy(gizmoStateTemp)\n this._cameraMatrixState.copy(cameraStateTemp)\n }\n }\n\n /**\n * Draw a grid and add it to the scene\n */\n private drawGrid = (): void => {\n if (this.scene) {\n const color = 0x888888\n const multiplier = 3\n let size, divisions, maxLength, tick\n\n if (this.camera instanceof OrthographicCamera) {\n const width = this.camera.right - this.camera.left\n const height = this.camera.bottom - this.camera.top\n\n maxLength = Math.max(width, height)\n tick = maxLength / 20\n\n size = (maxLength / this.camera.zoom) * multiplier\n divisions = (size / tick) * this.camera.zoom\n } else if (this.camera instanceof PerspectiveCamera) {\n const distance = this.camera.position.distanceTo(this._gizmos.position)\n const halfFovV = MathUtils.DEG2RAD * this.camera.fov * 0.5\n const halfFovH = Math.atan(this.camera.aspect * Math.tan(halfFovV))\n\n maxLength = Math.tan(Math.max(halfFovV, halfFovH)) * distance * 2\n tick = maxLength / 20\n\n size = maxLength * multiplier\n divisions = size / tick\n }\n\n if (this._grid == null && this.camera) {\n this._grid = new GridHelper(size, divisions, color, color)\n this._grid.position.copy(this._gizmos.position)\n this._gridPosition.copy(this._grid.position)\n this._grid.quaternion.copy(this.camera.quaternion)\n this._grid.rotateX(Math.PI * 0.5)\n\n this.scene.add(this._grid)\n }\n }\n }\n\n public connect = (domElement: HTMLElement): void => {\n // https://github.com/mrdoob/three.js/issues/20575\n\n if ((domElement as any) === document) {\n console.error(\n 'THREE.ArcballControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.',\n )\n }\n this.domElement = domElement\n // disables touch scroll\n // touch-action needs to be defined for pointer events to work on mobile\n // https://stackoverflow.com/a/48254578\n this.domElement.style.touchAction = 'none'\n this.domElement.addEventListener('contextmenu', this.onContextMenu)\n this.domElement.addEventListener('pointerdown', this.onPointerDown)\n this.domElement.addEventListener('pointercancel', this.onPointerCancel)\n this.domElement.addEventListener('wheel', this.onWheel)\n }\n\n /**\n * Remove all listeners, stop animations and clean scene\n */\n public dispose = (): void => {\n if (this._animationId != -1) {\n window.cancelAnimationFrame(this._animationId)\n }\n\n this.domElement?.removeEventListener('pointerdown', this.onPointerDown)\n this.domElement?.removeEventListener('pointercancel', this.onPointerCancel)\n this.domElement?.removeEventListener('wheel', this.onWheel)\n this.domElement?.removeEventListener('contextmenu', this.onContextMenu)\n\n window.removeEventListener('pointermove', this.onPointerMove)\n window.removeEventListener('pointerup', this.onPointerUp)\n\n window.removeEventListener('resize', this.onWindowResize)\n\n this.scene?.remove(this._gizmos)\n this.disposeGrid()\n }\n\n /**\n * remove the grid from the scene\n */\n private disposeGrid = (): void => {\n if (this._grid && this.scene) {\n this.scene.remove(this._grid)\n this._grid = null\n }\n }\n\n /**\n * Compute the easing out cubic function for ease out effect in animation\n * @param {Number} t The absolute progress of the animation in the bound of 0 (beginning of the) and 1 (ending of animation)\n * @returns {Number} Result of easing out cubic at time t\n */\n private easeOutCubic = (t: number): number => {\n return 1 - Math.pow(1 - t, 3)\n }\n\n /**\n * Make rotation gizmos more or less visible\n * @param {Boolean} isActive If true, make gizmos more visible\n */\n private activateGizmos = (isActive: boolean): void => {\n for (const gizmo of this._gizmos.children) {\n ;(gizmo as Mesh<BufferGeometry, Material>).material.setValues({ opacity: isActive ? 1 : 0.6 })\n }\n }\n\n /**\n * Calculate the cursor position in NDC\n * @param {number} x Cursor horizontal coordinate within the canvas\n * @param {number} y Cursor vertical coordinate within the canvas\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @returns {Vector2} Cursor normalized position inside the canvas\n */\n private getCursorNDC = (cursorX: number, cursorY: number, canvas: HTMLElement): Vector2 => {\n const canvasRect = canvas.getBoundingClientRect()\n this._v2_1.setX(((cursorX - canvasRect.left) / canvasRect.width) * 2 - 1)\n this._v2_1.setY(((canvasRect.bottom - cursorY) / canvasRect.height) * 2 - 1)\n return this._v2_1.clone()\n }\n\n /**\n * Calculate the cursor position inside the canvas x/y coordinates with the origin being in the center of the canvas\n * @param {Number} x Cursor horizontal coordinate within the canvas\n * @param {Number} y Cursor vertical coordinate within the canvas\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @returns {Vector2} Cursor position inside the canvas\n */\n private getCursorPosition = (cursorX: number, cursorY: number, canvas: HTMLElement): Vector2 => {\n this._v2_1.copy(this.getCursorNDC(cursorX, cursorY, canvas))\n if (this.camera instanceof OrthographicCamera) {\n this._v2_1.x *= (this.camera.right - this.camera.left) * 0.5\n this._v2_1.y *= (this.camera.top - this.camera.bottom) * 0.5\n }\n return this._v2_1.clone()\n }\n\n /**\n * Set the camera to be controlled\n * @param {Camera} camera The virtual camera to be controlled\n */\n private setCamera = (camera: Camera | null): void => {\n if (camera) {\n camera.lookAt(this.target)\n camera.updateMatrix()\n\n //setting state\n if (camera instanceof PerspectiveCamera) {\n this._fov0 = camera.fov\n this._fovState = camera.fov\n }\n\n this._cameraMatrixState0.copy(camera.matrix)\n this._cameraMatrixState.copy(this._cameraMatrixState0)\n this._cameraProjectionState.copy(camera.projectionMatrix)\n this._zoom0 = camera.zoom\n this._zoomState = this._zoom0\n\n this._initialNear = camera.near\n this._nearPos0 = camera.position.distanceTo(this.target) - camera.near\n this._nearPos = this._initialNear\n\n this._initialFar = camera.far\n this._farPos0 = camera.position.distanceTo(this.target) - camera.far\n this._farPos = this._initialFar\n\n this._up0.copy(camera.up)\n this._upState.copy(camera.up)\n\n this.camera = camera\n\n this.camera.updateProjectionMatrix()\n\n //making gizmos\n const tbRadius = this.calculateTbRadius(camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this.target, this._tbRadius)\n }\n }\n\n /**\n * Set gizmos visibility\n * @param {Boolean} value Value of gizmos visibility\n */\n public setGizmosVisible(value: boolean): void {\n this._gizmos.visible = value\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n /**\n * Creates the rotation gizmos matching trackball center and radius\n * @param {Vector3} tbCenter The trackball center\n * @param {number} tbRadius The trackball radius\n */\n private makeGizmos = (tbCenter: Vector3, tbRadius: number): void => {\n // @ts-ignore\n const curve = new EllipseCurve(0, 0, tbRadius, tbRadius)\n const points = curve.getPoints(this._curvePts)\n\n //geometry\n const curveGeometry = new BufferGeometry().setFromPoints(points)\n\n //material\n const curveMaterialX = new LineBasicMaterial({ color: 0xff8080, fog: false, transparent: true, opacity: 0.6 })\n const curveMaterialY = new LineBasicMaterial({ color: 0x80ff80, fog: false, transparent: true, opacity: 0.6 })\n const curveMaterialZ = new LineBasicMaterial({ color: 0x8080ff, fog: false, transparent: true, opacity: 0.6 })\n\n //line\n const gizmoX = new Line(curveGeometry, curveMaterialX)\n const gizmoY = new Line(curveGeometry, curveMaterialY)\n const gizmoZ = new Line(curveGeometry, curveMaterialZ)\n\n const rotation = Math.PI * 0.5\n gizmoX.rotation.x = rotation\n gizmoY.rotation.y = rotation\n\n //setting state\n this._gizmoMatrixState0.identity().setPosition(tbCenter)\n this._gizmoMatrixState.copy(this._gizmoMatrixState0)\n\n if (this.camera && this.camera.zoom != 1) {\n //adapt gizmos size to camera zoom\n const size = 1 / this.camera.zoom\n this._scaleMatrix.makeScale(size, size, size)\n this._translationMatrix.makeTranslation(-tbCenter.x, -tbCenter.y, -tbCenter.z)\n\n this._gizmoMatrixState.premultiply(this._translationMatrix).premultiply(this._scaleMatrix)\n this._translationMatrix.makeTranslation(tbCenter.x, tbCenter.y, tbCenter.z)\n this._gizmoMatrixState.premultiply(this._translationMatrix)\n }\n\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n this._gizmos.clear()\n\n this._gizmos.add(gizmoX)\n this._gizmos.add(gizmoY)\n this._gizmos.add(gizmoZ)\n }\n\n /**\n * Perform animation for focus operation\n * @param {Number} time Instant in which this function is called as performance.now()\n * @param {Vector3} point Point of interest for focus operation\n * @param {Matrix4} cameraMatrix Camera matrix\n * @param {Matrix4} gizmoMatrix Gizmos matrix\n */\n private onFocusAnim = (time: number, point: Vector3, cameraMatrix: Matrix4, gizmoMatrix: Matrix4): void => {\n if (this._timeStart == -1) {\n //animation start\n this._timeStart = time\n }\n\n if (this._state == STATE.ANIMATION_FOCUS) {\n const deltaTime = time - this._timeStart\n const animTime = deltaTime / this.focusAnimationTime\n\n this._gizmoMatrixState.copy(gizmoMatrix)\n\n if (animTime >= 1) {\n //animation end\n\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n this.focus(point, this.scaleFactor)\n\n this._timeStart = -1\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n } else {\n const amount = this.easeOutCubic(animTime)\n const size = 1 - amount + this.scaleFactor * amount\n\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n this.focus(point, size, amount)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n const self = this\n this._animationId = window.requestAnimationFrame(function (t) {\n self.onFocusAnim(t, point, cameraMatrix, gizmoMatrix.clone())\n })\n }\n } else {\n //interrupt animation\n\n this._animationId = -1\n this._timeStart = -1\n }\n }\n\n /**\n * Perform animation for rotation operation\n * @param {Number} time Instant in which this function is called as performance.now()\n * @param {Vector3} rotationAxis Rotation axis\n * @param {number} w0 Initial angular velocity\n */\n private onRotationAnim = (time: number, rotationAxis: Vector3, w0: number): void => {\n if (this._timeStart == -1) {\n //animation start\n this._anglePrev = 0\n this._angleCurrent = 0\n this._timeStart = time\n }\n\n if (this._state == STATE.ANIMATION_ROTATE) {\n //w = w0 + alpha * t\n const deltaTime = (time - this._timeStart) / 1000\n const w = w0 + -this.dampingFactor * deltaTime\n\n if (w > 0) {\n //tetha = 0.5 * alpha * t^2 + w0 * t + tetha0\n this._angleCurrent = 0.5 * -this.dampingFactor * Math.pow(deltaTime, 2) + w0 * deltaTime + 0\n this.applyTransformMatrix(this.rotate(rotationAxis, this._angleCurrent))\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n const self = this\n this._animationId = window.requestAnimationFrame(function (t) {\n self.onRotationAnim(t, rotationAxis, w0)\n })\n } else {\n this._animationId = -1\n this._timeStart = -1\n\n this.updateTbState(STATE.IDLE, false)\n this.activateGizmos(false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n } else {\n //interrupt animation\n\n this._animationId = -1\n this._timeStart = -1\n\n if (this._state != STATE.ROTATE) {\n this.activateGizmos(false)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n }\n\n /**\n * Perform pan operation moving camera between two points\n * @param {Vector3} p0 Initial point\n * @param {Vector3} p1 Ending point\n * @param {Boolean} adjust If movement should be adjusted considering camera distance (Perspective only)\n */\n private pan = (p0: Vector3, p1: Vector3, adjust = false): Transformation => {\n if (this.camera) {\n const movement = p0.clone().sub(p1)\n\n if (this.camera instanceof OrthographicCamera) {\n //adjust movement amount\n movement.multiplyScalar(1 / this.camera.zoom)\n }\n\n if (this.camera instanceof PerspectiveCamera && adjust) {\n //adjust movement amount\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState0) //camera's initial position\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState0) //gizmo's initial position\n const distanceFactor =\n this._v3_1.distanceTo(this._v3_2) / this.camera.position.distanceTo(this._gizmos.position)\n movement.multiplyScalar(1 / distanceFactor)\n }\n\n this._v3_1.set(movement.x, movement.y, 0).applyQuaternion(this.camera.quaternion)\n\n this._m4_1.makeTranslation(this._v3_1.x, this._v3_1.y, this._v3_1.z)\n\n this.setTransformationMatrices(this._m4_1, this._m4_1)\n }\n return _transformation\n }\n\n /**\n * Reset trackball\n */\n public reset = (): void => {\n if (this.camera) {\n this.camera.zoom = this._zoom0\n\n if (this.camera instanceof PerspectiveCamera) {\n this.camera.fov = this._fov0\n }\n\n this.camera.near = this._nearPos\n this.camera.far = this._farPos\n this._cameraMatrixState.copy(this._cameraMatrixState0)\n this._cameraMatrixState.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n this.camera.up.copy(this._up0)\n\n this.camera.updateMatrix()\n this.camera.updateProjectionMatrix()\n\n this._gizmoMatrixState.copy(this._gizmoMatrixState0)\n this._gizmoMatrixState0.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n this._gizmos.updateMatrix()\n\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this._gizmos.position, this._tbRadius)\n\n this.camera.lookAt(this._gizmos.position)\n\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n\n /**\n * Rotate the camera around an axis passing by trackball's center\n * @param {Vector3} axis Rotation axis\n * @param {number} angle Angle in radians\n * @returns {Object} Object with 'camera' field containing transformation matrix resulting from the operation to be applied to the camera\n */\n private rotate = (axis: Vector3, angle: number): Transformation => {\n const point = this._gizmos.position //rotation center\n this._translationMatrix.makeTranslation(-point.x, -point.y, -point.z)\n this._rotationMatrix.makeRotationAxis(axis, -angle)\n\n //rotate camera\n this._m4_1.makeTranslation(point.x, point.y, point.z)\n this._m4_1.multiply(this._rotationMatrix)\n this._m4_1.multiply(this._translationMatrix)\n\n this.setTransformationMatrices(this._m4_1)\n\n return _transformation\n }\n\n public copyState = (): void => {\n if (this.camera) {\n const state = JSON.stringify(\n this.camera instanceof OrthographicCamera\n ? {\n arcballState: {\n cameraFar: this.camera.far,\n cameraMatrix: this.camera.matrix,\n cameraNear: this.camera.near,\n cameraUp: this.camera.up,\n cameraZoom: this.camera.zoom,\n gizmoMatrix: this._gizmos.matrix,\n },\n }\n : {\n arcballState: {\n cameraFar: this.camera.far,\n cameraFov: this.camera.fov,\n cameraMatrix: this.camera.matrix,\n cameraNear: this.camera.near,\n cameraUp: this.camera.up,\n cameraZoom: this.camera.zoom,\n gizmoMatrix: this._gizmos.matrix,\n },\n },\n )\n\n navigator.clipboard.writeText(state)\n }\n }\n\n public pasteState = (): void => {\n const self = this\n navigator.clipboard.readText().then(function resolved(value) {\n self.setStateFromJSON(value)\n })\n }\n\n /**\n * Save the current state of the control. This can later be recovered with .reset\n */\n public saveState = (): void => {\n if (!this.camera) return\n\n this._cameraMatrixState0.copy(this.camera.matrix)\n this._gizmoMatrixState0.copy(this._gizmos.matrix)\n this._nearPos = this.camera.near\n this._farPos = this.camera.far\n this._zoom0 = this.camera.zoom\n this._up0.copy(this.camera.up)\n\n if (this.camera instanceof PerspectiveCamera) {\n this._fov0 = this.camera.fov\n }\n }\n\n /**\n * Perform uniform scale operation around a given point\n * @param {Number} size Scale factor\n * @param {Vector3} point Point around which scale\n * @param {Boolean} scaleGizmos If gizmos should be scaled (Perspective only)\n * @returns {Object} Object with 'camera' and 'gizmo' fields containing transformation matrices resulting from the operation to be applied to the camera and gizmos\n */\n private applyScale = (size: number, point: Vector3, scaleGizmos = true): Transformation | undefined => {\n if (!this.camera) return\n\n const scalePoint = point.clone()\n let sizeInverse = 1 / size\n\n if (this.camera instanceof OrthographicCamera) {\n //camera zoom\n this.camera.zoom = this._zoomState\n this.camera.zoom *= size\n\n //check min and max zoom\n if (this.camera.zoom > this.maxZoom) {\n this.camera.zoom = this.maxZoom\n sizeInverse = this._zoomState / this.maxZoom\n } else if (this.camera.zoom < this.minZoom) {\n this.camera.zoom = this.minZoom\n sizeInverse = this._zoomState / this.minZoom\n }\n\n this.camera.updateProjectionMatrix()\n\n this._v3_1.setFromMatrixPosition(this._gizmoMatrixState) //gizmos position\n\n //scale gizmos so they appear in the same spot having the same dimension\n this._scaleMatrix.makeScale(sizeInverse, sizeInverse, sizeInverse)\n this._translationMatrix.makeTranslation(-this._v3_1.x, -this._v3_1.y, -this._v3_1.z)\n\n this._m4_2.makeTranslation(this._v3_1.x, this._v3_1.y, this._v3_1.z).multiply(this._scaleMatrix)\n this._m4_2.multiply(this._translationMatrix)\n\n //move camera and gizmos to obtain pinch effect\n scalePoint.sub(this._v3_1)\n\n const amount = scalePoint.clone().multiplyScalar(sizeInverse)\n scalePoint.sub(amount)\n\n this._m4_1.makeTranslation(scalePoint.x, scalePoint.y, scalePoint.z)\n this._m4_2.premultiply(this._m4_1)\n\n this.setTransformationMatrices(this._m4_1, this._m4_2)\n return _transformation\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n this._v3_1.setFromMatrixPosition(this._cameraMatrixState)\n this._v3_2.setFromMatrixPosition(this._gizmoMatrixState)\n\n //move camera\n let distance = this._v3_1.distanceTo(scalePoint)\n let amount = distance - distance * sizeInverse\n\n //check min and max distance\n const newDistance = distance - amount\n if (newDistance < this.minDistance) {\n sizeInverse = this.minDistance / distance\n amount = distance - distance * sizeInverse\n } else if (newDistance > this.maxDistance) {\n sizeInverse = this.maxDistance / distance\n amount = distance - distance * sizeInverse\n }\n\n let direction = scalePoint.clone().sub(this._v3_1).normalize().multiplyScalar(amount)\n\n this._m4_1.makeTranslation(direction.x, direction.y, direction.z)\n\n if (scaleGizmos) {\n //scale gizmos so they appear in the same spot having the same dimension\n const pos = this._v3_2\n\n distance = pos.distanceTo(scalePoint)\n amount = distance - distance * sizeInverse\n direction = scalePoint.clone().sub(this._v3_2).normalize().multiplyScalar(amount)\n\n this._translationMatrix.makeTranslation(pos.x, pos.y, pos.z)\n this._scaleMatrix.makeScale(sizeInverse, sizeInverse, sizeInverse)\n\n this._m4_2.makeTranslation(direction.x, direction.y, direction.z).multiply(this._translationMatrix)\n this._m4_2.multiply(this._scaleMatrix)\n\n this._translationMatrix.makeTranslation(-pos.x, -pos.y, -pos.z)\n\n this._m4_2.multiply(this._translationMatrix)\n this.setTransformationMatrices(this._m4_1, this._m4_2)\n } else {\n this.setTransformationMatrices(this._m4_1)\n }\n\n return _transformation\n }\n }\n\n /**\n * Set camera fov\n * @param {Number} value fov to be setted\n */\n private setFov = (value: number): void => {\n if (this.camera instanceof PerspectiveCamera) {\n this.camera.fov = MathUtils.clamp(value, this.minFov, this.maxFov)\n this.camera.updateProjectionMatrix()\n }\n }\n\n /**\n * Set the trackball's center point\n * @param {Number} x X coordinate\n * @param {Number} y Y coordinate\n * @param {Number} z Z coordinate\n */\n public setTarget = (x: number, y: number, z: number): void => {\n if (this.camera) {\n this.target.set(x, y, z)\n this._gizmos.position.set(x, y, z) //for correct radius calculation\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this.target, this._tbRadius)\n this.camera.lookAt(this.target)\n }\n }\n\n /**\n * Set values in transformation object\n * @param {Matrix4} camera Transformation to be applied to the camera\n * @param {Matrix4} gizmos Transformation to be applied to gizmos\n */\n private setTransformationMatrices(camera: Matrix4 | null = null, gizmos: Matrix4 | null = null): void {\n if (camera) {\n if (_transformation.camera) {\n _transformation.camera.copy(camera)\n } else {\n _transformation.camera = camera.clone()\n }\n } else {\n _transformation.camera = null\n }\n\n if (gizmos) {\n if (_transformation.gizmos) {\n _transformation.gizmos.copy(gizmos)\n } else {\n _transformation.gizmos = gizmos.clone()\n }\n } else {\n _transformation.gizmos = null\n }\n }\n\n /**\n * Rotate camera around its direction axis passing by a given point by a given angle\n * @param {Vector3} point The point where the rotation axis is passing trough\n * @param {Number} angle Angle in radians\n * @returns The computed transormation matix\n */\n private zRotate = (point: Vector3, angle: number): Transformation => {\n this._rotationMatrix.makeRotationAxis(this._rotationAxis, angle)\n this._translationMatrix.makeTranslation(-point.x, -point.y, -point.z)\n\n this._m4_1.makeTranslation(point.x, point.y, point.z)\n this._m4_1.multiply(this._rotationMatrix)\n this._m4_1.multiply(this._translationMatrix)\n\n this._v3_1.setFromMatrixPosition(this._gizmoMatrixState).sub(point) //vector from rotation center to gizmos position\n this._v3_2.copy(this._v3_1).applyAxisAngle(this._rotationAxis, angle) //apply rotation\n this._v3_2.sub(this._v3_1)\n\n this._m4_2.makeTranslation(this._v3_2.x, this._v3_2.y, this._v3_2.z)\n\n this.setTransformationMatrices(this._m4_1, this._m4_2)\n return _transformation\n }\n\n /**\n * Unproject the cursor on the 3D object surface\n * @param {Vector2} cursor Cursor coordinates in NDC\n * @param {Camera} camera Virtual camera\n * @returns {Vector3} The point of intersection with the model, if exist, null otherwise\n */\n private unprojectOnObj = (cursor: Vector2, camera: Camera): Vector3 | null => {\n if (!this.scene) return null\n\n const raycaster = new Raycaster()\n raycaster.near = camera.near\n raycaster.far = camera.far\n raycaster.setFromCamera(cursor, camera)\n\n const intersect = raycaster.intersectObjects(this.scene.children, true)\n for (let i = 0; i < intersect.length; i++) {\n if (intersect[i].object.uuid != this._gizmos.uuid && intersect[i].face) {\n return intersect[i].point.clone()\n }\n }\n\n return null\n }\n\n /**\n * Unproject the cursor on the trackball surface\n * @param {Camera} camera The virtual camera\n * @param {Number} cursorX Cursor horizontal coordinate on screen\n * @param {Number} cursorY Cursor vertical coordinate on screen\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @param {number} tbRadius The trackball radius\n * @returns {Vector3} The unprojected point on the trackball surface\n */\n private unprojectOnTbSurface = (\n camera: Camera,\n cursorX: number,\n cursorY: number,\n canvas: HTMLElement,\n tbRadius: number,\n ): Vector3 | undefined => {\n if (camera instanceof OrthographicCamera) {\n this._v2_1.copy(this.getCursorPosition(cursorX, cursorY, canvas))\n this._v3_1.set(this._v2_1.x, this._v2_1.y, 0)\n\n const x2 = Math.pow(this._v2_1.x, 2)\n const y2 = Math.pow(this._v2_1.y, 2)\n const r2 = Math.pow(this._tbRadius, 2)\n\n if (x2 + y2 <= r2 * 0.5) {\n //intersection with sphere\n this._v3_1.setZ(Math.sqrt(r2 - (x2 + y2)))\n } else {\n //intersection with hyperboloid\n this._v3_1.setZ((r2 * 0.5) / Math.sqrt(x2 + y2))\n }\n\n return this._v3_1\n }\n\n if (camera instanceof PerspectiveCamera) {\n //unproject cursor on the near plane\n this._v2_1.copy(this.getCursorNDC(cursorX, cursorY, canvas))\n\n this._v3_1.set(this._v2_1.x, this._v2_1.y, -1)\n this._v3_1.applyMatrix4(camera.projectionMatrixInverse)\n\n const rayDir = this._v3_1.clone().normalize() //unprojected ray direction\n const cameraGizmoDistance = camera.position.distanceTo(this._gizmos.position)\n const radius2 = Math.pow(tbRadius, 2)\n\n //\t camera\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\th\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t_ _ | _ _ _\\ _ _ near plane\n //\t\t\tl\n\n const h = this._v3_1.z\n const l = Math.sqrt(Math.pow(this._v3_1.x, 2) + Math.pow(this._v3_1.y, 2))\n\n if (l == 0) {\n //ray aligned with camera\n rayDir.set(this._v3_1.x, this._v3_1.y, tbRadius)\n return rayDir\n }\n\n const m = h / l\n const q = cameraGizmoDistance\n\n /*\n * calculate intersection point between unprojected ray and trackball surface\n *|y = m * x + q\n *|x^2 + y^2 = r^2\n *\n * (m^2 + 1) * x^2 + (2 * m * q) * x + q^2 - r^2 = 0\n */\n let a = Math.pow(m, 2) + 1\n let b = 2 * m * q\n let c = Math.pow(q, 2) - radius2\n let delta = Math.pow(b, 2) - 4 * a * c\n\n if (delta >= 0) {\n //intersection with sphere\n this._v2_1.setX((-b - Math.sqrt(delta)) / (2 * a))\n this._v2_1.setY(m * this._v2_1.x + q)\n\n const angle = MathUtils.RAD2DEG * this._v2_1.angle()\n\n if (angle >= 45) {\n //if angle between intersection point and X' axis is >= 45°, return that point\n //otherwise, calculate intersection point with hyperboloid\n\n const rayLength = Math.sqrt(Math.pow(this._v2_1.x, 2) + Math.pow(cameraGizmoDistance - this._v2_1.y, 2))\n rayDir.multiplyScalar(rayLength)\n rayDir.z += cameraGizmoDistance\n return rayDir\n }\n }\n\n //intersection with hyperboloid\n /*\n *|y = m * x + q\n *|y = (1 / x) * (r^2 / 2)\n *\n * m * x^2 + q * x - r^2 / 2 = 0\n */\n\n a = m\n b = q\n c = -radius2 * 0.5\n delta = Math.pow(b, 2) - 4 * a * c\n this._v2_1.setX((-b - Math.sqrt(delta)) / (2 * a))\n this._v2_1.setY(m * this._v2_1.x + q)\n\n const rayLength = Math.sqrt(Math.pow(this._v2_1.x, 2) + Math.pow(cameraGizmoDistance - this._v2_1.y, 2))\n\n rayDir.multiplyScalar(rayLength)\n rayDir.z += cameraGizmoDistance\n return rayDir\n }\n }\n\n /**\n * Unproject the cursor on the plane passing through the center of the trackball orthogonal to the camera\n * @param {Camera} camera The virtual camera\n * @param {Number} cursorX Cursor horizontal coordinate on screen\n * @param {Number} cursorY Cursor vertical coordinate on screen\n * @param {HTMLElement} canvas The canvas where the renderer draws its output\n * @param {Boolean} initialDistance If initial distance between camera and gizmos should be used for calculations instead of current (Perspective only)\n * @returns {Vector3} The unprojected point on the trackball plane\n */\n private unprojectOnTbPlane = (\n camera: Camera,\n cursorX: number,\n cursorY: number,\n canvas: HTMLElement,\n initialDistance = false,\n ): Vector3 | undefined => {\n if (camera instanceof OrthographicCamera) {\n this._v2_1.copy(this.getCursorPosition(cursorX, cursorY, canvas))\n this._v3_1.set(this._v2_1.x, this._v2_1.y, 0)\n\n return this._v3_1.clone()\n }\n\n if (camera instanceof PerspectiveCamera) {\n this._v2_1.copy(this.getCursorNDC(cursorX, cursorY, canvas))\n\n //unproject cursor on the near plane\n this._v3_1.set(this._v2_1.x, this._v2_1.y, -1)\n this._v3_1.applyMatrix4(camera.projectionMatrixInverse)\n\n const rayDir = this._v3_1.clone().normalize() //unprojected ray direction\n\n //\t camera\n //\t\t|\\\n //\t\t| \\\n //\t\t| \\\n //\th\t|\t\\\n //\t\t| \t \\\n //\t\t| \t \\\n //\t_ _ | _ _ _\\ _ _ near plane\n //\t\t\tl\n\n const h = this._v3_1.z\n const l = Math.sqrt(Math.pow(this._v3_1.x, 2) + Math.pow(this._v3_1.y, 2))\n let cameraGizmoDistance\n\n if (initialDistance) {\n cameraGizmoDistance = this._v3_1\n .setFromMatrixPosition(this._cameraMatrixState0)\n .distanceTo(this._v3_2.setFromMatrixPosition(this._gizmoMatrixState0))\n } else {\n cameraGizmoDistance = camera.position.distanceTo(this._gizmos.position)\n }\n\n /*\n * calculate intersection point between unprojected ray and the plane\n *|y = mx + q\n *|y = 0\n *\n * x = -q/m\n */\n if (l == 0) {\n //ray aligned with camera\n rayDir.set(0, 0, 0)\n return rayDir\n }\n\n const m = h / l\n const q = cameraGizmoDistance\n const x = -q / m\n\n const rayLength = Math.sqrt(Math.pow(q, 2) + Math.pow(x, 2))\n rayDir.multiplyScalar(rayLength)\n rayDir.z = 0\n return rayDir\n }\n }\n\n /**\n * Update camera and gizmos state\n */\n private updateMatrixState = (): void => {\n if (!this.camera) return\n\n //update camera and gizmos state\n this._cameraMatrixState.copy(this.camera.matrix)\n this._gizmoMatrixState.copy(this._gizmos.matrix)\n\n if (this.camera instanceof OrthographicCamera) {\n this._cameraProjectionState.copy(this.camera.projectionMatrix)\n this.camera.updateProjectionMatrix()\n this._zoomState = this.camera.zoom\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n this._fovState = this.camera.fov\n }\n }\n\n /**\n * Update the trackball FSA\n * @param {STATE} newState New state of the FSA\n * @param {Boolean} updateMatrices If matriices state should be updated\n */\n private updateTbState = (newState: Symbol, updateMatrices: boolean): void => {\n this._state = newState\n if (updateMatrices) {\n this.updateMatrixState()\n }\n }\n\n public update = (): void => {\n const EPS = 0.000001\n\n // Update target and gizmos state\n if (!this.target.equals(this._currentTarget) && this.camera) {\n this._gizmos.position.set(this.target.x, this.target.y, this.target.z) //for correct radius calculation\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n this.makeGizmos(this.target, this._tbRadius)\n this._currentTarget.copy(this.target)\n }\n\n if (!this.camera) return\n\n //check min/max parameters\n if (this.camera instanceof OrthographicCamera) {\n //check zoom\n if (this.camera.zoom > this.maxZoom || this.camera.zoom < this.minZoom) {\n const newZoom = MathUtils.clamp(this.camera.zoom, this.minZoom, this.maxZoom)\n this.applyTransformMatrix(this.applyScale(newZoom / this.camera.zoom, this._gizmos.position, true))\n }\n }\n\n if (this.camera instanceof PerspectiveCamera) {\n //check distance\n const distance = this.camera.position.distanceTo(this._gizmos.position)\n\n if (distance > this.maxDistance + EPS || distance < this.minDistance - EPS) {\n const newDistance = MathUtils.clamp(distance, this.minDistance, this.maxDistance)\n this.applyTransformMatrix(this.applyScale(newDistance / distance, this._gizmos.position))\n this.updateMatrixState()\n }\n\n //check fov\n if (this.camera.fov < this.minFov || this.camera.fov > this.maxFov) {\n this.camera.fov = MathUtils.clamp(this.camera.fov, this.minFov, this.maxFov)\n this.camera.updateProjectionMatrix()\n }\n\n const oldRadius = this._tbRadius\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n\n if (oldRadius < this._tbRadius - EPS || oldRadius > this._tbRadius + EPS) {\n const scale = (this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z) / 3\n const newRadius = this._tbRadius / scale\n // @ts-ignore\n const curve = new EllipseCurve(0, 0, newRadius, newRadius)\n const points = curve.getPoints(this._curvePts)\n const curveGeometry = new BufferGeometry().setFromPoints(points)\n\n for (const gizmo in this._gizmos.children) {\n const child = this._gizmos.children[gizmo] as Mesh\n child.geometry = curveGeometry\n }\n }\n }\n\n this.camera.lookAt(this._gizmos.position)\n }\n\n private setStateFromJSON = (json: string): void => {\n const state = JSON.parse(json)\n\n if (state.arcballState && this.camera) {\n this._cameraMatrixState.fromArray(state.arcballState.cameraMatrix.elements)\n this._cameraMatrixState.decompose(this.camera.position, this.camera.quaternion, this.camera.scale)\n\n this.camera.up.copy(state.arcballState.cameraUp)\n this.camera.near = state.arcballState.cameraNear\n this.camera.far = state.arcballState.cameraFar\n\n this.camera.zoom = state.arcballState.cameraZoom\n\n if (this.camera instanceof PerspectiveCamera) {\n this.camera.fov = state.arcballState.cameraFov\n }\n\n this._gizmoMatrixState.fromArray(state.arcballState.gizmoMatrix.elements)\n this._gizmoMatrixState.decompose(this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale)\n\n this.camera.updateMatrix()\n this.camera.updateProjectionMatrix()\n\n this._gizmos.updateMatrix()\n\n const tbRadius = this.calculateTbRadius(this.camera)\n if (tbRadius !== undefined) {\n this._tbRadius = tbRadius\n }\n const gizmoTmp = new Matrix4().copy(this._gizmoMatrixState0)\n this.makeGizmos(this._gizmos.position, this._tbRadius)\n this._gizmoMatrixState0.copy(gizmoTmp)\n\n this.camera.lookAt(this._gizmos.position)\n this.updateTbState(STATE.IDLE, false)\n\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n }\n}\n\nexport { ArcballControls }\n"],"names":["Matrix4","EventDispatcher","EllipseCurve","BufferGeometry","OrthographicCamera","PerspectiveCamera","MathUtils","Vector3","GridHelper","LineBasicMaterial","Line","Raycaster","rayLength","Vector2","Quaternion","Group","Box3","Sphere"],"mappings":"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"}