/**
 * @module viw-webgl-viewer/camera
 */
import { Camera } from './camera';
import { Element3D } from '../../loader/element3d';
import { Selectable } from '../selection';
import * as THREE from 'three';
import { Vim } from '../../loader/vim';
import { CameraSaveState } from './cameraInterface';
export declare abstract class CameraMovement {
    protected _camera: Camera;
    private _savedState;
    private _getBoundingBox;
    constructor(camera: Camera, savedState: CameraSaveState, getBoundingBox: () => THREE.Box3);
    /**
     * Moves the camera by the specified 3D vector.
     * @param {THREE.Vector3} vector - The 3D vector representing the direction and distance of movement.
     */
    abstract move3(vector: THREE.Vector3): void;
    /**
     * Moves the camera in a specified 2D direction within a plane defined by the given axes.
     * @param {THREE.Vector2} vector - The 2D vector representing the direction of movement.
     * @param {'XY' | 'XZ'} axes - The axes defining the plane of movement ('XY' or 'XZ').
     */
    move2(vector: THREE.Vector2, axes: 'XY' | 'XZ'): void;
    /**
     * Moves the camera along a specified axis by a given amount.
     * @param {number} amount - The amount to move the camera.
     * @param {'X' | 'Y' | 'Z'} axis - The axis along which to move the camera ('X', 'Y', or 'Z').
     */
    move1(amount: number, axis: 'X' | 'Y' | 'Z'): void;
    /**
     * Rotates the camera by the specified angles.
     * @param {THREE.Vector2} angle - The 2D vector representing the rotation angles around the X and Y axes.
     */
    abstract rotate(angle: THREE.Vector2): void;
    /**
     * Changes the distance between the camera and its target by a specified factor.
     * @param {number} amount - The factor by which to change the distance (e.g., 0.5 for halving the distance, 2 for doubling the distance).
     */
    abstract zoom(amount: number): void;
    /**
     * Sets the distance between the camera and its target to the specified value.
     * @param {number} dist - The new distance between the camera and its target.
     */
    abstract setDistance(dist: number): void;
    /**
     * Orbits the camera around its target by the given angle while maintaining the distance.
     * @param {THREE.Vector2} vector - The 2D vector representing the orbit angles around the X and Y axes.
     */
    abstract orbit(vector: THREE.Vector2): void;
    /**
     * Orbits the camera around its target to align with the given direction.
     * @param {THREE.Vector3} direction - The direction towards which the camera should be oriented.
     */
    orbitTowards(direction: THREE.Vector3): void;
    /**
     * Rotates the camera without moving so that it looks at the specified target.
     * @param {Element3D | THREE.Vector3} target - The target object or position to look at.
     */
    abstract target(target: Element3D | THREE.Vector3): void;
    /**
     * Resets the camera to its last saved position and orientation.
     */
    reset(): void;
    /**
     * Moves both the camera and its target to the given positions.
     * @param {THREE.Vector3} position - The new position of the camera.
     * @param {THREE.Vector3 | undefined} [target] - The new position of the target (optional).
     */
    abstract set(position: THREE.Vector3, target?: THREE.Vector3): any;
    /**
     * Sets the camera's orientation and position to focus on the specified target.
     * @param {IObject | Vim | THREE.Sphere | THREE.Box3 | 'all' | undefined} target - The target object, or 'all' to frame all objects.
     * @param {THREE.Vector3} [forward] - Optional forward direction after framing.
     */
    frame(target: Selectable | Vim | THREE.Sphere | THREE.Box3 | 'all' | undefined, forward?: THREE.Vector3): Promise<void>;
    protected frameSphere(sphere: THREE.Sphere, forward?: THREE.Vector3): void;
    private getNormalizedDirection;
}
