/** * CADTrackballControls - Extended TrackballControls for CAD applications * * Adds: * - Holroyd (non-tumbling) trackball rotation mode * - rotateX/Y/Z methods for programmatic world-axis rotation * - Quaternion-based saveState/reset * * Internal TrackballControls methods/properties used (see three-augmentation.d.ts): * - _onMouseDown: Replaced to customize modifier key behavior (shift=pan) * - _getMouseOnCircle: Called to convert page coordinates for rotation * - _getMouseOnScreen: Called to convert page coordinates for pan/zoom * - _rotateCamera: Overridden to implement holroyd sphere projection * - _panCamera: Overridden to use quaternion-based camera orientation in holroyd mode * - _zoomCamera: Called for zoom handling * - _moveCurr/_movePrev: Rotation tracking vectors * - _zoomStart/_zoomEnd: Zoom tracking vectors * - _panStart/_panEnd: Pan tracking vectors * - _eye: Camera-to-target vector * - _lastPosition: Change detection * - _target0/_position0/_up0/_zoom0: Saved state for reset * - state/keyState: Current interaction mode tracking * - noRotate/noZoom/noPan: Feature disable flags */ import { TrackballControls } from "three/examples/jsm/controls/TrackballControls.js"; import { Quaternion, Vector2, Vector3, Camera } from "three"; declare class CADTrackballControls extends TrackballControls { holroyd: boolean; radius: number; quaternion0: Quaternion; private _holroydStart; private _holroydEnd; private _holroydActive; private _horizontalRotate; private _verticalRotate; private _holroydPointerDown?; private _holroydPointerMove?; private _holroydPointerUp?; private _holroydWheel?; private _parentOnMouseDown; state: number; keyState: number; _moveCurr: Vector2; _movePrev: Vector2; _zoomStart: Vector2; _zoomEnd: Vector2; _panStart: Vector2; _panEnd: Vector2; _eye: Vector3; _lastPosition: Vector3; _target0: Vector3; _position0: Vector3; _up0: Vector3; _zoom0: number; noRotate: boolean; noZoom: boolean; noPan: boolean; _onMouseDown: (event: MouseEvent) => void; _getMouseOnCircle: (pageX: number, pageY: number) => Vector2; _getMouseOnScreen: (pageX: number, pageY: number) => Vector2; _zoomCamera: () => void; /** * Constructs CAD-enhanced trackball controls. * * @param object - The camera to control. * @param domElement - The HTML element for event listeners. */ constructor(object: Camera, domElement?: HTMLElement | null); /** * Custom mouse down handler to support shift+drag for pan. * When holroyd=false, delegates to parent for pure Three.js behavior. */ private _handleMouseDown; /** * Capture raw pointer coordinates on pointer down for holroyd. * Works for all pointer types (mouse, touch, pen, trackpad). * Also checks modifier keys for rotation axis restriction. */ private _onHolroydPointerDown; /** * Capture raw pointer coordinates on pointer move for holroyd. * Only captures when actively dragging. * Works for all pointer types (mouse, touch, pen, trackpad). */ private _onHolroydPointerMove; /** * Reset holroyd active state and rotation restrictions on pointer up. */ private _onHolroydPointerUp; /** * Handle wheel events for zoom - call update after parent processes wheel. * This enables change-listener mode (non-animation loop) to work for zoom. */ private _onHolroydWheel; /** * Override dispose to clean up our event listeners. */ dispose(): void; /** * Save the current state including quaternion. */ saveState(): void; /** * Reset to saved state including quaternion. */ reset(): void; get target0(): Vector3; get position0(): Vector3; get zoom0(): number; set zoom0(value: number); /** * Project page coordinates onto the holroyd trackball sphere. * Uses the original CameraControls coordinate system: * - NDC x: -1 (left) to +1 (right) * - NDC y: -1 (bottom) to +1 (top) */ private _getMouseOnSphere; /** * Override update to skip lookAt in holroyd mode. * * Standard TrackballControls calls lookAt() which recomputes the quaternion * from position and up. In holroyd mode, we set the quaternion directly, * so lookAt() would destroy the tilted rotation axis effect. * * When holroyd=false, delegates to parent for pure Three.js behavior. */ update(): void; /** * Override rotation to support holroyd mode. * * The key difference from standard TrackballControls: * - Standard: uses delta-based rotation from _moveCurr - _movePrev * - Holroyd: projects absolute positions onto a virtual sphere * * This gives the "grab and rotate" feel where the rotation axis * depends on WHERE you grab, not just HOW you move. */ _rotateCamera(): void; /** * Override pan to use quaternion-based camera orientation in holroyd mode. * * The parent TrackballControls uses this.object.up for pan direction, * but in holroyd mode we rotate via quaternion without updating up. * This calculates pan direction from the camera's actual orientation. */ _panCamera(): void; /** * Rotate camera around world X-axis. */ rotateX(angle: number): void; /** * Rotate camera around world Y-axis. */ rotateY(angle: number): void; /** * Rotate camera around world Z-axis. */ rotateZ(angle: number): void; /** * Internal method to rotate around a world axis. */ private _rotateAroundAxis; } export { CADTrackballControls };