@soonspacejs/plugin-navigation 2.13.7 → 2.13.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,68 @@
1
+ import { Object3D, Vector3 } from 'three';
2
+ import SoonSpace from 'soonspacejs';
3
+ import { Topology } from 'soonspacejs';
4
+ import { PLAY_STATUS, playInfo } from './types';
5
+ export * from './navigator-nodes';
6
+ export * from './types';
7
+ export * from './utils';
8
+ export declare class Navigator {
9
+ readonly ssp: SoonSpace;
10
+ paths: Topology[];
11
+ onPlay: (info: playInfo) => void;
12
+ onStatusChange: (status: PLAY_STATUS) => void;
13
+ /** 是否循环播放,默认为否 */
14
+ loop: boolean;
15
+ /** 是否自动开始下一段路径播放,默认为是 */
16
+ autoNext: boolean;
17
+ /** 开始或者重新开始后自动播放路径动画,默认为否 */
18
+ playAfterStart: boolean;
19
+ /** 开始时飞向模型,默认为是 */
20
+ flyToModelAfterStart: boolean;
21
+ /** 停止时是否返回起点,默认为是 */
22
+ backStartPointWhenStop: boolean;
23
+ /** 路径动画主体模型 */
24
+ _model: Object3D<import("three").Object3DEventMap>;
25
+ get model(): Object3D;
26
+ set model(obj: Object3D);
27
+ protected _speed: number;
28
+ /** 播放速度 */
29
+ get speed(): number;
30
+ set speed(value: number);
31
+ protected _pathProgress: number;
32
+ /** 当前段进度 */
33
+ get pathProgress(): number;
34
+ set pathProgress(value: number);
35
+ protected _totalProgress: number;
36
+ /** 总进度 */
37
+ get totalProgress(): number;
38
+ set totalProgress(value: number);
39
+ /** 当前播放的动画路径索引 */
40
+ protected _currentPathIndex: number;
41
+ /** 当前节点 */
42
+ protected _currentNode: Vector3 | null;
43
+ /** 下个路径节点 */
44
+ protected _nextNode: Vector3 | null;
45
+ /** 当前状态 */
46
+ protected _playStatus: PLAY_STATUS;
47
+ get currentPath(): Topology;
48
+ /** 对外只读 当前路径索引 */
49
+ get currentPathIndex(): number;
50
+ /** 对外只读 当前朝向方向向量 */
51
+ get currentRotationVector(): Vector3;
52
+ constructor(ssp: SoonSpace, paths: Topology[]);
53
+ protected changeStatus(status: PLAY_STATUS): void;
54
+ /** 开始导航 */
55
+ start(): void;
56
+ /** 重新开始导航 */
57
+ restart(): void;
58
+ /** 播放动画 */
59
+ play(index?: number, node?: Vector3): void;
60
+ /** 暂停动画 */
61
+ pause(): void;
62
+ /** 停止动画 */
63
+ stop(): void;
64
+ /** 路径反转 */
65
+ flip(): void;
66
+ /** 结束导航 */
67
+ over(): void;
68
+ }
@@ -0,0 +1,26 @@
1
+ import type { Node, Topology } from 'soonspacejs';
2
+ import { Direction } from './types';
3
+ interface NavigatorNodeInfo {
4
+ progressArea: [number, number];
5
+ distanceArea: [number, number];
6
+ node: Node;
7
+ nextNode?: Node;
8
+ distanceToNext: number;
9
+ distanceToStart: number;
10
+ distanceToEnd: number;
11
+ frontDirection: Direction;
12
+ }
13
+ interface DistanceInfo {
14
+ distanceToStartNode: number;
15
+ distanceToEndNode: number;
16
+ distanceToStart: number;
17
+ distanceToEnd: number;
18
+ }
19
+ export declare function getDirectionByNodes(p1: Node, p2?: Node, p3?: Node): Direction;
20
+ /** 分析并返回所有节点信息 */
21
+ export declare function getNavigatorNodeInfosByTopology(topology: Topology): NavigatorNodeInfo[];
22
+ /** 根据进度获取当前节点信息 */
23
+ export declare function getNavigatorNodeInfoByProgress(progress: number, infos: NavigatorNodeInfo[]): NavigatorNodeInfo | undefined;
24
+ /** 获取当前位置距离信息 */
25
+ export declare function getDistanceInfoByProgress(progress: number, info?: NavigatorNodeInfo): DistanceInfo;
26
+ export {};
@@ -0,0 +1,23 @@
1
+ import { Vector3 } from 'three';
2
+ export type Direction = 'left' | 'right' | 'up' | 'down' | 'left-up' | 'left-down' | 'right-up' | 'right-down' | 'straight';
3
+ export interface playInfo {
4
+ pathId: string;
5
+ progress: number;
6
+ pathProgress: number;
7
+ distanceToNodeStart: number;
8
+ distanceToPathStart: number;
9
+ distanceToStart: number;
10
+ distanceToNodeEnd: number;
11
+ distanceToPathEnd: number;
12
+ distanceToEnd: number;
13
+ position: Vector3;
14
+ rotation: Vector3;
15
+ direction: Direction;
16
+ }
17
+ export declare enum PLAY_STATUS {
18
+ 'PENDING' = "pending",
19
+ 'STOP' = "stop",
20
+ 'PLAYING' = "playing",
21
+ 'PAUSE' = "pause",
22
+ 'FINISHED' = "finished"
23
+ }
@@ -0,0 +1,12 @@
1
+ import SoonSpace from 'soonspacejs';
2
+ import { Topology } from 'soonspacejs';
3
+ import { Vector3 } from 'three';
4
+ import { Direction } from './types';
5
+ export declare function getDirection(target: Vector3, front: Vector3): Direction;
6
+ /**
7
+ * 路径反转
8
+ * @param ssp
9
+ * @param topologies 路径数组
10
+ * @returns
11
+ */
12
+ export declare function reverseTopologies(ssp: SoonSpace, topologies: Topology[]): Topology[];
@@ -0,0 +1,26 @@
1
+ export declare class GyroListener {
2
+ gyroEvent: null | ((event: DeviceOrientationEvent) => void);
3
+ onChange: (alpha: number | null, beta: number | null, gamma: number | null) => void;
4
+ _isActive: boolean;
5
+ defaultBeta: number | null;
6
+ defaultAlpha: number | null;
7
+ defaultGamma: number | null;
8
+ cache: null | {
9
+ beta: number | null;
10
+ alpha: number | null;
11
+ gamma: number | null;
12
+ };
13
+ beta: number | null;
14
+ alpha: number | null;
15
+ gamma: number | null;
16
+ gyroX: boolean;
17
+ gyroY: boolean;
18
+ gyroZ: boolean;
19
+ absolute: boolean;
20
+ constructor(x?: boolean, y?: boolean, z?: boolean, absolute?: boolean);
21
+ requestPermisson(): Promise<unknown>;
22
+ /** 监听陀螺仪事件 */
23
+ active(): Promise<void>;
24
+ /** 销毁陀螺仪事件 */
25
+ inActive(): void;
26
+ }
@@ -0,0 +1 @@
1
+ export * from './gyro';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@soonspacejs/plugin-navigation",
3
3
  "pluginName": "NavigationPlugin",
4
- "version": "2.13.7",
4
+ "version": "2.13.8",
5
5
  "description": "Navigation plugin for SoonSpace.js",
6
6
  "main": "dist/index.esm.js",
7
7
  "module": "dist/index.esm.js",
@@ -13,9 +13,9 @@
13
13
  ],
14
14
  "author": "zhuojian",
15
15
  "license": "UNLICENSED",
16
- "gitHead": "550040550bf20ec0015982ff1159d0cfe9b35ed3",
16
+ "gitHead": "d6b6f55e087ba0621e8bb404fc63c99fd4389660",
17
17
  "peerDependencies": {
18
- "soonspacejs": "2.13.7"
18
+ "soonspacejs": "2.13.8"
19
19
  },
