UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

377 lines (376 loc) 13.8 kB
import { Vector3, Scene, PerspectiveCamera, OrthographicCamera } from 'three'; import { EventDispatcher } from './EventDispatcher'; import { StandardControlsEventMap } from './StandardControlsEventMap'; type Camera = OrthographicCamera | PerspectiveCamera; /** * * @param {CamOrthographicCamera | PerspectiveCameraera} camera Virtual camera used in the scene * @param {HTMLElement=null} domElement Renderer's dom element * @param {Scene=null} scene The scene to be rendered */ declare class ArcballControls extends EventDispatcher<StandardControlsEventMap> { private camera; private domElement; private scene; private mouseActions; private _mouseOp; private _v2_1; private _v3_1; private _v3_2; private _m4_1; private _m4_2; private _quat; private _translationMatrix; private _rotationMatrix; private _scaleMatrix; private _rotationAxis; private _cameraMatrixState; private _cameraProjectionState; private _fovState; private _upState; private _zoomState; private _nearPos; private _farPos; private _gizmoMatrixState; private _up0; private _zoom0; private _fov0; private _initialNear; private _nearPos0; private _initialFar; private _farPos0; private _cameraMatrixState0; private _gizmoMatrixState0; private _button; private _touchStart; private _touchCurrent; private _input; private _switchSensibility; private _startFingerDistance; private _currentFingerDistance; private _startFingerRotation; private _currentFingerRotation; private _devPxRatio; private _downValid; private _nclicks; private _downEvents; private _clickStart; private _maxDownTime; private _maxInterval; private _posThreshold; private _movementThreshold; private _currentCursorPosition; private _startCursorPosition; private _grid; private _gridPosition; private _gizmos; private _curvePts; private _timeStart; private _animationId; focusAnimationTime: number; private _timePrev; private _timeCurrent; private _anglePrev; private _angleCurrent; private _cursorPosPrev; private _cursorPosCurr; private _wPrev; private _wCurr; adjustNearFar: boolean; scaleFactor: number; dampingFactor: number; wMax: number; enableAnimations: boolean; enableGrid: boolean; cursorZoom: boolean; minFov: number; maxFov: number; enabled: boolean; enablePan: boolean; enableRotate: boolean; enableZoom: boolean; minDistance: number; maxDistance: number; minZoom: number; maxZoom: number; readonly target: Vector3; private _currentTarget; private _tbRadius; private _state; constructor(camera: Camera | null, domElement?: HTMLElement | null | undefined, scene?: Scene | null | undefined); private onWindowResize; private onContextMenu; private onPointerCancel; private onPointerDown; private onPointerMove; private onPointerUp; private onWheel; private onSinglePanStart; private onSinglePanMove; private onSinglePanEnd; private onDoubleTap; private onDoublePanStart; private onDoublePanMove; private onDoublePanEnd; private onRotateStart; private onRotateMove; private onRotateEnd; private onPinchStart; private onPinchMove; private onPinchEnd; private onTriplePanStart; private onTriplePanMove; private onTriplePanEnd; /** * Set _center's x/y coordinates * @param {Number} clientX * @param {Number} clientY */ private setCenter; /** * Set default mouse actions */ private initializeMouseActions; /** * 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 * @param {String} operation The operation to be performed ('PAN', 'ROTATE', 'ZOOM', 'FOV) * @param {*} mouse A mouse button (0, 1, 2) or 'WHEEL' for wheel notches * @param {*} key The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed * @returns {Boolean} True if the mouse action has been successfully added, false otherwise */ private setMouseAction; /** * Return the operation associated to a mouse/keyboard combination * @param {*} mouse A mouse button (0, 1, 2) or 'WHEEL' for wheel notches * @param {*} key The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed * @returns The operation if it has been found, null otherwise */ private getOpFromAction; /** * Get the operation associated to mouse and key combination and returns the corresponding FSA state * @param {Number} mouse Mouse button * @param {String} key Keyboard modifier * @returns The FSA state obtained from the operation associated to mouse/keyboard combination */ private getOpStateFromAction; /** * Calculate the angle between two pointers * @param {PointerEvent} p1 * @param {PointerEvent} p2 * @returns {Number} The angle between two pointers in degrees */ private getAngle; /** * Update a PointerEvent inside current pointerevents array * @param {PointerEvent} event */ private updateTouchEvent; /** * Apply a transformation matrix, to the camera and gizmos * @param {Object} transformation Object containing matrices to apply to camera and gizmos */ private applyTransformMatrix; /** * Calculate the angular speed * @param {Number} p0 Position at t0 * @param {Number} p1 Position at t1 * @param {Number} t0 Initial time in milliseconds * @param {Number} t1 Ending time in milliseconds */ private calculateAngularSpeed; /** * Calculate the distance between two pointers * @param {PointerEvent} p0 The first pointer * @param {PointerEvent} p1 The second pointer * @returns {number} The distance between the two pointers */ private calculatePointersDistance; /** * Calculate the rotation axis as the vector perpendicular between two vectors * @param {Vector3} vec1 The first vector * @param {Vector3} vec2 The second vector * @returns {Vector3} The normalized rotation axis */ private calculateRotationAxis; /** * Calculate the trackball radius so that gizmo's diamater will be 2/3 of the minimum side of the camera frustum * @param {Camera} camera * @returns {Number} The trackball radius */ private calculateTbRadius; /** * Focus operation consist of positioning the point of interest in front of the camera and a slightly zoom in * @param {Vector3} point The point of interest * @param {Number} size Scale factor * @param {Number} amount Amount of operation to be completed (used for focus animations, default is complete full operation) */ private focus; /** * Draw a grid and add it to the scene */ private drawGrid; connect: (domElement: HTMLElement) => void; /** * Remove all listeners, stop animations and clean scene */ dispose: () => void; /** * remove the grid from the scene */ private disposeGrid; /** * Compute the easing out cubic function for ease out effect in animation * @param {Number} t The absolute progress of the animation in the bound of 0 (beginning of the) and 1 (ending of animation) * @returns {Number} Result of easing out cubic at time t */ private easeOutCubic; /** * Make rotation gizmos more or less visible * @param {Boolean} isActive If true, make gizmos more visible */ private activateGizmos; /** * Calculate the cursor position in NDC * @param {number} x Cursor horizontal coordinate within the canvas * @param {number} y Cursor vertical coordinate within the canvas * @param {HTMLElement} canvas The canvas where the renderer draws its output * @returns {Vector2} Cursor normalized position inside the canvas */ private getCursorNDC; /** * Calculate the cursor position inside the canvas x/y coordinates with the origin being in the center of the canvas * @param {Number} x Cursor horizontal coordinate within the canvas * @param {Number} y Cursor vertical coordinate within the canvas * @param {HTMLElement} canvas The canvas where the renderer draws its output * @returns {Vector2} Cursor position inside the canvas */ private getCursorPosition; /** * Set the camera to be controlled * @param {Camera} camera The virtual camera to be controlled */ private setCamera; /** * Set gizmos visibility * @param {Boolean} value Value of gizmos visibility */ setGizmosVisible(value: boolean): void; /** * Creates the rotation gizmos matching trackball center and radius * @param {Vector3} tbCenter The trackball center * @param {number} tbRadius The trackball radius */ private makeGizmos; /** * Perform animation for focus operation * @param {Number} time Instant in which this function is called as performance.now() * @param {Vector3} point Point of interest for focus operation * @param {Matrix4} cameraMatrix Camera matrix * @param {Matrix4} gizmoMatrix Gizmos matrix */ private onFocusAnim; /** * Perform animation for rotation operation * @param {Number} time Instant in which this function is called as performance.now() * @param {Vector3} rotationAxis Rotation axis * @param {number} w0 Initial angular velocity */ private onRotationAnim; /** * Perform pan operation moving camera between two points * @param {Vector3} p0 Initial point * @param {Vector3} p1 Ending point * @param {Boolean} adjust If movement should be adjusted considering camera distance (Perspective only) */ private pan; /** * Reset trackball */ reset: () => void; /** * Rotate the camera around an axis passing by trackball's center * @param {Vector3} axis Rotation axis * @param {number} angle Angle in radians * @returns {Object} Object with 'camera' field containing transformation matrix resulting from the operation to be applied to the camera */ private rotate; copyState: () => void; pasteState: () => void; /** * Save the current state of the control. This can later be recovered with .reset */ saveState: () => void; /** * Perform uniform scale operation around a given point * @param {Number} size Scale factor * @param {Vector3} point Point around which scale * @param {Boolean} scaleGizmos If gizmos should be scaled (Perspective only) * @returns {Object} Object with 'camera' and 'gizmo' fields containing transformation matrices resulting from the operation to be applied to the camera and gizmos */ private applyScale; /** * Set camera fov * @param {Number} value fov to be setted */ private setFov; /** * Set the trackball's center point * @param {Number} x X coordinate * @param {Number} y Y coordinate * @param {Number} z Z coordinate */ setTarget: (x: number, y: number, z: number) => void; /** * Set values in transformation object * @param {Matrix4} camera Transformation to be applied to the camera * @param {Matrix4} gizmos Transformation to be applied to gizmos */ private setTransformationMatrices; /** * Rotate camera around its direction axis passing by a given point by a given angle * @param {Vector3} point The point where the rotation axis is passing trough * @param {Number} angle Angle in radians * @returns The computed transormation matix */ private zRotate; /** * Unproject the cursor on the 3D object surface * @param {Vector2} cursor Cursor coordinates in NDC * @param {Camera} camera Virtual camera * @returns {Vector3} The point of intersection with the model, if exist, null otherwise */ private unprojectOnObj; /** * Unproject the cursor on the trackball surface * @param {Camera} camera The virtual camera * @param {Number} cursorX Cursor horizontal coordinate on screen * @param {Number} cursorY Cursor vertical coordinate on screen * @param {HTMLElement} canvas The canvas where the renderer draws its output * @param {number} tbRadius The trackball radius * @returns {Vector3} The unprojected point on the trackball surface */ private unprojectOnTbSurface; /** * Unproject the cursor on the plane passing through the center of the trackball orthogonal to the camera * @param {Camera} camera The virtual camera * @param {Number} cursorX Cursor horizontal coordinate on screen * @param {Number} cursorY Cursor vertical coordinate on screen * @param {HTMLElement} canvas The canvas where the renderer draws its output * @param {Boolean} initialDistance If initial distance between camera and gizmos should be used for calculations instead of current (Perspective only) * @returns {Vector3} The unprojected point on the trackball plane */ private unprojectOnTbPlane; /** * Update camera and gizmos state */ private updateMatrixState; /** * Update the trackball FSA * @param {STATE} newState New state of the FSA * @param {Boolean} updateMatrices If matriices state should be updated */ private updateTbState; update: () => void; private setStateFromJSON; } export { ArcballControls };