import { Frustum, ICamera, IInteractorService } from '@antv/g-webgpu-core'; import { mat4, vec3 } from 'gl-matrix'; import Landmark from './Landmark'; export declare enum CAMERA_TYPE { ORBITING = "ORBITING", EXPLORING = "EXPLORING", TRACKING = "TRACKING" } export declare enum CAMERA_TRACKING_MODE { DEFAULT = "DEFAULT", ROTATIONAL = "ROTATIONAL", TRANSLATIONAL = "TRANSLATIONAL", CINEMATIC = "CINEMATIC" } export declare enum CAMERA_PROJECTION_MODE { ORTHOGRAPHIC = "ORTHOGRAPHIC", PERSPECTIVE = "PERSPECTIVE" } /** * 参考「WebGL Insights - 23.Designing Cameras for WebGL Applications」,基于 Responsible Camera 思路设计 * 保存相机参数,定义相机动作: * 1. dolly 沿 n 轴移动 * 2. pan 沿 u v 轴移动 * 3. rotate 以方位角旋转 * 4. 移动到 Landmark,具有平滑的动画效果,其间禁止其他用户交互 */ export declare class Camera implements ICamera { static ProjectionMode: { ORTHOGRAPHIC: string; PERSPECTIVE: string; }; /** * 相机矩阵 */ matrix: mat4; /** * u 轴 * @see http://learnwebgl.brown37.net/07_cameras/camera_introduction.html#a-camera-definition */ right: vec3; /** * v 轴 */ up: vec3; /** * n 轴 */ forward: vec3; /** * 相机位置 */ position: vec3; /** * 视点位置 */ focalPoint: vec3; /** * 相机位置到视点向量 * focalPoint - position */ distanceVector: vec3; /** * 相机位置到视点距离 * length(focalPoint - position) */ distance: number; /** * @see https://en.wikipedia.org/wiki/Azimuth */ azimuth: number; elevation: number; roll: number; relAzimuth: number; relElevation: number; relRoll: number; /** * 沿 n 轴移动时,保证移动速度从快到慢 */ dollyingStep: number; maxDistance: number; minDistance: number; /** * invert the horizontal coordinate system HCS */ rotateWorld: boolean; interactor: IInteractorService; /** * 投影矩阵参数 */ /** * field of view [0-360] * @see http://en.wikipedia.org/wiki/Angle_of_view */ private fov; private near; private far; private aspect; private left; private rright; private top; private bottom; private zoom; private perspective; private view; private following; private type; private trackingMode; private projectionMode; /** * for culling use */ private frustum; /** * switch between multiple landmarks */ private landmarks; private landmarkAnimationID; clone(): Camera; getProjectionMode(): CAMERA_PROJECTION_MODE; getPerspective(): mat4; getFrustum(): Frustum; getPosition(): vec3; setType(type: CAMERA_TYPE, trackingMode: CAMERA_TRACKING_MODE | undefined): this; setProjectionMode(projectionMode: CAMERA_PROJECTION_MODE): this; setTrackingMode(trackingMode: CAMERA_TRACKING_MODE): this; /** * If flag is true, it reverses the azimuth and elevation angles. * Subsequent calls to rotate, setAzimuth, setElevation, * changeAzimuth or changeElevation will cause the inverted effect. * setRoll or changeRoll is not affected by this method. * * This inversion is useful when one wants to simulate that the world * is moving, instead of the camera. * * By default the camera angles are not reversed. * @param {Boolean} flag the boolean flag to reverse the angles. */ setWorldRotation(flag: boolean): void; /** * 计算 MV 矩阵,为相机矩阵的逆矩阵 */ getViewTransform(): mat4; getWorldTransform(): mat4; /** * 设置相机矩阵 */ setMatrix(matrix: mat4): this; setAspect(aspect: number): this; /** * Sets an offset in a larger frustum, used in PixelPicking */ setViewOffset(fullWidth: number, fullHeight: number, x: number, y: number, width: number, height: number): this; clearViewOffset(): this; setPerspective(near: number, far: number, fov: number, aspect: number): this; setOrthographic(l: number, r: number, t: number, b: number, near: number, far: number): this; /** * 设置相机位置 */ setPosition(x: number | vec3, y?: number, z?: number): this; /** * 设置视点位置 */ setFocalPoint(x: number | vec3, y?: number, z?: number): this; /** * 固定当前视点,按指定距离放置相机 */ setDistance(d: number): this | undefined; setMaxDistance(d: number): this; setMinDistance(d: number): this; /** * Changes the initial azimuth of the camera */ changeAzimuth(az: number): this; /** * Changes the initial elevation of the camera */ changeElevation(el: number): this; /** * Changes the initial roll of the camera */ changeRoll(rl: number): this; /** * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 * @param {Number} el the azimuth in degrees */ setAzimuth(az: number): this; getAzimuth(): number; /** * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 * @param {Number} el the elevation in degrees */ setElevation(el: number): this; /** * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 * @param {Number} angle the roll angle */ setRoll(angle: number): this; /** * Changes the azimuth and elevation with respect to the current camera axes * @param {Number} azimuth the relative azimuth * @param {Number} elevation the relative elevation * @param {Number} roll the relative roll */ rotate(azimuth: number, elevation: number, roll: number): this | undefined; /** * 沿水平(right) & 垂直(up)平移相机 */ pan(tx: number, ty: number): this; /** * 沿 n 轴移动,当距离视点远时移动速度较快,离视点越近速度越慢 */ dolly(value: number): this; createLandmark(name: string, params: { position: vec3; focalPoint: vec3; roll?: number; }): Landmark; setLandmark(name: string): this; gotoLandmark(name: string, duration?: number): void; /** * 根据相机矩阵重新计算各种相机参数 */ private _update; /** * 计算相机矩阵 */ private computeMatrix; /** * Sets the camera position in the camera matrix */ private _setPosition; /** * Recalculates axes based on the current matrix */ private _getAxes; /** * Recalculates euler angles based on the current state */ private _getAngles; /** * 重新计算相机位置,只有 ORBITING 模式相机位置才会发生变化 */ private _getPosition; /** * 重新计算视点,只有 TRACKING 模式视点才会发生变化 */ private _getFocalPoint; /** * 重新计算视距 */ private _getDistance; }