20
20
  "dependencies": {
21
21
  "@three3d/tools": "^1.6.0"
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/camera/ssp-camera.ts","../src/camera/map-camera.ts","../src/utils/gyro.ts","../src/camera/types.ts","../src/camera/utils.ts","../src/camera/navigate-camera.ts","../src/navigator/types.ts","../../../../node_modules/.pnpm/@three3d+tools@1.9.4_three@0.172.0/node_modules/@three3d/tools/dist/tools.mjs","../src/navigator/utils.ts","../src/navigator/navigator-nodes.ts","../src/navigator/index.ts","../src/azimuth/index.ts"],"sourcesContent":["import { Camera, } from 'three'\r\nimport SoonSpace from 'soonspacejs'\r\n\r\nexport abstract class SoonSpaceCamera<C extends Camera = Camera> {\r\n\r\n protected _isActive = false\r\n\r\n constructor (\r\n\t\tpublic readonly ssp: SoonSpace,\r\n\t\tpublic nativeCamera: C\r\n ) {\r\n\r\n this.ssp.signals.cameraObjectChange.add( () => {\r\n\r\n const currentCamera = this.ssp.viewport.cameraManager\r\n .currentCamera as Camera\r\n\r\n if ( this._isActive && currentCamera === this.nativeCamera ) return\r\n else if ( currentCamera === this.nativeCamera ) {\r\n\r\n this._onBeforeEnter()\r\n this.onEnter()\r\n \r\n } else if ( this._isActive && currentCamera !== this.nativeCamera ) {\r\n\r\n this._onBeforeQuit()\r\n this.onQuit()\r\n \r\n }\r\n \r\n } )\r\n \r\n }\r\n\r\n active () {\r\n\r\n this.ssp.viewport.cameraManager.setCurrentCamera( this.nativeCamera as any )\r\n \r\n }\r\n\r\n private _onBeforeEnter () {\r\n\r\n this._isActive = true\r\n \r\n }\r\n\r\n private _onBeforeQuit () {\r\n\r\n this._isActive = false\r\n \r\n }\r\n\r\n protected onEnter () {}\r\n\r\n protected onQuit () {}\r\n\r\n}\r\n","import { OrthographicCamera, } from 'three'\r\nimport SoonSpace from 'soonspacejs'\r\nimport { SoonSpaceCamera, } from './ssp-camera'\r\n\r\nexport class MapCamera extends SoonSpaceCamera<OrthographicCamera> {\r\n\r\n protected resizeObserver = new ResizeObserver( () => {\r\n\r\n this.resizeCamera()\r\n \r\n } )\r\n\r\n _zoom = 0.01\r\n get zoom () {\r\n\r\n return this._zoom\r\n \r\n }\r\n set zoom ( value: number ) {\r\n\r\n this._zoom = value\r\n this.resizeCamera()\r\n \r\n }\r\n\r\n constructor (\r\n\t\tpublic readonly ssp: SoonSpace\r\n ) {\r\n\r\n const camera = new OrthographicCamera()\r\n\r\n super( ssp, camera )\r\n camera.far = 200000\r\n \r\n }\r\n\r\n resizeCamera () {\r\n\r\n if ( this._isActive ) {\r\n\r\n const { clientWidth: width, clientHeight: height, } =\r\n\t\t\t\tthis.ssp.viewport.renderer.domElement\r\n\r\n const halfWidth = ( width * this.zoom ) / 2\r\n const halfHeight = ( height * this.zoom ) / 2\r\n\r\n this.nativeCamera.left = -halfWidth\r\n this.nativeCamera.right = halfWidth\r\n this.nativeCamera.top = halfHeight\r\n this.nativeCamera.bottom = -halfHeight\r\n this.nativeCamera.updateProjectionMatrix()\r\n \r\n }\r\n \r\n }\r\n\r\n protected onEnter (): void {\r\n\r\n console.log( 'map camera enter' )\r\n if ( !this.ssp.domElement ) return\r\n this.resizeObserver.observe( this.ssp.domElement )\r\n this.resizeCamera()\r\n \r\n }\r\n\r\n protected onQuit (): void {\r\n\r\n if ( !this.ssp.domElement ) return\r\n this.resizeObserver.unobserve( this.ssp.domElement )\r\n console.log( 'map camera quit' )\r\n \r\n }\r\n\r\n}\r\n","export class GyroListener {\r\n\r\n gyroEvent: null | ( ( event: DeviceOrientationEvent ) => void ) = null\r\n\r\n onChange: (\r\n\t\talpha: number | null,\r\n\t\tbeta: number | null,\r\n\t\tgamma: number | null\r\n\t) => void = () => {}\r\n\r\n _isActive = false\r\n\r\n defaultBeta: number | null = null\r\n defaultAlpha: number | null = null\r\n defaultGamma: number | null = null\r\n\r\n cache: null | {\r\n\t\tbeta: number | null;\r\n\t\talpha: number | null;\r\n\t\tgamma: number | null;\r\n\t} = null\r\n\r\n beta: number | null = null\r\n alpha: number | null = null\r\n gamma: number | null = null\r\n\r\n gyroX\r\n gyroY\r\n gyroZ\r\n absolute\r\n\r\n constructor ( x?: boolean, y?: boolean, z?: boolean, absolute?: boolean ) {\r\n\r\n this.gyroX = x ?? true\r\n this.gyroY = y ?? true\r\n this.gyroZ = z ?? true\r\n this.absolute = absolute ?? true\r\n \r\n }\r\n\r\n requestPermisson () {\r\n\r\n return new Promise( ( resolve, reject ) => {\r\n\r\n if ( !( window.DeviceOrientationEvent as any ).requestPermission ) {\r\n\r\n resolve( true )\r\n \r\n }\r\n\r\n ( window.DeviceOrientationEvent as any )\r\n ?.requestPermission()\r\n .then( ( state: 'granted' | 'denied' | 'prompt' ) => {\r\n\r\n if ( state === 'granted' ) {\r\n\r\n //允许\r\n resolve( true )\r\n \r\n } else {\r\n\r\n //拒绝\r\n reject( '用户拒绝使用陀螺仪权限' )\r\n \r\n }\r\n \r\n } )\r\n \r\n } )\r\n \r\n }\r\n\r\n /** 监听陀螺仪事件 */\r\n async active () {\r\n\r\n await this.requestPermisson()\r\n this._isActive = true\r\n if ( this.gyroEvent ) {\r\n\r\n this.inActive()\r\n \r\n }\r\n this.gyroEvent = ( event: DeviceOrientationEvent ) => {\r\n\r\n const { defaultAlpha, defaultBeta, defaultGamma, gyroX, gyroY, gyroZ, } =\r\n\t\t\t\tthis\r\n const { alpha, beta, gamma, } = event\r\n\r\n const resultAlpha = gyroY ? alpha ?? defaultAlpha : defaultAlpha\r\n const resultBeta = gyroX ? beta ?? defaultBeta : defaultBeta\r\n const resultGamma = gyroZ ? gamma ?? defaultGamma : defaultGamma\r\n\r\n if ( this.absolute ) {\r\n\r\n this.alpha = resultAlpha\r\n this.beta = resultBeta\r\n this.gamma = resultGamma\r\n \r\n } else {\r\n\r\n // 计算差值\r\n if ( !this.cache ) {\r\n\r\n this.cache = {\r\n alpha: resultAlpha,\r\n beta: resultBeta,\r\n gamma: resultGamma,\r\n }\r\n \r\n } else {\r\n\r\n const { alpha, beta, gamma, } = this.cache\r\n\r\n this.alpha = resultAlpha === null ? null : alpha === null ? resultAlpha : resultAlpha - alpha\r\n this.beta = resultBeta === null ? null : beta === null ? resultBeta : resultBeta - beta\r\n this.gamma = resultGamma === null ? null : gamma === null ? resultGamma : resultGamma - gamma\r\n \r\n }\r\n \r\n }\r\n\r\n this.onChange( this.alpha, this.beta, this.gamma )\r\n \r\n }\r\n window.addEventListener( 'deviceorientation', this.gyroEvent )\r\n \r\n }\r\n\r\n /** 销毁陀螺仪事件 */\r\n inActive () {\r\n\r\n this._isActive = false\r\n if ( !this.gyroEvent ) return\r\n window.removeEventListener( 'deviceorientation', this.gyroEvent )\r\n this.gyroEvent = null\r\n \r\n }\r\n\r\n}\r\n","import { Euler, EulerOrder, Object3D, Vector3, } from 'three'\r\n\r\nexport type NavigateOrientationTarget = 'main' | Vector3 | Euler | Object3D\r\n\r\nexport enum NAVIGATE_VISION_TYPE {\r\n FIRST_VISION = 'first',\r\n THIRD_VISION = 'third',\r\n UP_VISION = 'up',\r\n LEFT_VISION = 'left',\r\n}\r\n\r\nexport enum NAVIGATE_ORIENTATION_TYPE {\r\n RELATIVE_ORIENTATION = 'relative',\r\n FIXED_ORIENTATION = 'fixed',\r\n GYRO_ORIENTATION = 'gyro',\r\n}\r\n\r\nexport type CameraOppositeType = {\r\n x: boolean;\r\n y: boolean;\r\n z: boolean;\r\n}\r\n\r\nexport type Object3DLike = { position: Vector3; rotation: Euler } & Record<\r\n PropertyKey,\r\n any\r\n>\r\n\r\nexport type VectorArray = [number, number, number]\r\nexport type EulerArray = [number, number, number, EulerOrder?]\r\n\r\nexport type FixVector = VectorArray | ( ( target?: Object3DLike ) => VectorArray )\r\nexport type FixEuler = EulerArray | ( ( target?: Object3DLike ) => EulerArray )\r\n","import { Euler, Matrix4, Quaternion, Vector3, } from 'three'\r\nimport { FixEuler, FixVector, Object3DLike, } from './types'\r\n\r\nexport function Vector3ToEuler ( v: Vector3 ) {\r\n\r\n const matrix = new Matrix4()\r\n const quaternion = new Quaternion()\r\n const euler = new Euler()\r\n\r\n // 将方向向量转换为旋转矩阵\r\n matrix.lookAt( new Vector3(), v, new Vector3( 0, 1, 0 ) )\r\n\r\n // 将旋转矩阵转换为四元数\r\n quaternion.setFromRotationMatrix( matrix )\r\n\r\n // 将四元数转换为欧拉角\r\n euler.setFromQuaternion( quaternion )\r\n\r\n return euler\r\n\r\n}\r\n\r\nexport function eulerToVector3 ( e: Euler ) {\r\n\r\n return new Vector3( 0, 0, -1 ).applyQuaternion(\r\n new Quaternion().setFromEuler( e )\r\n )\r\n\r\n}\r\n\r\n/**\r\n * 欧拉角归一化\r\n * @param e 欧拉角\r\n */\r\nexport function normalizeEuler ( e: Euler ) {\r\n\r\n return eulerToVector3( e ).normalize()\r\n\r\n}\r\n\r\nexport function getFixVector ( v: FixVector, target?: Object3DLike ) {\r\n\r\n return typeof v === 'function' ? v( target ) : v\r\n\r\n}\r\n\r\nexport function getFixEuler ( e: FixEuler, target?: Object3DLike ) {\r\n\r\n return typeof e === 'function' ? e( target ) : e\r\n\r\n}\r\n\r\n","import { Tween, } from 'three/examples/jsm/libs/tween.module.js'\r\nimport SoonSpace from 'soonspacejs'\r\nimport {\r\n Camera,\r\n Euler,\r\n MathUtils,\r\n Object3D,\r\n PerspectiveCamera,\r\n Quaternion,\r\n Vector3,\r\n} from 'three'\r\nimport { GyroListener, } from '../utils/gyro'\r\nimport { SoonSpaceCamera, } from './ssp-camera'\r\nimport {\r\n CameraOppositeType,\r\n EulerArray,\r\n FixEuler,\r\n FixVector,\r\n NAVIGATE_ORIENTATION_TYPE,\r\n NAVIGATE_VISION_TYPE,\r\n NavigateOrientationTarget,\r\n} from './types'\r\nimport {\r\n Vector3ToEuler,\r\n getFixEuler,\r\n getFixVector,\r\n normalizeEuler,\r\n} from './utils'\r\n\r\n/**\r\n * 相机控制回调\r\n *\r\n * camera 当前相机\r\n *\r\n * target 跟踪的目标\r\n */\r\nexport type ControlCallback = (\r\n\tcamera: Camera,\r\n\ttarget: Object3D,\r\n\tevent?: MouseEvent | TouchEvent\r\n) => void\r\n\r\nexport interface NavigateCameraOptions {\r\n\tdisabledAnimate: boolean;\r\n\tfixedOrientation: boolean;\r\n\tautoRestoreOrientation: boolean | number;\r\n\toppositeCamera: boolean;\r\n\toppositeType: CameraOppositeType;\r\n\torientationTarget: NavigateOrientationTarget;\r\n\tvision: NAVIGATE_VISION_TYPE;\r\n\torientationType: NAVIGATE_ORIENTATION_TYPE;\r\n\tdistanceToTarget: number;\r\n\trotationToTarget: Vector3;\r\n\tisFixRotationRelativeTarget: boolean;\r\n\ttargetRotationFix: FixEuler;\r\n\tisFixPositionRelativeTarget: boolean;\r\n\ttargetPositionFix: FixVector;\r\n\tenableGyro: boolean;\r\n\tgyroX: boolean;\r\n\tgyroY: boolean;\r\n\tgyroZ: boolean;\r\n\tgyroAbsolute: boolean;\r\n\tonControlStart: null | ControlCallback;\r\n\tonControlRender: null | ControlCallback;\r\n\tonControlEnd: null | ControlCallback;\r\n}\r\n\r\nconst DEFAULT_NAVIGATE_CAMERA_OPTIONS = Object.freeze( {\r\n disabledAnimate: false,\r\n fixedOrientation: false,\r\n autoRestoreOrientation: 1500,\r\n oppositeCamera: false,\r\n oppositeType: {\r\n x: false,\r\n y: true,\r\n z: false,\r\n },\r\n orientationTarget: 'main',\r\n vision: NAVIGATE_VISION_TYPE.THIRD_VISION,\r\n orientationType: NAVIGATE_ORIENTATION_TYPE.RELATIVE_ORIENTATION,\r\n rotationToTarget: new Vector3( 0, 4, -10 ),\r\n distanceToTarget: 1,\r\n targetRotationFix: [ 0, 0, 0, 'XYZ' ],\r\n isFixRotationRelativeTarget: true,\r\n targetPositionFix: [ 0, 2, 0 ],\r\n isFixPositionRelativeTarget: false,\r\n enableGyro: false,\r\n gyroX: false,\r\n gyroY: true,\r\n gyroZ: false,\r\n gyroAbsolute: true,\r\n onControlStart: null,\r\n onControlRender: null,\r\n onControlEnd: null,\r\n} as NavigateCameraOptions )\r\n\r\nfunction _applyEulerFix ( this: Object3D, fix: EulerArray ) {\r\n\r\n const quaternion = new Quaternion().setFromEuler( new Euler().fromArray( fix ) )\r\n\r\n this.quaternion.multiply( quaternion )\r\n\r\n}\r\n\r\n/** 导航相机 */\r\nexport class NavigateCamera extends SoonSpaceCamera<Camera> {\r\n\r\n initOptions = DEFAULT_NAVIGATE_CAMERA_OPTIONS\r\n\r\n cameraKey = 'navigatorCamera' + ~~( Math.random() * 10000 )\r\n\r\n private _events = {\r\n onRender: () => {},\r\n onMouseDown: ( event: MouseEvent | TouchEvent ) => {},\r\n }\r\n\r\n get position () {\r\n\r\n return this.nativeCamera.position\r\n \r\n }\r\n\r\n get rotation () {\r\n\r\n return this.nativeCamera.rotation\r\n \r\n }\r\n\r\n get quaternion () {\r\n\r\n return this.nativeCamera.quaternion\r\n \r\n }\r\n\r\n private _lookAt ( ...args: [any, any?, any?] ) {\r\n\r\n this.nativeCamera.lookAt( ...args )\r\n\r\n if ( !this.isFixRotationRelativeTarget ) {\r\n\r\n _applyEulerFix.call( this.nativeCamera, this.targetRotationAfterFix )\r\n \r\n }\r\n \r\n }\r\n\r\n private _restoreTimer: NodeJS.Timeout | undefined = void 0\r\n\r\n private _positionTween: Tween<Vector3> | null = null\r\n\r\n private autoFollowRender = true\r\n\r\n /** 相机位置记录用的对象,用于恢复相机位置和朝向使用 */\r\n protected _cameraPlaceholder = new Object3D()\r\n\r\n /** 取消飞向动画 */\r\n disabledAnimate = DEFAULT_NAVIGATE_CAMERA_OPTIONS.disabledAnimate\r\n /** 第三人称相机距离跟踪目标距离 */\r\n distanceToTarget = DEFAULT_NAVIGATE_CAMERA_OPTIONS.distanceToTarget\r\n /** 第三人称相机相对模型视角 */\r\n rotationToTarget = DEFAULT_NAVIGATE_CAMERA_OPTIONS.rotationToTarget\r\n /** 相机反转 */\r\n oppositeCamera = DEFAULT_NAVIGATE_CAMERA_OPTIONS.oppositeCamera\r\n /** 相机反转类型, 默认为 Y 轴对称 */\r\n oppositeType = DEFAULT_NAVIGATE_CAMERA_OPTIONS.oppositeType\r\n\r\n /** 是否相对模型修正角度 */\r\n isFixRotationRelativeTarget =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.isFixRotationRelativeTarget\r\n /**\r\n\t * 目标角度修正\r\n\t *\r\n\t * 支持传入 getter 函数\r\n\t */\r\n targetRotationFix: FixEuler =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.targetRotationFix\r\n\r\n /** 是否相对模型修正偏移 */\r\n isFixPositionRelativeTarget =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.isFixPositionRelativeTarget\r\n /**\r\n\t * 目标位置修正\r\n\t *\r\n\t * 支持传入 getter 函数\r\n\t */\r\n targetPositionFix: FixVector =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.targetPositionFix\r\n /**\r\n\t * 自动恢复朝向\r\n\t *\r\n\t * boolean 是否恢复朝向\r\n\t *\r\n\t * number 间隔多少秒后恢复朝向\r\n\t */\r\n autoRestoreOrientation: boolean | number =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.autoRestoreOrientation\r\n\r\n /** 当控制器控制相机时允许外部自定义控制,控制开始时触发 */\r\n onControlStart: null | ControlCallback = null\r\n /** 当控制器控制相机时允许外部自定义控制,控制进行时回调 */\r\n onControlRender: null | ControlCallback = null\r\n /** 当控制器控制相机时允许外部自定义控制,控制结束时回调 */\r\n onControlEnd: null | ControlCallback = null\r\n\r\n /** 陀螺仪 */\r\n protected _gyroListener!: GyroListener\r\n protected _enableGyro = false\r\n /** 开启 */\r\n get enableGyro () {\r\n\r\n return this._enableGyro\r\n \r\n }\r\n set enableGyro ( value: boolean ) {\r\n\r\n this._enableGyro = value\r\n value ? this._gyroListener.active() : this._gyroListener.inActive()\r\n \r\n }\r\n /** 是否应用陀螺仪 X 轴,默认不启动 */\r\n get gyroX () {\r\n\r\n return this._gyroListener.gyroX\r\n \r\n }\r\n set gyroX ( value: boolean ) {\r\n\r\n this._gyroListener.gyroX = value\r\n \r\n }\r\n\r\n /** 是否应用陀螺仪 Y 轴,默认启动 */\r\n get gyroY () {\r\n\r\n return this._gyroListener.gyroY\r\n \r\n }\r\n set gyroY ( value: boolean ) {\r\n\r\n this._gyroListener.gyroY = value\r\n \r\n }\r\n\r\n /** 是否应用陀螺仪 Z 轴,默认不启动 */\r\n get gyroZ () {\r\n\r\n return this._gyroListener.gyroZ\r\n \r\n }\r\n set gyroZ ( value: boolean ) {\r\n\r\n this._gyroListener.gyroZ = value\r\n \r\n }\r\n\r\n /** 陀螺仪是否使用绝对值,默认使用 */\r\n get gyroAbsolute () {\r\n\r\n return this._gyroListener.absolute\r\n \r\n }\r\n set gyroAbsolute ( value: boolean ) {\r\n\r\n this._gyroListener.absolute = value\r\n \r\n }\r\n\r\n /** 陀螺仪的旋转欧拉角 */\r\n protected _gyroRotation = new Euler()\r\n\r\n get targetRotationAfterFix () {\r\n\r\n return getFixEuler( this.targetRotationFix )\r\n \r\n }\r\n get targetPositionAfterFix () {\r\n\r\n return getFixVector( this.targetPositionFix )\r\n \r\n }\r\n\r\n get realDistanceToTarget () {\r\n\r\n if ( this.vision === 'first' ) return 1\r\n else return this.distanceToTarget\r\n \r\n }\r\n get realRotationToTarget () {\r\n\r\n switch ( this.vision ) {\r\n\r\n case 'first':\r\n return new Vector3( 0, 0, -1 )\r\n case 'up':\r\n return new Vector3( 0, 1, -0.01 )\r\n case 'left':\r\n return new Vector3( 1, 0, 0 )\r\n default:\r\n return this.rotationToTarget\r\n break\r\n \r\n }\r\n \r\n }\r\n\r\n protected _orientationType: NAVIGATE_ORIENTATION_TYPE =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.orientationType\r\n /** 绝对朝向的缓存值 */\r\n private _fixedOrientationRotation = new Euler()\r\n /**\r\n\t * \t相机朝向类型\r\n\t *\r\n\t * NAVIGATE_ORIENTATION_TYPE.RELATIVE_ORIENTATION 相对朝向\r\n\t *\r\n\t * NAVIGATE_ORIENTATION_TYPE.FIXED_ORIENTATION 绝对朝向\r\n\t *\r\n\t * NAVIGATE_ORIENTATION_TYPE.GYRO_ORIENTATION 陀螺仪朝向\r\n\t */\r\n get orientationType () {\r\n\r\n return this._orientationType\r\n \r\n }\r\n set orientationType ( value: NAVIGATE_ORIENTATION_TYPE ) {\r\n\r\n this._orientationType = value\r\n if ( value === NAVIGATE_ORIENTATION_TYPE.GYRO_ORIENTATION ) {\r\n\r\n this._gyroListener.active()\r\n \r\n } else {\r\n\r\n this._gyroListener.inActive()\r\n \r\n }\r\n\r\n if ( value === NAVIGATE_ORIENTATION_TYPE.FIXED_ORIENTATION ) {\r\n\r\n this._fixedOrientationRotation.copy( this.followRotation )\r\n \r\n }\r\n this.restoreOrientation()\r\n \r\n }\r\n\r\n protected _orientationTarget: NavigateOrientationTarget =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.orientationTarget\r\n /**\r\n\t * 相机朝向目标\r\n\t *\r\n\t * “main” 朝向跟踪目标\r\n\t *\r\n\t * Vector3 朝向点\r\n\t *\r\n\t * Object3D 朝向目标对象\r\n\t *\r\n\t * Euler 固定朝向\r\n\t */\r\n get orientationTarget () {\r\n\r\n return this._orientationTarget\r\n \r\n }\r\n set orientationTarget ( value: NavigateOrientationTarget ) {\r\n\r\n this._orientationTarget = value\r\n this.restoreOrientation()\r\n \r\n }\r\n\r\n protected _vision: NAVIGATE_VISION_TYPE =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.vision\r\n /**\r\n\t * 视角配置\r\n\t *\r\n\t * NAVIGATE_VISION_TYPE.FIRST_VISION 第一人称\r\n\t *\r\n\t * NAVIGATE_VISION_TYPE.THIRD_VISION 第三人称\r\n\t *\r\n\t * NAVIGATE_VISION_TYPE.UP_VISION 俯视图\r\n\t *\r\n\t * NAVIGATE_VISION_TYPE.LEFT_VISION 左视图\r\n\t *\r\n\t * 默认为第三人称\r\n\t */\r\n get vision () {\r\n\r\n return this._vision\r\n \r\n }\r\n set vision ( value: NAVIGATE_VISION_TYPE ) {\r\n\r\n this._vision = value\r\n\r\n // 第一视角时,隐藏跟随目标\r\n this.followTarget.visible = value !== NAVIGATE_VISION_TYPE.FIRST_VISION\r\n this.restoreOrientation()\r\n \r\n }\r\n\r\n protected _followTarget: Object3D = new Object3D()\r\n /** 相机跟随目标 */\r\n get followTarget (): Object3D {\r\n\r\n return this._followTarget\r\n \r\n }\r\n set followTarget ( value: Object3D ) {\r\n\r\n this._followTarget = value\r\n this.restoreOrientation()\r\n \r\n }\r\n /** 相机跟踪点(相对跟随目标以及偏移参数获取的点) */\r\n get followPosition () {\r\n\r\n const fixVector = new Vector3()\r\n\r\n fixVector.fromArray( this.targetPositionAfterFix )\r\n if ( this.isFixPositionRelativeTarget ) {\r\n\r\n fixVector.applyEuler( this.followRotation )\r\n \r\n }\r\n return this.followTarget.position.clone().add( fixVector )\r\n \r\n }\r\n /** 跟踪目标的方向(相对跟随目标以及偏移参数获取的朝向) */\r\n get followRotation () {\r\n\r\n const rotation = this.followTarget.rotation\r\n\r\n if ( this.isFixRotationRelativeTarget ) {\r\n\r\n const euler = new Euler().copy( rotation )\r\n\r\n const q1 = new Quaternion().setFromEuler( euler )\r\n\r\n const q2 = new Quaternion().setFromEuler(\r\n new Euler().fromArray( this.targetRotationAfterFix )\r\n )\r\n\r\n q1.multiply( q2 )\r\n\r\n return new Euler().setFromQuaternion( q1 )\r\n \r\n }\r\n\r\n return this.followTarget.rotation\r\n \r\n }\r\n\r\n protected _fixedOrientation =\r\n DEFAULT_NAVIGATE_CAMERA_OPTIONS.fixedOrientation\r\n /** 固定朝向,朝向不受控制器影响 */\r\n get fixedOrientation () {\r\n\r\n return this._fixedOrientation\r\n \r\n }\r\n set fixedOrientation ( value: boolean ) {\r\n\r\n this._fixedOrientation = value\r\n\r\n // 恢复正常朝向\r\n if ( !value ) {\r\n\r\n this.restoreOrientation()\r\n \r\n }\r\n \r\n }\r\n\r\n constructor (\r\n\t\tpublic readonly ssp: SoonSpace,\r\n\t\tcamera?: Camera,\r\n\t\toptions?: Partial<NavigateCameraOptions>\r\n ) {\r\n\r\n const thisCamera = camera ?? new PerspectiveCamera( 80, 1, 0.1, 100 )\r\n\r\n super( ssp, thisCamera )\r\n\r\n this.initGyroListener()\r\n\r\n const initOptions = Object.freeze( {\r\n ...DEFAULT_NAVIGATE_CAMERA_OPTIONS,\r\n ...( options ?? {} ),\r\n } )\r\n\r\n this.initOptions = initOptions\r\n this.setOptions( initOptions )\r\n this.setCamera( thisCamera )\r\n \r\n }\r\n\r\n protected initGyroListener () {\r\n\r\n const initOptions = this.initOptions\r\n\r\n this._gyroListener = new GyroListener(\r\n initOptions.gyroX,\r\n initOptions.gyroY,\r\n initOptions.gyroZ,\r\n initOptions.gyroAbsolute\r\n )\r\n this._gyroListener.onChange = ( a, b, g ) => {\r\n\r\n const adjustedAlpha = a === null ? 0 : MathUtils.degToRad( a )\r\n const adjustedBeta = b === null ? 0 : MathUtils.degToRad( b )\r\n const adjustedGamma = g === null ? 0 : MathUtils.degToRad( g )\r\n\r\n this._gyroRotation = new Euler(\r\n adjustedBeta,\r\n adjustedAlpha,\r\n adjustedGamma\r\n )\r\n \r\n }\r\n \r\n }\r\n\r\n /** 控制器操作时处理 */\r\n protected setCameraOrientationOnControl () {\r\n\r\n const { rotation, } = this.ssp.viewport.cameraManager.mainCamera\r\n\r\n const { realDistanceToTarget, followPosition, } = this\r\n\r\n // 旋转后方向不变,位置变\r\n // 欧拉角转方向向量归一化\r\n const normallizeRotation = normalizeEuler( rotation )\r\n\r\n this.position.copy(\r\n followPosition\r\n .clone()\r\n .add( normallizeRotation.multiplyScalar( -realDistanceToTarget ) )\r\n )\r\n\r\n this._lookAt( this.followPosition )\r\n \r\n }\r\n\r\n /** 更新相机占位符的方位 */\r\n protected updateCameraPlaceholder () {\r\n\r\n const position = this.getRenderCameraPosition()\r\n\r\n this._cameraPlaceholder.position.copy( position )\r\n \r\n }\r\n\r\n /** 设置相机的方位 */\r\n protected setCameraOrientationOnRender () {\r\n\r\n this.position.copy( this._cameraPlaceholder.position )\r\n\r\n this._lookAt( this.followPosition )\r\n \r\n }\r\n\r\n /** 获取相机点相对跟踪点的欧拉角 */\r\n protected getRenderCameraOrientation (): Euler {\r\n\r\n const { _fixedOrientationRotation, _orientationType, _orientationTarget, } =\r\n\t\t\tthis\r\n\r\n const euler = new Euler()\r\n\r\n // 陀螺仪朝向只有一种朝向\r\n if ( _orientationType === NAVIGATE_ORIENTATION_TYPE.GYRO_ORIENTATION ) {\r\n\r\n euler.copy( this._gyroRotation )\r\n \r\n }\r\n switch ( true ) {\r\n\r\n case _orientationTarget === 'main': {\r\n\r\n euler.copy(\r\n _orientationType === NAVIGATE_ORIENTATION_TYPE.FIXED_ORIENTATION ?\r\n _fixedOrientationRotation :\r\n this.followRotation\r\n )\r\n break\r\n \r\n }\r\n case _orientationTarget instanceof Vector3: {\r\n\r\n const rotation = ( this.orientationTarget as Vector3 )\r\n .clone()\r\n .sub( this.followPosition )\r\n\r\n euler.copy( Vector3ToEuler( rotation ) )\r\n\r\n break\r\n \r\n }\r\n case _orientationTarget instanceof Object3D: {\r\n\r\n const obj = _orientationTarget as Object3D\r\n\r\n switch ( _orientationType ) {\r\n\r\n case NAVIGATE_ORIENTATION_TYPE.RELATIVE_ORIENTATION:\r\n euler.copy( obj.rotation )\r\n break\r\n case NAVIGATE_ORIENTATION_TYPE.FIXED_ORIENTATION:\r\n euler.copy(\r\n Vector3ToEuler( obj.position.clone().sub( this.followPosition ) )\r\n )\r\n break\r\n \r\n }\r\n\r\n break\r\n \r\n }\r\n case _orientationTarget instanceof Euler: {\r\n\r\n // 相对朝向方向和固定朝向方向效果是相同的\r\n euler.copy( _orientationTarget as Euler )\r\n\r\n break\r\n \r\n }\r\n \r\n }\r\n\r\n return euler\r\n \r\n }\r\n\r\n /** 获取相机落点(相对跟踪点的方向归一化 * 距离) */\r\n protected getRenderCameraPosition () {\r\n\r\n const position = new Vector3()\r\n\r\n const rotation = this.getRenderCameraOrientation()\r\n\r\n const { realDistanceToTarget, realRotationToTarget, } = this\r\n\r\n position.copy(\r\n this.followPosition\r\n .clone()\r\n .add(\r\n realRotationToTarget\r\n .clone()\r\n .applyEuler( rotation )\r\n .normalize()\r\n .multiplyScalar( realDistanceToTarget )\r\n )\r\n )\r\n\r\n if ( this.oppositeCamera ) {\r\n\r\n const addVector = this.followPosition\r\n .clone()\r\n .sub( position )\r\n .multiplyScalar( 2 )\r\n\r\n const { x, y, z, } = this.oppositeType\r\n\r\n if ( [ x, y, z ].includes( false ) && [ x, y, z ].includes( true ) ) {\r\n\r\n if ( x ) {\r\n\r\n addVector.x = 0\r\n \r\n }\r\n if ( y ) {\r\n\r\n addVector.y = 0\r\n \r\n }\r\n if ( z ) {\r\n\r\n addVector.z = 0\r\n \r\n }\r\n\r\n position.add( addVector )\r\n \r\n } else {\r\n\r\n x && position.add( addVector )\r\n \r\n }\r\n \r\n }\r\n\r\n return position\r\n \r\n }\r\n\r\n protected onRender () {\r\n\r\n if ( !this.followTarget ) return\r\n\r\n this.updateCameraPlaceholder()\r\n\r\n if ( this._positionTween ) return\r\n\r\n if ( this.autoFollowRender || this.fixedOrientation ) {\r\n\r\n this.setCameraOrientationOnRender()\r\n return\r\n \r\n }\r\n if ( this.onControlRender ) {\r\n\r\n this.onControlRender( this.nativeCamera, this.followTarget )\r\n \r\n } else {\r\n\r\n this.setCameraOrientationOnControl()\r\n \r\n }\r\n \r\n }\r\n\r\n /** 初始化事件 */\r\n protected initEvents () {\r\n\r\n const dom = this.ssp.viewport.renderer.domElement\r\n const mainCamera = this.ssp.viewport.cameraManager.mainCamera\r\n const onRender = this.onRender.bind( this )\r\n\r\n const onMouseDown = ( event: MouseEvent | TouchEvent ) => {\r\n\r\n const isControlling = this.autoFollowRender === false\r\n\r\n this.autoFollowRender = false\r\n this._positionTween?.stop()\r\n window.clearTimeout( this._restoreTimer )\r\n document.removeEventListener( 'mouseup', onMouseUp )\r\n document.removeEventListener( 'touchend', onMouseUp )\r\n document.addEventListener( 'mouseup', onMouseUp, true )\r\n document.addEventListener( 'touchend', onMouseUp, true )\r\n\r\n if ( isControlling ) return\r\n\r\n if ( !this.isFixRotationRelativeTarget ) {\r\n\r\n const invertQuaternion = new Quaternion()\r\n .setFromEuler( new Euler().fromArray( this.targetRotationAfterFix ) )\r\n .invert()\r\n\r\n mainCamera.quaternion.copy(\r\n new Quaternion().copy( this.quaternion ).multiply( invertQuaternion )\r\n )\r\n \r\n } else {\r\n\r\n mainCamera.quaternion.copy( this.quaternion )\r\n \r\n }\r\n this.onControlStart?.( this.nativeCamera, this.followTarget, event )\r\n \r\n }\r\n const onMouseUp = ( event: MouseEvent | TouchEvent ) => {\r\n\r\n const exec = () => {\r\n\r\n this.restoreOrientation()\r\n this.autoFollowRender = true\r\n this.onControlEnd?.( this.nativeCamera, this.followTarget, event )\r\n document.removeEventListener( 'mouseup', onMouseUp, true )\r\n document.removeEventListener( 'touchend', onMouseUp, true )\r\n \r\n }\r\n\r\n if ( typeof this.autoRestoreOrientation === 'number' ) {\r\n\r\n window.clearTimeout( this._restoreTimer )\r\n this._restoreTimer = setTimeout( exec, this.autoRestoreOrientation )\r\n \r\n } else if ( this.autoRestoreOrientation ) {\r\n\r\n exec()\r\n \r\n }\r\n \r\n }\r\n\r\n this._events.onRender = onRender\r\n this._events.onMouseDown = onMouseDown\r\n\r\n const signals = this.ssp.signals\r\n\r\n signals.beforeRender.add( onRender )\r\n signals.mouseDown.add( onMouseDown )\r\n // TODO dom 上的 touchstart 被 ssp 内部 preventDefault 了,临时只能取父节点注册事件\r\n dom.parentElement?.addEventListener( 'touchstart', onMouseDown, true )\r\n \r\n }\r\n\r\n /** 清除事件 */\r\n protected clearEvents () {\r\n\r\n const { onRender, onMouseDown, } = this._events\r\n const signals = this.ssp.signals\r\n const dom = this.ssp.viewport.renderer.domElement\r\n\r\n signals.beforeRender.remove( onRender )\r\n signals.mouseDown.remove( onMouseDown )\r\n dom.parentElement?.removeEventListener( 'touchstart', onMouseDown, true )\r\n \r\n }\r\n\r\n protected onEnter (): void {\r\n\r\n console.log( 'onenter' )\r\n this.initEvents()\r\n \r\n }\r\n\r\n protected onQuit () {\r\n\r\n console.log( 'onquit' )\r\n this.clearEvents()\r\n this._gyroListener.inActive()\r\n \r\n }\r\n\r\n /** 参数重置 */\r\n resetOptions () {\r\n\r\n this.setOptions( { ...this.initOptions, } )\r\n \r\n }\r\n\r\n /** 设置参数 */\r\n setOptions ( options: Partial<NavigateCameraOptions> ) {\r\n\r\n const animate = this.disabledAnimate\r\n\r\n this.disabledAnimate = true\r\n if ( options.isFixPositionRelativeTarget !== void 0 ) this.isFixPositionRelativeTarget = options.isFixPositionRelativeTarget\r\n if ( options.targetPositionFix !== void 0 ) this.targetPositionFix = options.targetPositionFix\r\n if ( options.isFixRotationRelativeTarget !== void 0 ) this.isFixRotationRelativeTarget = options.isFixRotationRelativeTarget\r\n if ( options.targetRotationFix !== void 0 ) this.targetRotationFix = options.targetRotationFix\r\n if ( options.rotationToTarget !== void 0 ) this.rotationToTarget = options.rotationToTarget\r\n if ( options.distanceToTarget !== void 0 ) this.distanceToTarget = options.distanceToTarget\r\n if ( options.fixedOrientation !== void 0 ) this.fixedOrientation = options.fixedOrientation\r\n if ( options.oppositeCamera !== void 0 ) this.oppositeCamera = options.oppositeCamera\r\n if ( options.oppositeType !== void 0 ) this.oppositeType = options.oppositeType\r\n if ( options.orientationTarget !== void 0 ) this.orientationTarget = options.orientationTarget\r\n if ( options.orientationType !== void 0 ) this.orientationType = options.orientationType\r\n if ( options.vision !== void 0 ) this.vision = options.vision\r\n if ( options.autoRestoreOrientation !== void 0 ) this.autoRestoreOrientation = options.autoRestoreOrientation\r\n if ( options.gyroX !== void 0 ) this.gyroX = options.gyroX\r\n if ( options.gyroY !== void 0 ) this.gyroY = options.gyroY\r\n if ( options.gyroZ !== void 0 ) this.gyroZ = options.gyroZ\r\n if ( options.gyroAbsolute !== void 0 ) this.gyroAbsolute = options.gyroAbsolute\r\n if ( options.enableGyro !== void 0 ) this.enableGyro = options.enableGyro\r\n if ( options.onControlStart !== void 0 ) this.onControlStart = options.onControlStart\r\n if ( options.onControlRender !== void 0 ) this.onControlRender = options.onControlRender\r\n if ( options.onControlEnd !== void 0 ) this.onControlEnd = options.onControlEnd\r\n this.disabledAnimate = animate\r\n if ( options.disabledAnimate !== void 0 ) this.disabledAnimate = options.disabledAnimate\r\n \r\n }\r\n\r\n /**\r\n\t * 设置相机,若导航相机正在使用中,则会立即切换为设置的相机\r\n\t */\r\n setCamera ( camera: Camera ) {\r\n\r\n if ( this._isActive ) {\r\n\r\n this.ssp.viewport.cameraManager.removeCamera( this.cameraKey )\r\n \r\n }\r\n\r\n this.nativeCamera = camera\r\n\r\n this.ssp.viewport.cameraManager.cameras[ this.cameraKey ] = camera as any\r\n\r\n if ( this._isActive ) {\r\n\r\n this.ssp.viewport.cameraManager.setCurrentCamera( camera as any )\r\n \r\n }\r\n\r\n return this\r\n \r\n }\r\n\r\n /** 重置相机坐标 */\r\n restoreOrientation () {\r\n\r\n if ( !this.followTarget ) return\r\n\r\n if ( this.fixedOrientation ) return\r\n\r\n if ( this._positionTween ) {\r\n\r\n this._positionTween.stop()\r\n this._positionTween = null\r\n \r\n }\r\n\r\n if ( this.disabledAnimate ) {\r\n\r\n this.position.copy( this._cameraPlaceholder.position )\r\n this._lookAt( this.followPosition )\r\n return\r\n \r\n }\r\n\r\n this.ssp\r\n .animation<Vector3>(\r\n this.position,\r\n this._cameraPlaceholder.position,\r\n { duration: 1000, },\r\n ( tp ) => {\r\n\r\n this._lookAt( this.followPosition )\r\n \r\n },\r\n ( tween ) => ( this._positionTween = tween )\r\n )\r\n .finally( () => {\r\n\r\n this._positionTween = null\r\n \r\n } )\r\n \r\n }\r\n\r\n}\r\n","import { Vector3, } from 'three'\r\n\r\nexport type Direction =\r\n\t| 'left'\r\n\t| 'right'\r\n\t| 'up'\r\n\t| 'down'\r\n\t| 'left-up'\r\n\t| 'left-down'\r\n\t| 'right-up'\r\n\t| 'right-down'\r\n\t| 'straight'\r\n\r\nexport interface playInfo {\r\n\tpathId: string;\r\n\tprogress: number;\r\n\tpathProgress: number;\r\n\tdistanceToNodeStart: number;\r\n\tdistanceToPathStart: number;\r\n\tdistanceToStart: number;\r\n\tdistanceToNodeEnd: number;\r\n\tdistanceToPathEnd: number;\r\n\tdistanceToEnd: number;\r\n\tposition: Vector3;\r\n\trotation: Vector3;\r\n\tdirection: Direction;\r\n}\r\n\r\nexport enum PLAY_STATUS {\r\n\t'PENDING' = 'pending',\r\n\t'STOP' = 'stop',\r\n\t'PLAYING' = 'playing',\r\n\t'PAUSE' = 'pause',\r\n\t'FINISHED' = 'finished',\r\n}\r\n","var zt = Object.defineProperty;\nvar Ut = (t, n, e) => n in t ? zt(t, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[n] = e;\nvar j = (t, n, e) => (Ut(t, typeof n != \"symbol\" ? n + \"\" : n, e), e);\nimport { LineCurve3 as K, LineCurve as $, CurvePath as Ot, Vector4 as St, Vector3 as w, Vector2 as z, Matrix3 as ft, Quaternion as S, TextureLoader as qt, Texture as Rt, AlphaFormat as Nt, RedFormat as kt, RedIntegerFormat as jt, RGFormat as Qt, RGIntegerFormat as Ft, RGBAFormat as Wt, RGBAIntegerFormat as Et, LuminanceFormat as Gt, LuminanceAlphaFormat as Xt, DepthFormat as Yt, DepthStencilFormat as Zt, Line3 as Ht, MathUtils as Jt, Color as Q, BufferGeometry as Kt, Float32BufferAttribute as wt, LineBasicMaterial as $t, Line as vt, MirroredRepeatWrapping as xt, ClampToEdgeWrapping as Ct, RepeatWrapping as At } from \"three\";\nimport { isBaseType as tn, isIterable as nn } from \"type-tls\";\nimport { Axis as Ie, Axis4 as Me } from \"type-tls\";\nimport { createLinearGradientImageData as en, getData3DSlice as on, getData3DItemSafe as sn } from \"image-tls\";\nfunction cn(t) {\n const n = t.curves[0].getPoint(0), e = t.curves[t.curves.length - 1].getPoint(1);\n if (!n.equals(e)) {\n const o = n.isVector3 && e.isVector3 ? K : $;\n t.curves.push(new o(e, n));\n }\n return t;\n}\nfunction kn() {\n Ot.prototype.closePath = function() {\n cn(this);\n };\n}\nfunction Pt(t) {\n return t.w !== void 0 ? [St, 4] : t.z !== void 0 ? [w, 3] : [z, 2];\n}\nfunction rn(t) {\n return t.w != null ? new St().copy(t) : t.z != null ? new w().copy(t) : new z().copy(t);\n}\nfunction H(t, n, e) {\n e = e ?? 0;\n const o = e + 1;\n if (tn(t))\n return t;\n if (t.x != null && t.y != null)\n return rn(t);\n if (Array.isArray(t))\n return t.map((c) => H(c, n, o));\n if (t instanceof Map) {\n const c = /* @__PURE__ */ new Map();\n for (const r of t.keys()) {\n const i = t.get(r), l = H(i, n, o);\n c.set(r, l);\n }\n return c;\n }\n if (nn(t)) {\n const c = [];\n for (const r of t) {\n const i = H(r, n, o);\n c.push(i);\n }\n return c;\n }\n if ((n || e === 0) && typeof t == \"object\") {\n const c = {};\n for (const r of Object.keys(t))\n c[r] = H(t[r], n, o);\n return c;\n }\n return t;\n}\nfunction X(t, n, e, o) {\n const s = (o == null ? void 0 : o.copy(t)) || t.clone();\n return s.cross(n), s.lengthSq() === 0 && (e ? Math.abs(n.z) === 1 ? t.x -= 1e-4 : t.z += 1e-4 : Math.abs(t.x) === 1 ? n.z -= 1e-4 : n.x += 1e-4, n.normalize(), s.crossVectors(t, n)), e ? t.copy(n).cross(s) : n.copy(s).cross(t), s.normalize(), n.normalize(), t.normalize(), { tangent: t, normal: n, binormal: s };\n}\nfunction ln(t, n, e, o) {\n const { binormal: s } = X(t, n, e, o);\n return s.negate(), { front: t, up: n, binormal: s };\n}\nfunction jn(t) {\n const { tangent: n, normal: e, binormal: o } = t;\n return { front: n, up: e, binormal: o.clone().negate() };\n}\nfunction Qn(t) {\n const { front: n, up: e, binormal: o } = t;\n return { tangent: n, normal: e, binormal: o.clone().negate() };\n}\nfunction Fn(t, n, e, o) {\n const { front: s, up: c, binormal: r } = ln(t.clone().normalize(), n.clone().normalize(), e), i = o ?? new ft(), l = i.elements;\n return r.toArray(l, 0), c.toArray(l, 3), s.toArray(l, 6), i;\n}\nfunction Wn(t, n, e, o) {\n const s = t.clone().projectOnPlane(e).normalize(), c = n.clone().projectOnPlane(e).normalize();\n return o = o ?? new S(), o.setFromUnitVectors(s, c), o;\n}\nfunction T(t, n) {\n const e = n.toArray(), o = e.findIndex((s) => s !== 0);\n return e[o] / t.toArray()[o];\n}\nfunction at(t, n) {\n const e = t.clone().cross(n);\n return typeof e == \"number\" ? e === 0 : e.lengthSq() === 0;\n}\nfunction En(t) {\n const n = t.length, e = [];\n if (n === 0)\n return e;\n const [o, s] = Pt(t[0]);\n for (let c = 0; c < n; c++) {\n const r = t[c], i = new o().copy(r), l = r.radius, u = e[c] ?? (e[c] = []);\n for (let a = c + 1; a < n; a++) {\n const f = t[a];\n i.distanceToSquared(f) <= (f.radius + l) ** 2 && (u.push(a), (e[a] = []).push(c));\n }\n }\n return e;\n}\nlet Tt;\nfunction Gn(t) {\n if (typeof t == \"string\")\n return (Tt || (Tt = new qt())).load(t);\n if (t.isTexture)\n return t;\n const n = Array.isArray(t) ? en(t, 256, 1) : t, e = new Rt(n);\n return n.colorSpace === \"srgb\" && (e.colorSpace = \"srgb\"), e.needsUpdate = !0, e;\n}\nfunction an(t, n) {\n const e = Math.sqrt(t.lengthSq() * n.lengthSq());\n if (e === 0)\n return 0;\n let o = t.dot(n) / e;\n return o = Math.max(-1, Math.min(1, o)), Math.acos(o);\n}\nfunction J(t, n, e) {\n let o = an(t, n);\n return o === 0 ? o : t.clone().cross(n).dot(e) < 0 ? -o : o;\n}\nfunction un(t, n, e) {\n return t = t.clone().projectOnPlane(e), n = n.clone().projectOnPlane(e), J(t, n, e);\n}\nfunction fn(t, n, e) {\n const o = n.clone().negate(), s = e.clone().projectOnPlane(n), c = t.clone().projectOnPlane(s), r = J(n, c, s), i = n.clone().cross(s), l = t.clone().projectOnPlane(i), u = J(n, l, i), a = t.clone().projectOnPlane(o), f = J(s, a, o);\n return { yaw: r, pitch: u, roll: f };\n}\nconst it = 180 / Math.PI, ut = {\n yaw: [\n { name: \"前\", range: [-15, 15] },\n { name: \"左\", range: [15, 165] },\n { name: \"右\", range: [-165, -15] },\n { name: \"后\", range: [-180.1, -165] },\n { name: \"后\", range: [165, 180.1] }\n ],\n pitch: [\n { name: \"前\", range: [-15, 15] },\n { name: \"上\", range: [15, 165] },\n { name: \"下\", range: [-165, -15] },\n { name: \"后\", range: [-180.1, -165] },\n { name: \"后\", range: [165, 180.1] }\n ],\n roll: [\n { name: \"上\", range: [-15, 15] },\n { name: \"左\", range: [15, 165] },\n { name: \"右\", range: [-165, -15] },\n { name: \"下\", range: [-180.1, -165] },\n { name: \"下\", range: [165, 180.1] }\n ]\n};\nfunction pn(t) {\n const n = {};\n for (const [e, o] of Object.entries(t))\n n[e] = Array.isArray(o) ? o : Object.entries(o).map(([s, c]) => ({ name: s, range: c }));\n return n;\n}\nconst lt = {\n degrees: !0,\n map: ut,\n front: { x: 0, y: 0, z: 1 },\n up: { x: 0, y: 1, z: 0 }\n};\nclass It {\n constructor(n) {\n j(this, \"_options\");\n j(this, \"_listMap\");\n j(this, \"_front\");\n j(this, \"_up\");\n n && (this.options = n);\n }\n static get options() {\n return this._options ?? (this.options = lt);\n }\n static set options(n) {\n this._options = Object.assign({}, structuredClone(ut), n);\n }\n /**\n * 默认选项\n */\n get defaultOptions() {\n return this.constructor.options;\n }\n get options() {\n return this._options ?? (this.options = this.defaultOptions);\n }\n set options(n) {\n this._options = Object.assign({}, structuredClone(this.defaultOptions), n), this._listMap = null, this._front = null, this._up = null;\n }\n /**\n * 是否使用角度,而非弧度\n */\n get degrees() {\n return this.options.degrees ?? (this.options.degrees = this.defaultOptions.degrees ?? !0);\n }\n set degrees(n) {\n this.options.degrees = n;\n }\n get map() {\n return this.options.map || (this.map = this.defaultOptions.map), this.options.map;\n }\n set map(n) {\n const e = structuredClone(this.defaultOptions.map), o = structuredClone(ut);\n n = n ? {\n yaw: n.yaw ?? e.yaw ?? o.yaw,\n pitch: n.pitch ?? e.pitch ?? o.pitch,\n roll: n.roll ?? e.roll ?? o.roll\n } : e, this.options.map = n, this._listMap = null;\n }\n get listMap() {\n return this._listMap ?? (this._listMap = pn(this.map ?? {}));\n }\n get front() {\n return this._front || (this.front = this.options.front ?? this.defaultOptions.front ?? lt.front), this._front;\n }\n set front(n) {\n this._front = new w().copy(n);\n }\n get up() {\n return this._up || (this.up = this.options.up ?? this.defaultOptions.up ?? lt.up), this._up;\n }\n set up(n) {\n this._up = new w().copy(n);\n }\n /**\n * 计算方位\n * @param target \n * @param front \n * @param up \n */\n computeAzimuth(n, e, o) {\n const s = new w().copy(n), c = new w().copy(e ?? this.front), r = new w().copy(o ?? this.up);\n let { yaw: i, pitch: l, roll: u } = fn(s, c, r);\n return this.degrees && (i *= it, l *= it, u *= it), {\n yaw: {\n angle: i,\n name: this.findAzimuthNames(\"yaw\", i)\n },\n pitch: {\n angle: l,\n name: this.findAzimuthNames(\"pitch\", l)\n },\n roll: {\n angle: u,\n name: this.findAzimuthNames(\"roll\", u)\n }\n };\n }\n /**\n * 查找匹配的方位名字\n * @param type - 类型\n * @param angle - 角度\n * @returns 匹配的名字列表\n */\n findAzimuthNames(n, e) {\n const o = [], s = this.listMap[n];\n if (!s)\n return o;\n for (const { name: c, range: [r, i] } of s)\n (e >= r && e < i || e <= r && e > i) && o.push(c);\n return o;\n }\n}\nj(It, \"_options\");\nconst Xn = new It(), mn = {\n [Nt]: 1,\n [kt]: 1,\n [jt]: 1,\n [Qt]: 3,\n [Ft]: 2,\n [Wt]: 4,\n [Et]: 4,\n [Gt]: 1,\n [Xt]: 2,\n [Yt]: 1,\n [Zt]: 2\n};\nfunction Mt(t) {\n return mn[t];\n}\nfunction Yn(t, n, e) {\n const { data: o, width: s, height: c, depth: r } = t.image, i = Mt(t.format);\n return on({ data: o, size: { x: s, y: c, z: r } }, n, e, i);\n}\nfunction Zn(t, n) {\n const { data: e, width: o, height: s, depth: c } = t.image, r = Mt(t.format);\n return sn({ data: e, size: { x: o, y: s, z: c } }, n, r);\n}\nvar h = /* @__PURE__ */ ((t) => (t.Dissociation = \"相离\", t.Intersect = \"相交\", t.Tangency = \"相切\", t.Contain = \"包含\", t))(h || {});\nfunction Hn(t, n) {\n const [e, o] = t, { center: s, radius: c } = n, r = o.clone().sub(e), i = s.clone().sub(e), l = r.lengthSq(), u = r.dot(i) ** 2, a = l * (i.lengthSq() - c ** 2), f = u - a;\n return f < 0 ? h.Dissociation : f === 0 ? h.Tangency : h.Intersect;\n}\nfunction Y(t, n) {\n const [e, o] = t, { center: s, radius: c } = n, r = o.clone().sub(e), i = e.clone().sub(s), l = r.lengthSq(), u = 2 * r.dot(i), a = i.lengthSq() - c ** 2, f = u ** 2 - 4 * l * a;\n if (f < 0)\n return [];\n const p = l * 2, m = -u / p;\n if (f === 0)\n return [m];\n const d = Math.sqrt(f) / p, y = m - d, b = m + d;\n return [y, b];\n}\nfunction Jn(t, n) {\n const [e, o] = t, s = o.clone().sub(e);\n return Y(t, n).map((r) => s.clone().multiplyScalar(r).add(e));\n}\nfunction hn(t, n) {\n const e = Y(t, n), o = e.length;\n if (o === 0)\n return h.Dissociation;\n let s = 0, c = 0, r = 0;\n for (const l of e)\n l < 0 ? s++ : l > 1 ? c++ : (l === 0 || l === 1) && r++;\n const i = s + c;\n return o === 1 && i === 0 ? h.Tangency : s === 1 && c === 1 || r === 2 ? h.Contain : s === 2 || c === 2 ? h.Dissociation : h.Intersect;\n}\nfunction gn(t, n) {\n const [e, o] = t, s = o.clone().sub(e), c = Y(t, n), r = [];\n for (const i of c) {\n if (i < 0 || i > 1)\n continue;\n const l = s.clone().multiplyScalar(i).add(e);\n r.push(l);\n }\n return r;\n}\nfunction Kn(t, n) {\n const e = Y(t, n), o = e.length;\n if (o === 0)\n return h.Dissociation;\n let s = 0;\n for (const c of e)\n c < 0 && s++;\n return o === 1 && s === 0 ? h.Tangency : s === 2 ? h.Dissociation : h.Intersect;\n}\nfunction $n(t, n) {\n const [e, o] = t, s = o.clone().sub(e), c = Y(t, n), r = [];\n for (const i of c) {\n if (i < 0)\n continue;\n const l = s.clone().multiplyScalar(i).add(e);\n r.push(l);\n }\n return r;\n}\nfunction Bt(t, n) {\n const [e, o] = t, s = o.clone().sub(e), [c, r] = n, i = r.clone().sub(c);\n if (at(i, s)) {\n const l = c.clone().sub(e);\n return at(l, s) ? h.Tangency : h.Dissociation;\n }\n return h.Intersect;\n}\nfunction v(t, n) {\n const [e, o] = t, s = o.clone().sub(e), [c, r] = n, i = r.clone().sub(c), l = s.clone().cross(i), [u, a] = Pt(e);\n if (a === 2 ? l === 0 : l.equals(new u()))\n return null;\n const m = c.clone().sub(e).cross(i), g = a === 2 ? m / l : T(l, m);\n return s.clone().multiplyScalar(g).add(e);\n}\nfunction dn(t, n) {\n const [e, o] = n, [s, c] = t, r = c.clone().sub(s), i = Bt(t, n);\n if (i === h.Tangency) {\n let p = 0;\n return T(r, e.clone().sub(s)) < 0 && p++, T(r, o.clone().sub(s)) < 0 && p++, p === 2 ? h.Dissociation : p === 0 ? h.Contain : h.Tangency;\n }\n if (i !== h.Intersect)\n return i;\n const l = v(t, n), u = o.clone().sub(e), a = T(u, l.clone().sub(e));\n return a < 0 || a > 1 || T(r, l.clone().sub(s)) < 0 ? h.Dissociation : h.Intersect;\n}\nfunction yn(t, n) {\n const e = v(t, n);\n if (e === null)\n return null;\n const [o, s] = n, c = s.clone().sub(o), r = T(c, e.clone().sub(o));\n if (r < 0 || r > 1)\n return null;\n const [i, l] = t, u = l.clone().sub(i);\n return T(u, e.clone().sub(i)) < 0 ? null : e;\n}\nfunction vn(t, n) {\n const [e, o] = t, [s, c] = n, r = o.clone().sub(e), i = Bt(t, n);\n if (i === h.Tangency) {\n let p = 0, m = 0;\n const g = T(r, s.clone().sub(e));\n g < 0 ? p++ : g > 1 && m++;\n const d = T(r, c.clone().sub(e));\n return d < 0 ? p++ : d > 1 && m++, p === 2 || m === 2 ? h.Dissociation : p + m === 1 ? h.Tangency : h.Contain;\n }\n if (i !== h.Intersect)\n return i;\n const l = v(t, n), u = c.clone().sub(s), a = T(u, l.clone().sub(s));\n if (a < 0 || a > 1)\n return h.Dissociation;\n const f = T(r, l.clone().sub(e));\n return f < 0 || f > 1 ? h.Dissociation : h.Intersect;\n}\nfunction te(t, n) {\n const e = v(t, n);\n if (e === null)\n return null;\n const [o, s] = n, c = s.clone().sub(o), r = T(c, e.clone().sub(o));\n if (r < 0 || r > 1)\n return null;\n const [i, l] = t, u = l.clone().sub(i), a = T(u, e.clone().sub(i));\n return a < 0 || a > 1 ? null : e;\n}\nfunction bn(t, n) {\n const [e, o] = t, s = n.clone().sub(e), c = o.clone().sub(e);\n if (at(c, s)) {\n const r = T(c, s);\n return r < 0 || r > 1 ? h.Tangency : h.Contain;\n }\n return h.Dissociation;\n}\nfunction ne(t, n) {\n const e = n.length;\n let o, s = !1;\n for (let c = 0; c < e; c++) {\n const r = n[c];\n let i = c + 1;\n i === e && (i = 0);\n const l = n[i], u = new z().subVectors(l, r), f = new z().subVectors(t, r).cross(u);\n f === 0 && (s = !0);\n const p = Math.sign(f);\n o !== void 0 && o !== p && h.Dissociation, o = p;\n }\n return s ? h.Tangency : h.Contain;\n}\nfunction Ln(t, n) {\n const e = [t, t.clone().add(new z(10, 0))], o = n.length;\n let s = 0;\n for (let c = 0; c < o; c++) {\n const r = n[c];\n let i = c + 1;\n i === o && (i = 0);\n const l = n[i], u = [r, l];\n if (bn(u, t) === h.Contain)\n return h.Tangency;\n const f = dn(e, u);\n if (f === h.Contain) {\n s += 2;\n continue;\n }\n if (f === h.Intersect) {\n yn(e, u);\n let p = 0;\n r.y > t.y && p++, l.y > t.y && p++, p === 1 && s++;\n }\n }\n return s % 2 === 0 ? h.Dissociation : h.Contain;\n}\nfunction ee(t, n) {\n const e = t.length;\n let o = 0, s = 0;\n for (let l = 0; l < e; l++) {\n const u = t[l];\n let a = l + 1;\n a === e && (a = 0);\n const f = t[a], m = hn([u, f], n);\n if (m === h.Intersect)\n return h.Intersect;\n m === h.Contain ? o++ : m === h.Tangency && s++;\n }\n if (o === e)\n return h.Contain;\n if (o > 0)\n return h.Intersect;\n const { center: c, radius: r } = n, i = Ln(c, t);\n return r === 0 ? i : i === h.Contain ? h.Contain : s > 0 ? h.Tangency : h.Dissociation;\n}\nfunction oe(t, n) {\n const e = t.length;\n let o = [];\n for (let s = 0; s < e; s++) {\n const c = t[s];\n let r = s + 1;\n r === e && (r = 0);\n const i = t[r], u = gn([c, i], n);\n o = [...o, ...u];\n }\n return o;\n}\nfunction se(t, n) {\n if (n = n ?? t.arcLengthDivisions, t.cacheArcULengths && t.cacheArcULengths.length === n + 1 && !t.needsUpdate) {\n const c = t.cacheArcULengths;\n return { lengths: c, length: c[n] };\n }\n t.needsUpdate = !1;\n const e = [0];\n let o = t.getPoint(0), s = 0;\n for (let c = 1; c <= n; c++) {\n const r = t.getPointAt(c / n);\n s += r.distanceTo(o), e.push(s), o = r;\n }\n return t.cacheArcULengths = e, { lengths: e, length: s };\n}\nfunction ce(t, n, e) {\n const o = e ? (l) => t.getPointAt(l) : (l) => t.getPoint(l);\n let s = o(0), c = 0;\n const r = [], i = n.length;\n for (let l = 0; l < i; l++) {\n const u = n[l], a = o(u);\n c += a.distanceTo(s), r.push(c), s = a;\n }\n return { lengths: r, length: r[i - 1] };\n}\nfunction Vt(t, n) {\n let e = t.sampleLength;\n if (!e) {\n const o = t.sampleNum;\n if (o)\n return o;\n e = 1;\n }\n return Math.ceil(n / e);\n}\nfunction re(t) {\n const { curve: n } = t;\n let e = n.getLength();\n const o = Vt(t, e);\n return n.arcLengthDivisions < o && (n.arcLengthDivisions = o, n.updateArcLengths(), e = n.getLength()), { length: e, division: o };\n}\nvar wn = /* @__PURE__ */ ((t) => (t.back = \"back\", t.front = \"front\", t))(wn || {});\nfunction ie(t) {\n const { curve: n, distance: e, fromU: o = 0, side: s, tolerance: c = e * 0.1 } = t, r = t.length ?? n.getLength(), i = n.getPointAt(o);\n let l = e / r;\n const u = s === \"front\" ? -1 : 1;\n let a = !0, f = o, p = i, m = 0, g = !0;\n do {\n f = u * l + o;\n let d = !1;\n f > 1 ? (f = 1, d = !0) : f < 0 && (f = 0, d = !0), p = n.getPointAt(f), m = p.distanceTo(i), a = Math.abs(e - m) > c;\n const y = e / m;\n if (d && a && y > 1) {\n g = !1;\n break;\n }\n l *= y;\n } while (a);\n return {\n succeed: g,\n u: f,\n point: p,\n distance: m\n };\n}\nfunction le(t) {\n const { curve: n, distance: e, fromU: o = 0, tolerance: s = e * 0.1, origin: c } = t, r = t.length ?? n.getLength(), i = n.getPointAt(o), l = i.distanceTo(c), u = e - l;\n let a = u / r, f = !0, p = o, m = i;\n do {\n p = a + o;\n let g = !1;\n p > 1 ? (p = 1, g = !0) : p < 0 && (p = 0, g = !0), m = n.getPointAt(p);\n const d = m.distanceTo(c);\n f = Math.abs(e - d) > s;\n const y = u / (d - l);\n if (g && f && y > 1)\n return null;\n a *= y;\n } while (f);\n return {\n u: p,\n point: m\n };\n}\nfunction xn(t, n, e) {\n const o = [], s = [], c = [], r = [], i = [];\n let l = t.getTangent(0), u = e.clone(), { binormal: a } = X(l, u);\n const f = 1 / n, p = new S();\n for (let m = 0; m <= n; m++) {\n const g = m * f;\n i.push(g);\n const d = t.getPoint(g);\n o.push(d);\n const y = t.getTangent(g);\n s.push(y), p.setFromUnitVectors(l, y);\n const b = u.clone().applyQuaternion(p);\n c.push(b);\n const C = a.clone().applyQuaternion(p);\n r.push(C), l = y, u = b, a = C;\n }\n return { tangents: s, normals: c, binormals: r, points: o, uts: i };\n}\nfunction Cn(t, n, e, o) {\n const s = [];\n o = o ?? t.autoClose;\n const { tangents: c, normals: r, binormals: i } = t.computeFrenetFrames(n, o), l = un(r[0], e, c[0]), u = 1 / n, a = new S(), f = [];\n for (let p = 0; p <= n; p++) {\n const m = p * u;\n f.push(m);\n const g = t.getPoint(m);\n s.push(g);\n const d = c[p], y = r[p], b = i[p];\n a.setFromAxisAngle(d, l), y.applyQuaternion(a), b.applyQuaternion(a);\n }\n return { tangents: c, normals: r, binormals: i, points: s, uts: f };\n}\nfunction An(t, n, e, o) {\n const s = [], c = [], r = [], i = [], l = [], u = o ? function(f) {\n return {\n point: t.getPointAt(f),\n tangent: t.getTangentAt(f)\n };\n } : function(f) {\n return {\n point: t.getPoint(f),\n tangent: t.getTangent(f)\n };\n }, a = 1 / n;\n for (let f = 0; f <= n; f++) {\n const p = f * a;\n l.push(p);\n const { point: m, tangent: g } = u(p);\n s.push(m), c.push(g);\n const d = e.clone(), { binormal: y } = X(g, d);\n r.push(d), i.push(y);\n }\n return { tangents: c, normals: r, binormals: i, points: s, uts: l };\n}\nfunction ae(t, n, e, o) {\n const { useU: s, fixUp: c, closed: r } = o || {}, i = r ?? !!t.autoClose;\n let l;\n return c ? l = An(t, n, e, s) : s ? l = Cn(t, n, e, i) : l = xn(t, n, e), l;\n}\nfunction ue(t) {\n const n = t.count, e = [0];\n let o = new w().fromBufferAttribute(t, 0), s = new w(), c = 0;\n for (let r = 1; r < n; r++)\n s.fromBufferAttribute(t, r), c += s.distanceTo(o), e.push(c), o.copy(s);\n return { lengths: e, length: c };\n}\nfunction fe(t) {\n const n = t.length, e = [0];\n let o = t[0], s, c = 0;\n for (let r = 1; r < n; r++)\n s = t[r], c += s.distanceTo(o), e.push(c), o = s;\n return { lengths: e, length: c };\n}\nfunction pt(t) {\n const n = Tn(t), e = [0], o = n.reduce((s, c) => (s += c.distance(), e.push(s), s), 0);\n return { lines: n, lengths: e, length: o };\n}\nfunction Tn(t) {\n const n = [];\n return t.reduce((e, o) => {\n const s = new Ht(e, o);\n return n.push(s), o;\n }), n;\n}\nfunction pe(t, n) {\n const e = [];\n return { lines: n.filter((s, c) => {\n const r = s.closestPointToPointParameter(t), i = 0 <= r || r >= 1;\n return i && e.push(c), i;\n }), indexs: e };\n}\nfunction me(t, n) {\n const { distSortIndexs: e, clampDists: o, clampPoints: s, ts: c, clampTs: r } = On(t, n), i = e[0];\n return { line: n[i], index: i, clampDist: o[i], clampPoint: s[i], t: c[i], clampT: r[i] };\n}\nfunction On(t, n) {\n const e = {\n clampDists: [],\n clampPoints: [],\n distSortIndexs: [],\n ts: [],\n clampTs: []\n };\n return n.forEach((o, s) => {\n const c = o.closestPointToPointParameter(t), r = Jt.clamp(c, 0, 1), i = o.at(r, new w()), l = t.distanceTo(i);\n e.clampDists.push(l), e.clampPoints.push(i), e.distSortIndexs.push(s), e.ts.push(c), e.clampTs.push(r);\n }), e.distSortIndexs.sort((o, s) => e.clampDists[o] - e.clampDists[s]), e;\n}\nfunction he(t) {\n const n = new Ot(), e = t[0].z == null ? $ : K;\n return t.reduce((o, s) => {\n const c = new e(o, s);\n return n.add(c), s;\n }), n;\n}\nfunction ge(t, n) {\n return t.z == null ? new $(t, n) : new K(t, n);\n}\nfunction de(t) {\n const n = t[0].z == null ? $ : K, e = [];\n return t.reduce((o, s) => {\n const c = new n(o, s);\n return e.push(c), s;\n }), e;\n}\nfunction ye(t, n) {\n const e = [], o = [], s = [], { lines: c, lengths: r, length: i } = pt(t), l = c.length;\n for (let u = 0; u < l; u++) {\n const f = c[u].delta(new w()).normalize();\n e.push(f);\n const p = n.clone(), { binormal: m } = X(f, p);\n o.push(p), s.push(m);\n }\n return e.push(e.at(-1).clone()), o.push(o.at(-1).clone()), s.push(s.at(-1).clone()), { tangents: e, normals: o, binormals: s, lengths: r, length: i, lines: c };\n}\nfunction be(t, n) {\n const e = [], o = [], s = [], { lines: c, lengths: r, length: i } = pt(t), l = c.length - 1;\n let u = c[0].delta(new w()).normalize(), a = n.clone(), { binormal: f } = X(u, a);\n const p = new S();\n for (let m = 0; m <= l; m++) {\n const d = c[m].delta(new w()).normalize();\n e.push(d), p.setFromUnitVectors(u, d);\n const y = a.clone().applyQuaternion(p);\n o.push(y);\n const b = f.clone().applyQuaternion(p);\n s.push(b), u = d, a = y, f = b;\n }\n return e.push(u.clone()), o.push(a.clone()), s.push(f.clone()), { tangents: e, normals: o, binormals: s, lengths: r, length: i };\n}\nfunction Sn(t, n) {\n const e = t.getLength(), o = Vt(n ?? {}, e), s = t.getPoints(o), c = t.getLengths(o);\n return _t(s, { ...n, lengths: c });\n}\nfunction _t(t, n) {\n const { startColor: e, endColor: o, color: s, lengths: c } = n ?? {}, r = s ? new Q(s) : null, i = e ? new Q(e) : r ?? new Q(0, 1, 0), l = o ? new Q(o) : r ?? new Q(0, 0, 1), u = [], a = [];\n t[0].toArray(u, 0);\n const f = u.length, p = c ?? pt(t).lengths, m = p[p.length - 1], g = new Q();\n t.forEach((y, b) => {\n y.toArray(u, b * f);\n const C = p[b] / m;\n g.lerpColors(i, l, C), g.toArray(a, b * 3);\n });\n const d = new Kt();\n return d.setAttribute(\"position\", new wt(u, f)), d.setAttribute(\"color\", new wt(a, 3)), d;\n}\nfunction Le(t, n) {\n n = n ?? {};\n let { material: e, linewidth: o } = n;\n o = o ?? 1, e = e ?? new $t({ vertexColors: !0, linewidth: o });\n const s = Array.isArray(t) ? _t(t, n) : Sn(t, n);\n return new vt(s, e);\n}\nconst tt = 0.1;\nfunction we(t, n = 0, e) {\n const o = [];\n let s = t / 2 - 1;\n if (e)\n if (n === 1) {\n const c = n - 1, r = n, i = r + 1;\n o.push(i, r, c);\n } else\n n > 1 && (s++, n -= 2);\n for (let c = 0; c < s; c++) {\n const r = c * 2 + n, i = r + 1, l = r + 2, u = r + 3;\n o.push(r, i, l, u, l, i);\n }\n return o;\n}\nfunction xe(t, n = 0, e) {\n const o = [];\n let s = t.length / 6 - 1;\n if (e)\n if (n === 1) {\n const u = n - 1, a = n, f = a + 1;\n o.push(f, a, u);\n } else\n n > 1 && (s++, n -= 2);\n const c = new w(), r = new w(), i = new w(), l = s - 1;\n for (let u = 0; u < s; u++) {\n const a = u * 2, f = a + 1, p = a + 2, m = a + 3, g = a + n, d = g + 1, y = g + 2, b = g + 3, C = [g, d, y, b, y, d], L = [g, d, b, b, y, g];\n if (g >= 0) {\n c.fromArray(t, a * 3), r.fromArray(t, p * 3);\n const O = u === l;\n if (c.equals(r)) {\n const A = a + 4;\n O || i.fromArray(t, A * 3).equals(r) ? o.push(...L) : o.push(...C);\n continue;\n }\n if (c.fromArray(t, f * 3), r.fromArray(t, m * 3), c.equals(r)) {\n const A = a + 5;\n O || i.fromArray(t, A * 3).equals(r) ? o.push(...C) : o.push(...L);\n continue;\n }\n }\n o.push(...C);\n }\n return o;\n}\nvar Pn = /* @__PURE__ */ ((t) => (t.bevel = \"bevel\", t.chamfer = \"chamfer\", t.round = \"round\", t.lineSegment = \"lineSegment\", t))(Pn || {});\nfunction In(t, n, e, o, s = tt) {\n const { point: c, length: r, width: i } = t, l = i / 2, { tangent: u, normal: a, binormal: f } = n, { tangent: p, normal: m, binormal: g } = e, { line: d } = Dt(n, e, s);\n let y;\n if (!d) {\n y = f.clone().multiplyScalar(l);\n const P = c.clone().sub(y), nt = c.clone().add(y);\n y.copy(g).multiplyScalar(l);\n const yt = c.clone().sub(y), bt = c.clone().add(y);\n return {\n points: [P, nt, yt, bt],\n normals: [a, a, m, m],\n lengths: [r, r, r, r]\n };\n }\n let { tangent: b, normal: C, length: L } = d;\n y = b.clone().multiplyScalar(L * l);\n const O = Math.abs(y.dot(p)), A = r - O, U = r + O, q = c.clone().sub(y), R = c.clone().add(y);\n let N, I, k, V;\n const M = f.clone().multiplyScalar(i), W = g.clone().multiplyScalar(i);\n if (u.clone().cross(p).dot(a) > 0) {\n const P = N = k = q;\n I = P.clone().add(M), V = P.clone().add(W);\n } else {\n const P = V = I = R;\n N = P.clone().sub(M), k = P.clone().sub(W);\n }\n return o ? {\n points: [N, I, k, V],\n normals: [a, a, m, m],\n lengths: [A, A, U, U]\n } : {\n points: [N, I, q, R, k, V],\n normals: [a, a, C, C, m, m],\n lengths: [A, A, r, r, U, U]\n };\n}\nvar Mn = /* @__PURE__ */ ((t) => (t[t.AllOblique = 0] = \"AllOblique\", t[t.TangentSame = 1] = \"TangentSame\", t[t.TangentReverse = 2] = \"TangentReverse\", t[t.TangentVertical = 4] = \"TangentVertical\", t[t.NormalSame = 8] = \"NormalSame\", t[t.NormalReverse = 16] = \"NormalReverse\", t[t.NormalVertical = 32] = \"NormalVertical\", t[t.BinormalSame = 64] = \"BinormalSame\", t[t.BinormalReverse = 128] = \"BinormalReverse\", t[t.BinormalVertical = 256] = \"BinormalVertical\", t))(Mn || {});\nfunction Bn(t, n, e = tt) {\n const { tangent: o, normal: s, binormal: c } = t, { tangent: r, normal: i, binormal: l } = n;\n let u = 0;\n const a = o.dot(r), f = Math.abs(a);\n f > 1 - e ? u |= a > 0 ? 1 : 2 : f < e && (u |= 4);\n const p = s.dot(i), m = Math.abs(p);\n m > 1 - e ? u |= p > 0 ? 8 : 16 : m < e && (u |= 32);\n const g = c.dot(l), d = Math.abs(g);\n return d > 1 - e ? u |= g > 0 ? 64 : 128 : d < e && (u |= 256), u;\n}\nfunction Dt(t, n, e = tt) {\n const { normal: o, binormal: s } = t, { normal: c, binormal: r } = n, i = Bn(t, n, e);\n let l, u;\n if (i & 8 && !(i & 2))\n u = c, l = s.clone().add(r);\n else if (i & 16)\n u = c, l = r.clone().negate().add(s);\n else {\n if (i & 3)\n return { relation: i };\n if (i & 256)\n return { relation: i };\n u = o.clone().add(c).normalize(), l = o.clone().cross(c);\n }\n l.normalize();\n let a = l.dot(s);\n a < 0 && (l.negate(), a = -a);\n const f = 1 / a;\n return {\n relation: i,\n line: {\n tangent: l,\n normal: u,\n length: f\n }\n };\n}\nfunction Vn(t, n, e, o, s = tt) {\n const { point: c, length: r, width: i } = t, l = i / 2, { tangent: u, normal: a, binormal: f } = n, { tangent: p, normal: m, binormal: g } = e, { smoothStepAngle: d, smoothStepLength: y } = o || {}, { relation: b, line: C } = Dt(n, e, s);\n let L;\n if (!C) {\n L = f.clone().multiplyScalar(l);\n const x = c.clone().sub(L), _ = c.clone().add(L);\n L.copy(g).multiplyScalar(l);\n const D = c.clone().sub(L), E = c.clone().add(L);\n return {\n points: [x, _, D, E],\n normals: [a, a, m, m],\n lengths: [r, r, r, r]\n };\n }\n let { tangent: O, normal: A, length: U } = C;\n L = O.clone().multiplyScalar(U * l);\n const q = c.clone().sub(L), R = c.clone().add(L);\n if (b & 64)\n return {\n points: [q, R],\n normals: [A, A],\n lengths: [r, r]\n };\n const N = f.angleTo(O), I = Math.abs(L.dot(p)), k = r - I, V = 1 / I;\n let M = d == null && y ? I / y : N / (d ?? 0.5);\n M = Math.max(Math.round(M), 1);\n const W = 1 / M, gt = new S().setFromUnitVectors(f, O), dt = new S().setFromUnitVectors(O, g), P = new S().setFromUnitVectors(a, A), nt = new S().setFromUnitVectors(A, m), Lt = u.clone().cross(p).dot(a) > 0 ? function(x) {\n return {\n left: q,\n right: q.clone().add(x)\n };\n } : function(x) {\n return {\n left: R.clone().sub(x),\n right: R\n };\n };\n L.copy(f).multiplyScalar(i);\n const Z = new S(), B = new S(), et = [], ot = [], st = [];\n for (let x = 0; x < M; x++) {\n const _ = x * W;\n B.slerpQuaternions(Z, gt, _);\n const D = x * V + k;\n st.push(D, D);\n const E = L.clone().applyQuaternion(B), { left: ct, right: rt } = Lt(E);\n et.push(ct, rt), B.slerpQuaternions(Z, P, _);\n const G = a.clone().applyQuaternion(B);\n ot.push(G, G);\n }\n L.copy(O).multiplyScalar(i);\n for (let x = 0; x <= M; x++) {\n const _ = x * W;\n B.slerpQuaternions(Z, dt, _);\n const D = x * V + r;\n st.push(D, D);\n const E = L.clone().applyQuaternion(B), { left: ct, right: rt } = Lt(E);\n et.push(ct, rt), B.slerpQuaternions(Z, nt, _);\n const G = A.clone().applyQuaternion(B);\n ot.push(G, G);\n }\n return { points: et, normals: ot, lengths: st };\n}\nfunction _n(t, n, e) {\n const { point: o, length: s, width: c } = t, r = c / 2, { normal: i, binormal: l } = n, { normal: u, binormal: a } = e;\n let f = l.clone().multiplyScalar(r);\n const p = o.clone().sub(f), m = o.clone().add(f);\n let g = a.clone().multiplyScalar(r);\n const d = o.clone().sub(g), y = o.clone().add(g);\n return {\n points: [p, m, d, y],\n normals: [i, i, u, u],\n lengths: [s, s, s, s]\n };\n}\nfunction Ce(t, n, e, o) {\n const { connectionType: s } = o || {};\n switch (s) {\n case \"round\":\n return Vn(t, n, e, o);\n case \"lineSegment\":\n return _n(t, n, e);\n default:\n return In(\n t,\n n,\n e,\n s === \"chamfer\"\n /* chamfer */\n );\n }\n}\nconst F = new ft();\nfunction mt(t, n) {\n const { wrapS: e, wrapT: o, flipX: s, flipY: c } = n;\n if (t.x < 0 || t.x > 1)\n switch (e) {\n case At:\n t.x = t.x - Math.floor(t.x);\n break;\n case Ct:\n t.x = t.x < 0 ? 0 : 1;\n break;\n case xt:\n Math.abs(Math.floor(t.x) % 2) === 1 ? t.x = Math.ceil(t.x) - t.x : t.x = t.x - Math.floor(t.x);\n break;\n }\n if (t.y < 0 || t.y > 1)\n switch (o) {\n case At:\n t.y = t.y - Math.floor(t.y);\n break;\n case Ct:\n t.y = t.y < 0 ? 0 : 1;\n break;\n case xt:\n Math.abs(Math.floor(t.y) % 2) === 1 ? t.y = Math.ceil(t.y) - t.y : t.y = t.y - Math.floor(t.y);\n break;\n }\n return s && (t.x = 1 - t.x), c && (t.y = 1 - t.y), t;\n}\nfunction Dn(t, n) {\n const e = t.count;\n for (let o = 0; o < e; o++) {\n const s = t.getX(o), c = t.getY(o), r = mt({ x: s, y: c }, n);\n t.setXY(o, r.x, r.y);\n }\n return t;\n}\nfunction zn(t, n) {\n const e = new z(), o = t.length;\n for (let s = 0; s < o; s++) {\n const c = s * 2, r = c + 1;\n e.x = t[c], e.y = t[r], mt(e, n), t[c] = e.x, t[r] = e.y;\n }\n return t;\n}\nfunction ht(t, n = new ft()) {\n const { offset: e = { x: 0, y: 0 }, repeat: o = { x: 1, y: 1 }, center: s = { x: 0, y: 0 }, rotation: c = 0 } = t;\n return n.setUvTransform(e.x, e.y, o.x, o.y, c, s.x, s.y), n;\n}\nfunction Ae(t, n, e) {\n return ht(n, F), t.applyMatrix3(F), e && mt(t, e), t;\n}\nfunction Te(t, n, e) {\n return ht(n, F), t.applyMatrix3(F), e && Dn(t, e), t.needsUpdate = !0, t;\n}\nfunction Oe(t, n, e) {\n ht(n, F);\n const o = new z(), s = t.length;\n for (let c = 0; c < s; c++) {\n const r = c * 2, i = r + 1;\n o.x = t[r], o.y = t[i], o.applyMatrix3(F), t[r] = o.x, t[i] = o.y;\n }\n return e && zn(t, e), t;\n}\nexport {\n Ie as Axis,\n Me as Axis4,\n It as Azimuth,\n wn as DirectionSide,\n Mn as FrenetFrameRelation,\n h as GeometricRelationship,\n Pn as LineConnectionType,\n X as adjustFrenetFrame,\n ln as adjustFrontUpFrame,\n Fn as adjustOrientation,\n Xn as azimuth,\n cn as closeCurvePath,\n ae as computeCurveFrenetFrames,\n An as computeCurveFrenetFramesByFixUp,\n xn as computeCurveFrenetFramesByT,\n Cn as computeCurveFrenetFramesByU,\n Bn as computeFrenetFrameRelation,\n En as computeIntersectSpheres,\n Y as computeIntersectionFactorOfLine_Circle,\n Dt as computeIntersectionLineOfBands,\n gn as computeIntersectionOfLineSegment_Circle,\n te as computeIntersectionOfLineSegment_LineSegment,\n Jn as computeIntersectionOfLine_Circle,\n v as computeIntersectionOfLine_Line,\n oe as computeIntersectionOfPolygon_Circle,\n $n as computeIntersectionOfRay_Circle,\n yn as computeIntersectionOfRay_LineSegment,\n be as computePolylineFrenetFrames,\n ye as computePolylineFrenetFramesByFixUp,\n T as computeVectorScalar,\n mt as configUV,\n Dn as configUVBufferAttribute,\n zn as configUVs,\n In as createBevelLineConnection,\n Sn as createCurveBufferGeometry,\n Ce as createLineConnection,\n ge as createLineCurve,\n de as createLineCurves,\n _n as createLineSegmentConnection,\n Le as createLineSegmentsByCurve,\n Gn as createLinearGradientTexture,\n Tn as createLines,\n _t as createPolylineBufferGeometry,\n he as createPolylineCurve,\n Vn as createRoundLineConnection,\n we as createSymmetricSegmentedTrigonometricIndexs,\n xe as createSymmetricSegmentedTrigonometricIndexsByVertexs,\n ht as createUVTransformMatrix,\n lt as defaultAzimuthOptions,\n ut as defaultCourseAzimuthMap,\n hn as discriminateRelationshipOfLineSegment_Circle,\n vn as discriminateRelationshipOfLineSegment_LineSegment,\n bn as discriminateRelationshipOfLineSegment_Point,\n Hn as discriminateRelationshipOfLine_Circle,\n Bt as discriminateRelationshipOfLine_Line,\n ne as discriminateRelationshipOfPoint_ConvexPolygon,\n Ln as discriminateRelationshipOfPoint_Polygon,\n ee as discriminateRelationshipOfPolygon_Circle,\n Kn as discriminateRelationshipOfRay_Circle,\n dn as discriminateRelationshipOfRay_LineSegment,\n pn as formatAzimuthDefineMap,\n jn as frenetFrameToFrontUpFrame,\n Qn as frontUpFrameToFrenetFrame,\n Zn as get3DTextureItem,\n Yn as get3DTextureSlice,\n un as getAxisRotationAngle,\n fn as getAzimuthAngle,\n me as getClosestDistanceInfoOfPointToLines,\n re as getCurveDivisionLength,\n ie as getCurvePointAwayFrom,\n le as getCurvePointAwayFromOrigin,\n se as getCurveULengths,\n On as getDistanceInfoOfPointToLines,\n an as getIncludedAngle,\n fe as getLengthsOfPoints,\n ue as getLengthsOfPositionAttribute,\n ce as getLengthsOfTs,\n pt as getLinesInfo,\n pe as getProjectionLines,\n Wn as getQuaternionBetweenVectorsAroundAxis,\n J as getRotationAngle,\n Vt as getSampleNum,\n Mt as getTextureFormatSize,\n Pt as getVectorClass,\n at as isCollinear,\n H as ivectorMemberToVector,\n rn as ivectorToVector,\n kn as threeBugPatch,\n Ae as transformUV,\n Te as transformUVBufferAttribute,\n Oe as transformUVs,\n tt as zeroThreshold_Default\n};\n","import { azimuth, } from '@three3d/tools'\r\nimport SoonSpace, { TopologyNodeInfo, } from 'soonspacejs'\r\nimport { Topology, } from 'soonspacejs'\r\nimport { Vector3, } from 'three'\r\nimport { Direction, } from './types'\r\n\r\nexport function getDirection ( target: Vector3, front: Vector3 ): Direction {\r\n\r\n azimuth.map = {\r\n yaw: {\r\n left: [ 20, 170 ],\r\n right: [ -170, -20 ],\r\n },\r\n pitch: {\r\n up: [ 20, 170 ],\r\n down: [ -170, -20 ],\r\n },\r\n }\r\n const { yaw, pitch, } = azimuth.computeAzimuth( target, front )\r\n const yawName = yaw.name as any as 'left' | 'right'\r\n const pitchName = pitch.name as any as 'up' | 'down'\r\n\r\n if ( !yawName || !pitchName ) return 'straight'\r\n if ( !pitchName ) return yawName\r\n if ( !yawName ) return pitchName\r\n return `${yawName}-${pitchName}`\r\n\r\n}\r\n\r\n/**\r\n * 路径反转\r\n * @param ssp\r\n * @param topologies 路径数组\r\n * @returns\r\n */\r\nexport function reverseTopologies ( ssp: SoonSpace, topologies: Topology[] ) {\r\n\r\n return topologies.reverse().map( ( item ) => {\r\n\r\n ssp.removeObjectById( item.sid )\r\n\r\n const topologyNodes = item.nodes.reverse().map(\r\n ( node ) =>\r\n ( {\r\n id: node.sid,\r\n position: node.position,\r\n graphs: node.graphs,\r\n } as TopologyNodeInfo )\r\n )\r\n\r\n return ssp.createTopology( {\r\n ...item.info,\r\n nodes: topologyNodes,\r\n } )\r\n \r\n } )\r\n\r\n}\r\n","import type { Node, Topology, } from 'soonspacejs'\r\nimport { Direction, } from './types'\r\nimport { getDirection, } from './utils'\r\n\r\ninterface NavigatorNodeInfo {\r\n\tprogressArea: [number, number];\r\n\tdistanceArea: [number, number];\r\n\tnode: Node;\r\n\tnextNode?: Node;\r\n\tdistanceToNext: number;\r\n\tdistanceToStart: number;\r\n\tdistanceToEnd: number;\r\n\tfrontDirection: Direction;\r\n}\r\n\r\ninterface DistanceInfo {\r\n\tdistanceToStartNode: number;\r\n\tdistanceToEndNode: number;\r\n\tdistanceToStart: number;\r\n\tdistanceToEnd: number;\r\n}\r\n\r\nexport function getDirectionByNodes ( p1: Node, p2?: Node, p3?: Node ): Direction {\r\n\r\n if ( !p2 || !p3 ) {\r\n\r\n return 'straight'\r\n \r\n }\r\n const target = p2.position.clone().sub( p1.position )\r\n const front = p3.position.clone().sub( p2.position )\r\n\r\n return getDirection( target, front )\r\n\r\n}\r\n\r\n/** 分析并返回所有节点信息 */\r\nexport function getNavigatorNodeInfosByTopology ( topology: Topology ) {\r\n\r\n const nodes = topology.nodes\r\n\r\n const totalLength = topology.getLength()\r\n\r\n let countLength = 0\r\n let countProgress = 0\r\n\r\n return nodes.reduce( ( acc, cur, index ) => {\r\n\r\n const secondNode = nodes[ index + 1 ] as Node | undefined\r\n\r\n const thirdNode = nodes[ index + 2 ] as Node | undefined\r\n\r\n const distanceToNext = secondNode ?\r\n secondNode.position.clone().distanceTo( cur.position ) :\r\n 0\r\n\r\n const frontDirection = getDirectionByNodes( cur, secondNode, thirdNode )\r\n\r\n const distanceEnd = countLength + distanceToNext\r\n const progressEnd = distanceEnd / totalLength\r\n\r\n const result: NavigatorNodeInfo = {\r\n progressArea: [ countProgress, progressEnd ],\r\n distanceArea: [ countLength, distanceEnd ],\r\n node: cur,\r\n nextNode: secondNode,\r\n distanceToStart: countLength,\r\n distanceToEnd: totalLength - countLength,\r\n distanceToNext,\r\n frontDirection,\r\n }\r\n\r\n countLength = distanceEnd\r\n countProgress = progressEnd\r\n\r\n acc.push( result )\r\n\r\n return acc\r\n \r\n }, [] as NavigatorNodeInfo[] )\r\n\r\n}\r\n\r\n/** 根据进度获取当前节点信息 */\r\nexport function getNavigatorNodeInfoByProgress (\r\n progress: number,\r\n infos: NavigatorNodeInfo[]\r\n) {\r\n\r\n if ( progress === 0 ) return infos[ 0 ]\r\n if ( progress === 100 ) return infos[ infos.length - 1 ]\r\n return infos.find( ( info ) => {\r\n\r\n const [ start, end ] = info.progressArea\r\n\r\n return progress >= start && progress < end\r\n \r\n } )\r\n\r\n}\r\n\r\n/** 获取当前位置距离信息 */\r\nexport function getDistanceInfoByProgress (\r\n progress: number,\r\n info?: NavigatorNodeInfo\r\n): DistanceInfo {\r\n\r\n if ( !info ) return {\r\n distanceToStartNode: 0,\r\n distanceToEndNode: 0,\r\n distanceToStart: 0,\r\n distanceToEnd: 0,\r\n }\r\n\r\n const [ startProgress, endProgress ] = info.progressArea\r\n\r\n const { distanceToNext, distanceToEnd, distanceToStart, } = info\r\n\r\n const progressInArea =\r\n\t\t( progress - startProgress ) / ( endProgress - startProgress )\r\n\r\n const distanceToStartNode = distanceToNext * progressInArea\r\n const distanceToEndNode = distanceToNext * ( 1 - progressInArea )\r\n\r\n return {\r\n distanceToStartNode,\r\n distanceToEndNode,\r\n distanceToStart: distanceToStartNode + distanceToStart,\r\n distanceToEnd: distanceToEnd - distanceToEndNode,\r\n }\r\n\r\n}\r\n","import { Object3D, Vector3, } from 'three'\r\nimport SoonSpace from 'soonspacejs'\r\nimport { Topology, } from 'soonspacejs'\r\nimport { PLAY_STATUS, playInfo, } from './types'\r\n\r\nexport * from './navigator-nodes'\r\nexport * from './types'\r\nexport * from './utils'\r\n\r\nexport class Navigator {\r\n\r\n onPlay: ( info: playInfo ) => void = () => {}\r\n onStatusChange: ( status: PLAY_STATUS ) => void = () => {}\r\n\r\n /** 是否循环播放,默认为否 */\r\n loop = false\r\n\r\n /** 是否自动开始下一段路径播放,默认为是 */\r\n autoNext = true\r\n\r\n /** 开始或者重新开始后自动播放路径动画,默认为否 */\r\n playAfterStart = false\r\n\r\n /** 开始时飞向模型,默认为是 */\r\n flyToModelAfterStart = true\r\n\r\n /** 停止时是否返回起点,默认为是 */\r\n backStartPointWhenStop = true\r\n\r\n /** 路径动画主体模型 */\r\n _model = new Object3D()\r\n get model () {\r\n\r\n return this._model\r\n \r\n }\r\n set model ( obj: Object3D ) {\r\n\r\n this._model = obj\r\n \r\n }\r\n\r\n protected _speed = 1\r\n /** 播放速度 */\r\n get speed () {\r\n\r\n return this._speed\r\n \r\n }\r\n set speed ( value: number ) {\r\n\r\n this._speed = value\r\n \r\n }\r\n\r\n protected _pathProgress = 0\r\n /** 当前段进度 */\r\n get pathProgress () {\r\n\r\n return this._pathProgress\r\n \r\n }\r\n set pathProgress ( value: number ) {\r\n\r\n this._pathProgress = value\r\n \r\n }\r\n\r\n protected _totalProgress = 0\r\n /** 总进度 */\r\n get totalProgress () {\r\n\r\n return this._pathProgress\r\n \r\n }\r\n set totalProgress ( value: number ) {\r\n\r\n this._pathProgress = value\r\n \r\n }\r\n\r\n /** 当前播放的动画路径索引 */\r\n protected _currentPathIndex = 0\r\n\r\n /** 当前节点 */\r\n protected _currentNode: Vector3 | null = null\r\n\r\n /** 下个路径节点 */\r\n protected _nextNode: Vector3 | null = null\r\n\r\n /** 当前状态 */\r\n protected _playStatus: PLAY_STATUS = PLAY_STATUS.PENDING\r\n\r\n get currentPath () {\r\n\r\n return this.paths[ this.currentPathIndex ]\r\n \r\n }\r\n\r\n /** 对外只读 当前路径索引 */\r\n get currentPathIndex () {\r\n\r\n return this._currentPathIndex\r\n \r\n }\r\n\r\n /** 对外只读 当前朝向方向向量 */\r\n get currentRotationVector () {\r\n\r\n if ( !this._nextNode || !this._currentNode ) return new Vector3()\r\n return this._nextNode.clone().sub( this._currentNode )\r\n \r\n }\r\n\r\n constructor ( public readonly ssp: SoonSpace, public paths: Topology[] ) {}\r\n\r\n protected changeStatus ( status: PLAY_STATUS ) {\r\n\r\n this._playStatus = status\r\n this.onStatusChange( status )\r\n \r\n }\r\n\r\n /** 开始导航 */\r\n start () {}\r\n\r\n /** 重新开始导航 */\r\n restart () {\r\n\r\n this.stop()\r\n this.start()\r\n \r\n }\r\n\r\n /** 播放动画 */\r\n play ( index = 0, node?: Vector3 ) {\r\n\r\n this.changeStatus( PLAY_STATUS.PLAYING )\r\n\r\n const path = this.paths[ index ]\r\n \r\n }\r\n\r\n /** 暂停动画 */\r\n pause () {\r\n\r\n this.changeStatus( PLAY_STATUS.PAUSE )\r\n \r\n }\r\n\r\n /** 停止动画 */\r\n stop () {\r\n\r\n this.changeStatus( PLAY_STATUS.STOP )\r\n \r\n }\r\n\r\n /** 路径反转 */\r\n flip () {}\r\n\r\n /** 结束导航 */\r\n over () {\r\n\r\n this.changeStatus( PLAY_STATUS.PENDING )\r\n \r\n }\r\n\r\n}\r\n","import { Azimuth, } from '@three3d/tools'\r\n\r\nexport { Azimuth, AzimuthOptions, CourseAzimuthMap, AzimuthDefine, AzimuthInfo, CourseInfo, AngleRange, AzimuthList, AzimuthMap, } from '@three3d/tools'\r\n\r\nconst azimuth = new Azimuth()\r\n\r\nexport { azimuth, }\r\n"],"names":["w","ft","azimuth","Azimuth"],"mappings":"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","x_google_ignoreList":[7]}