drone-camera 0.0.0-stage → 0.1.2
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.
- package/LICENSE +21 -0
- package/README.md +157 -2
- package/index.d.ts +51 -0
- package/index.d.ts.map +1 -0
- package/index.js +20474 -0
- package/index.js.map +1 -0
- package/index.umd.cjs +1361 -0
- package/index.umd.cjs.map +1 -0
- package/lib/drone-capture-manifest.d.ts +169 -0
- package/lib/drone-capture-manifest.d.ts.map +1 -0
- package/lib/drone-capture-panel.d.ts +135 -0
- package/lib/drone-capture-panel.d.ts.map +1 -0
- package/lib/drone-capture.d.ts +380 -0
- package/lib/drone-capture.d.ts.map +1 -0
- package/lib/drone-cesium-mission.d.ts +120 -0
- package/lib/drone-cesium-mission.d.ts.map +1 -0
- package/lib/drone-cesium-rig.d.ts +50 -0
- package/lib/drone-cesium-rig.d.ts.map +1 -0
- package/lib/drone-cesium.d.ts +519 -0
- package/lib/drone-cesium.d.ts.map +1 -0
- package/lib/drone-control.d.ts +188 -0
- package/lib/drone-control.d.ts.map +1 -0
- package/lib/drone-engine.d.ts +70 -0
- package/lib/drone-engine.d.ts.map +1 -0
- package/lib/drone-exif.d.ts +64 -0
- package/lib/drone-exif.d.ts.map +1 -0
- package/lib/drone-fly.d.ts +545 -0
- package/lib/drone-fly.d.ts.map +1 -0
- package/lib/drone-gallery.d.ts +146 -0
- package/lib/drone-gallery.d.ts.map +1 -0
- package/lib/drone-husky-model.d.ts +22 -0
- package/lib/drone-husky-model.d.ts.map +1 -0
- package/lib/drone-image-utils.d.ts +67 -0
- package/lib/drone-image-utils.d.ts.map +1 -0
- package/lib/drone-image-viewer.d.ts +97 -0
- package/lib/drone-image-viewer.d.ts.map +1 -0
- package/lib/drone-lights.d.ts +194 -0
- package/lib/drone-lights.d.ts.map +1 -0
- package/lib/drone-minimap.d.ts +155 -0
- package/lib/drone-minimap.d.ts.map +1 -0
- package/lib/drone-panel.d.ts +265 -0
- package/lib/drone-panel.d.ts.map +1 -0
- package/lib/drone-panorama-viewer.d.ts +162 -0
- package/lib/drone-panorama-viewer.d.ts.map +1 -0
- package/lib/drone-panorama.d.ts +242 -0
- package/lib/drone-panorama.d.ts.map +1 -0
- package/lib/drone-photogrammetry.d.ts +207 -0
- package/lib/drone-photogrammetry.d.ts.map +1 -0
- package/lib/drone-radar.d.ts +136 -0
- package/lib/drone-radar.d.ts.map +1 -0
- package/lib/drone-reconstruction-preview.d.ts +84 -0
- package/lib/drone-reconstruction-preview.d.ts.map +1 -0
- package/lib/drone-rig.d.ts +385 -0
- package/lib/drone-rig.d.ts.map +1 -0
- package/lib/drone-sim.d.ts +883 -0
- package/lib/drone-sim.d.ts.map +1 -0
- package/lib/drone-stitch.d.ts +84 -0
- package/lib/drone-stitch.d.ts.map +1 -0
- package/lib/drone-world.d.ts +194 -0
- package/lib/drone-world.d.ts.map +1 -0
- package/lib/mission-editor.d.ts +116 -0
- package/lib/mission-editor.d.ts.map +1 -0
- package/lib/mission-panel.d.ts +173 -0
- package/lib/mission-panel.d.ts.map +1 -0
- package/package.json +61 -4
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 影像集弹窗(原生 DOM):把整个影像集从采集面板里**搬出来单独看** —— 按「组合」分组、
|
|
3
|
+
* 每组一键合成、点缩略图看大图。
|
|
4
|
+
*
|
|
5
|
+
* 为什么要独立成弹窗:采集面板只有 300 多像素宽,缩略图、统计、详情、导出全塞在里面,
|
|
6
|
+
* 既要滚动又看不见全局;而"翻影像集"本身就是一件需要大面积的事。
|
|
7
|
+
* 于是面板只留**动作**(拍 / 停 / 导入 / 导出),影像的**浏览与合成**归这里。
|
|
8
|
+
*
|
|
9
|
+
* 三处刻意的设计:
|
|
10
|
+
*
|
|
11
|
+
* 1. **挂 `document.body`,不做面板的后代** —— 面板带 `backdrop-filter`,
|
|
12
|
+
* 会为 `position: fixed` 的后代创建新的包含块(弹窗会被裁在面板里)。
|
|
13
|
+
* 同一坑在悬浮摇杆层与大图查看器上各踩过一次。
|
|
14
|
+
*
|
|
15
|
+
* 2. **不同组合各自成块**。广角、180° 与球形 360° 扫描是同一次会话里
|
|
16
|
+
* 来源完全不同的两批数据:混在一格里既看不出归属,也没法单独合成。
|
|
17
|
+
* 分块后每组有自己的标题、色标、张数、是否拍完与「一键合成」。
|
|
18
|
+
*
|
|
19
|
+
* 3. **键盘在 window 捕获阶段接管,且上层弹窗优先**。控制面板的键盘飞行挂在冒泡阶段,
|
|
20
|
+
* 弹窗开着时 WASD / 方向键必须被截住;而球面全景查看器 / 大图查看器盖在本弹窗之上时
|
|
21
|
+
* (层级更高),本弹窗的按键处理**直接让位**,否则 Esc 会先关掉下面这层、把上面的弹窗留在屏幕上。
|
|
22
|
+
*
|
|
23
|
+
* 4. **合成结果默认落到球面查看器**,不是平面大图。等距柱状图是全景的**存储格式**,
|
|
24
|
+
* 平铺在屏幕上看不出"四面八方";点「360° 环视」把同一张图贴回球面拖动环视 ——
|
|
25
|
+
* 与真机相册打开球面全景是同一件事(见 drone-panorama-viewer)。
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* const gallery = new DroneGallery(service)
|
|
29
|
+
* gallery.open() // 打开(缺省看当前会话)
|
|
30
|
+
* gallery.stitch(groupKey) // 程序化触发某组合成
|
|
31
|
+
* gallery.close() // 关闭;destroy() 彻底卸载
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
import type { CaptureService } from './drone-capture';
|
|
35
|
+
import type { ImageGroup } from './drone-image-utils';
|
|
36
|
+
import type { PanoramaStitchResult, PanoramaStitcher } from './drone-panorama';
|
|
37
|
+
import { DroneImageViewer } from './drone-image-viewer';
|
|
38
|
+
import type { DroneImageViewerOptions } from './drone-image-viewer';
|
|
39
|
+
import { DronePanoramaViewer } from './drone-panorama-viewer';
|
|
40
|
+
import type { DronePanoramaViewerOptions } from './drone-panorama-viewer';
|
|
41
|
+
/** 影像集弹窗构造选项 */
|
|
42
|
+
export interface DroneGalleryOptions {
|
|
43
|
+
/** 是否注入自带样式,默认 true */
|
|
44
|
+
injectStyles?: boolean;
|
|
45
|
+
/** 弹窗层级,默认 900(大图查看器会自动排在它之上) */
|
|
46
|
+
zIndex?: number;
|
|
47
|
+
/** 标题,默认「影像集」 */
|
|
48
|
+
title?: string;
|
|
49
|
+
/**
|
|
50
|
+
* 大图查看器:点缩略图时打开。不传则本弹窗自己建一个(并在销毁时一并卸载);
|
|
51
|
+
* `viewerEnabled: false` 可整块关掉"点缩略图看大图"。
|
|
52
|
+
*/
|
|
53
|
+
viewer?: DroneImageViewer | null;
|
|
54
|
+
/** 是否启用"点缩略图看大图",默认 true(显式传了 `viewer` 时以传入的为准) */
|
|
55
|
+
viewerEnabled?: boolean;
|
|
56
|
+
/** 建自带查看器时透传的细项 */
|
|
57
|
+
viewerOptions?: DroneImageViewerOptions;
|
|
58
|
+
/**
|
|
59
|
+
* 全景查看器:点合成结果时打开,**把等距柱状图贴回球面拖动环视**(真机相册的体验)。
|
|
60
|
+
* 不传则本弹窗自己建一个(并在销毁时一并卸载);`panoramaViewerEnabled: false` 关掉它
|
|
61
|
+
* (那时合成结果仍可下载,只是不再有球面浏览)。
|
|
62
|
+
*/
|
|
63
|
+
panoramaViewer?: DronePanoramaViewer | null;
|
|
64
|
+
/** 是否启用球面全景查看,默认 true(显式传了 `panoramaViewer` 时以传入的为准) */
|
|
65
|
+
panoramaViewerEnabled?: boolean;
|
|
66
|
+
/** 建自带全景查看器时透传的细项 */
|
|
67
|
+
panoramaViewerOptions?: DronePanoramaViewerOptions;
|
|
68
|
+
/**
|
|
69
|
+
* 合成器。「一键合成」用它把一组全景照片拼成一张图;
|
|
70
|
+
* 不传 = 库内自带的等距柱状拼接(见 drone-stitch);传 `null` = 关掉合成按钮。
|
|
71
|
+
*/
|
|
72
|
+
stitcher?: PanoramaStitcher | null;
|
|
73
|
+
/** 关闭回调(点 × / 点遮罩 / Esc) */
|
|
74
|
+
onClose?: () => void;
|
|
75
|
+
/** 某组合成结束的回调(失败时 result 为 null) */
|
|
76
|
+
onStitched?: (group: ImageGroup, result: PanoramaStitchResult | null) => void;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 影像集弹窗:按组合分组的影像浏览 + 每组一键合成。
|
|
80
|
+
*
|
|
81
|
+
* DOM **懒挂载**:构造只记住服务与选项,首次 `open()` 才建节点、注入样式、订阅服务与键盘;
|
|
82
|
+
* `close()` 把整棵 DOM 拆掉(不是藏起来),于是"没打开"时它对本页零影响。
|
|
83
|
+
*/
|
|
84
|
+
export declare class DroneGallery {
|
|
85
|
+
private readonly service;
|
|
86
|
+
private readonly options;
|
|
87
|
+
private readonly stitcher;
|
|
88
|
+
private root;
|
|
89
|
+
private refs;
|
|
90
|
+
private unsubscribe;
|
|
91
|
+
private viewer;
|
|
92
|
+
/** viewer 是本弹窗自己建的(销毁时要一并销毁;宿主传进来的不碰) */
|
|
93
|
+
private ownViewer;
|
|
94
|
+
private panorama;
|
|
95
|
+
/** panorama 同上:只有自己建的才由自己销毁 */
|
|
96
|
+
private ownPanorama;
|
|
97
|
+
private sessionId;
|
|
98
|
+
private selectedId;
|
|
99
|
+
/** 各组的合成状态(按分组键);合成结果不是会话数据,只活在弹窗生命周期里 */
|
|
100
|
+
private readonly stitches;
|
|
101
|
+
/** 当前正在播报进度的组(拼接器只有一个,逐组串行调用) */
|
|
102
|
+
private progressKey;
|
|
103
|
+
private bodyOverflow;
|
|
104
|
+
private destroyed;
|
|
105
|
+
private downloadInProgress;
|
|
106
|
+
/** 构造影像集弹窗:网格相册 + 大图 + 360° 环视入口 */
|
|
107
|
+
constructor(service: CaptureService, options?: DroneGalleryOptions);
|
|
108
|
+
/** 弹窗当前是否打开 */
|
|
109
|
+
get isOpen(): boolean;
|
|
110
|
+
/** 打开弹窗;`sessionId` 缺省用采集服务里当前活跃的会话 */
|
|
111
|
+
open(sessionId?: string): void;
|
|
112
|
+
/** 关闭弹窗(并把整棵 DOM / 键盘监听 / 两个子弹窗一并收走) */
|
|
113
|
+
close(): void;
|
|
114
|
+
/** 重新渲染当前会话的分组视图(宿主改了服务状态后可主动调用) */
|
|
115
|
+
refresh(): void;
|
|
116
|
+
/** 关闭球面全景查看器(没开时是空操作) */
|
|
117
|
+
closePanorama(): void;
|
|
118
|
+
/** 程序化合成某一组(与点「一键合成」同一条路径);已在合成中则忽略 */
|
|
119
|
+
stitch(groupKey: string): Promise<PanoramaStitchResult | null>;
|
|
120
|
+
/** 依次合成当前会话里所有的全景组 */
|
|
121
|
+
stitchAll(): Promise<void>;
|
|
122
|
+
/** 关闭并移除弹窗(含嵌套的大图/全景查看器) */
|
|
123
|
+
destroy(): void;
|
|
124
|
+
private resolveSession;
|
|
125
|
+
private mount;
|
|
126
|
+
private unmount;
|
|
127
|
+
private render;
|
|
128
|
+
private groupMarkup;
|
|
129
|
+
/** 只刷新某一组的合成区(合成进度高频更新,整表重绘会闪) */
|
|
130
|
+
private renderStitch;
|
|
131
|
+
/**
|
|
132
|
+
* 只刷新选中态(缩略图高亮 + 结果卡片不重绘)。
|
|
133
|
+
* 大图弹窗里翻页会高频走到这里,整表重绘(几十上百个 `<img>`)纯属浪费。
|
|
134
|
+
*/
|
|
135
|
+
private syncSelection;
|
|
136
|
+
private readonly onClick;
|
|
137
|
+
private readonly onSessionChange;
|
|
138
|
+
private readonly onKeyDown;
|
|
139
|
+
private downloadOriginals;
|
|
140
|
+
private setDownloadStatus;
|
|
141
|
+
private lockScroll;
|
|
142
|
+
private unlockScroll;
|
|
143
|
+
private query;
|
|
144
|
+
private template;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=drone-gallery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-gallery.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-gallery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export type BuildPass = 'blockout' | 'structure' | 'form' | 'material' | 'lighting' | 'interaction' | 'optimization';
|
|
3
|
+
/**
|
|
4
|
+
* 「机械哈士奇」机体建模 —— 程序化 Mesh 重建(零外部资产),迁自 img2threejs 沙盒的
|
|
5
|
+
* AERIS 展示页(作者参考图驱动)。单位为比例单位,Y-up,**+Z 前向**(哈士奇头朝 +Z;
|
|
6
|
+
* 无人机链路约定 -Z 前向,由文件尾的 `createHuskyDroneModel()` 适配层负责翻转)。
|
|
7
|
+
*
|
|
8
|
+
* 本段只负责"造形":按 blockout→structure→form→material→lighting→interaction→
|
|
9
|
+
* optimization 的建造档位输出一个带部件/关节元数据的 THREE.Group;
|
|
10
|
+
* 语义 ID(CTRL_DJI_Root / CTRL_Arm_*_Fold / CTRL_Prop_*_Spin / 云台三轴等)由
|
|
11
|
+
* 适配层补挂 —— 本段不感知无人机仿真链路。
|
|
12
|
+
*/
|
|
13
|
+
export declare function createDroneModel(options?: {
|
|
14
|
+
pass?: BuildPass;
|
|
15
|
+
}): THREE.Group;
|
|
16
|
+
/**
|
|
17
|
+
* 造一台「机械哈士奇」语义机体:建模(createDroneModel)+ 语义适配。
|
|
18
|
+
* 返回的模型可直接交给 DroneFly.initialize()(缺省机体的来源);
|
|
19
|
+
* 所有几何/材质由模型自己持有,随 DroneFly.destroy() 一起释放。
|
|
20
|
+
*/
|
|
21
|
+
export declare function createHuskyDroneModel(): THREE.Group;
|
|
22
|
+
//# sourceMappingURL=drone-husky-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-husky-model.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-husky-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,MAAM,SAAS,GACnB,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,CAAA;AAG9F;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,SAAS,CAAA;CAAO,GAAG,KAAK,CAAC,KAAK,CA6mDhF;AAsED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC,KAAK,CAwMnD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 影像展示工具(采集面板与弹窗查看器共用)。
|
|
3
|
+
*
|
|
4
|
+
* 抽出来的原因很实在:同一张影像的"元数据文案"会出现在两处 —— 面板选中后的详情区、
|
|
5
|
+
* 弹窗查看器的信息条。两套实现早晚会漂移(改了一处忘了另一处),所以统一放在这里;
|
|
6
|
+
* 组件文件保持"只写自己的 DOM 逻辑"。
|
|
7
|
+
*
|
|
8
|
+
* 这里只放**无状态、无副作用**(除了 triggerDownload 的下载动作)的小函数,不引任何依赖。
|
|
9
|
+
*/
|
|
10
|
+
import type { CapturedImage } from './drone-capture';
|
|
11
|
+
/**
|
|
12
|
+
* 极简 HTML 转义。
|
|
13
|
+
*
|
|
14
|
+
* 所有插进 innerHTML 的外部文本(文件名、校验消息、EXIF 字段……)都必须过这一道 ——
|
|
15
|
+
* 真实照片的文件名完全由用户提供。
|
|
16
|
+
*/
|
|
17
|
+
export declare function escapeHtml(text: string): string;
|
|
18
|
+
/** 人类可读的字节数 */
|
|
19
|
+
export declare function formatBytes(bytes: number): string;
|
|
20
|
+
/** 触发浏览器下载(真实照片的 Blob URL 与导出的 data URL 共用) */
|
|
21
|
+
export declare function triggerDownload(url: string, filename: string): void;
|
|
22
|
+
/** 将会话里的原始照片打包为不压缩 ZIP,避免重复压缩 JPEG/PNG 并控制额外内存占用。 */
|
|
23
|
+
export declare function createOriginalImagesZip(images: CapturedImage[]): Promise<Blob>;
|
|
24
|
+
/** 校验状态对应的中文标签 */
|
|
25
|
+
export declare const VALIDATION_LABELS: Record<CapturedImage['validation']['status'], string>;
|
|
26
|
+
/** 缩略图角标字符 */
|
|
27
|
+
export declare const VALIDATION_BADGES: Record<CapturedImage['validation']['status'], string>;
|
|
28
|
+
/** 全景模式的中文名(不引 drone-panorama,免得文案模块反向依赖拍摄模块) */
|
|
29
|
+
export declare function panoramaModeLabel(mode: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* 一组同源影像(同一次全景扫描,或"未分组的单张")。
|
|
32
|
+
*
|
|
33
|
+
* 「组合」在图集里是**各自成块**展示的:广角、180° 与球形 360° 扫描不应混在同一组里
|
|
34
|
+
* 混在一堆缩略图里 —— 既看不出哪几张是一组,也没法对某一组单独合成。
|
|
35
|
+
*/
|
|
36
|
+
export interface ImageGroup {
|
|
37
|
+
/** 分组键:全景组用 `metadata.panorama.group`,单张桶用固定值 */
|
|
38
|
+
key: string;
|
|
39
|
+
kind: 'panorama' | 'single';
|
|
40
|
+
/** 展示名,如「180° 全景」/「单张影像」 */
|
|
41
|
+
label: string;
|
|
42
|
+
/** 全景模式标识(`pano-wide` / `pano-180` / `pano-360`);单张组为 undefined */
|
|
43
|
+
mode?: string;
|
|
44
|
+
/** 组内影像(已按组内序号排序) */
|
|
45
|
+
images: CapturedImage[];
|
|
46
|
+
/** 组内影像在会话里的原始序号(1 起,与 `images` 一一对应) */
|
|
47
|
+
indexes: number[];
|
|
48
|
+
/** 该组是否已拍满(张数达到预设总张数);单张组恒为 false */
|
|
49
|
+
complete: boolean;
|
|
50
|
+
/** 预设总张数(全景组才有) */
|
|
51
|
+
total?: number;
|
|
52
|
+
}
|
|
53
|
+
/** 未分组影像的桶键 */
|
|
54
|
+
export declare const UNGROUPED_KEY = "__ungrouped__";
|
|
55
|
+
/**
|
|
56
|
+
* 把会话里的影像按「组合」切开 —— 全景组按 `metadata.panorama.group` 聚合(保持首次出现顺序),
|
|
57
|
+
* 其余归入一个「单张影像」桶并排在最后。
|
|
58
|
+
*
|
|
59
|
+
* 顺序刻意保持"首次出现"而不是按组名排序:索引用的是 `index`/`session.images` 的下标,
|
|
60
|
+
* 换个顺序就会让面板里显示的 `#n` 与图集里的不一致。
|
|
61
|
+
*/
|
|
62
|
+
export declare function groupSessionImages(images: CapturedImage[]): ImageGroup[];
|
|
63
|
+
/** 缩略图右上角的定位标签(全景影像显示"第几方位 / 第几层",其余显示序号) */
|
|
64
|
+
export declare function imageTileLabel(image: CapturedImage, sequence: number): string;
|
|
65
|
+
/** 单张影像的元数据详情文本(面板详情区 / 弹窗查看器共用;含 `<b>` 等受控标签) */
|
|
66
|
+
export declare function describeImage(image: CapturedImage, index: number): string;
|
|
67
|
+
//# sourceMappingURL=drone-image-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-image-utils.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-image-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED,eAAe;AACf,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,+CAA+C;AAC/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQnE;AAED,qDAAqD;AACrD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGpF;AA0BD,kBAAkB;AAClB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAKnF,CAAA;AAED,cAAc;AACd,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAKnF,CAAA;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC3B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qBAAqB;IACrB,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,yCAAyC;IACzC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAA;IACjB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,eAAe;AACf,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAE5C;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,CAwDxE;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI7E;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoDzE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 影像弹窗查看器(原生 DOM):点缩略图后铺开看大图 —— 大图 / 元数据 / 上一张下一张 / 下载。
|
|
3
|
+
*
|
|
4
|
+
* 与 drone-panel / mission-panel / drone-capture-panel 同一套范式:只用 DOM + CSS,
|
|
5
|
+
* 不引任何 UI 框架,库整体保持与框架无关。
|
|
6
|
+
*
|
|
7
|
+
* 两处刻意的设计:
|
|
8
|
+
*
|
|
9
|
+
* 1. **挂 `document.body`,绝不做面板的后代**。面板带 `backdrop-filter`,`filter` 一类的属性
|
|
10
|
+
* 会为 `position: fixed` 的后代创建新的包含块 —— 弹窗会被裁在面板里、跑不动。
|
|
11
|
+
* (同一坑在面板的悬浮摇杆层上踩过一次:`inset:0` 的悬浮层必须是面板的**兄弟节点**。)
|
|
12
|
+
* 另外挂 body 还有个附带好处:面板为了不打断输入框,采集入库时会重绘缩略图 DOM,
|
|
13
|
+
* 弹窗不在那棵子树里,重绘碰不到它。
|
|
14
|
+
*
|
|
15
|
+
* 2. **键盘在 window 的捕获阶段接管**。控制面板的键盘飞行监听挂在 window 的**冒泡阶段**,
|
|
16
|
+
* 两边真同时监听的话,弹窗里按 ←/→ 翻页会顺带让无人机偏航、Esc 也拦不住任何东西。
|
|
17
|
+
* 所以在捕获阶段就把事件截住(`stopPropagation`),并且**只在弹窗打开时**挂着监听 ——
|
|
18
|
+
* 关闭即摘除,不影响页面其它键盘交互。Ctrl / Cmd / Alt 组合键一律放行,
|
|
19
|
+
* 宿主快捷键与面板的 Ctrl+K 拍照照常工作。
|
|
20
|
+
*/
|
|
21
|
+
import type { CaptureService, CapturedImage } from './drone-capture';
|
|
22
|
+
/** 弹窗查看器构造选项 */
|
|
23
|
+
export interface DroneImageViewerOptions {
|
|
24
|
+
/** 是否注入自带样式,默认 true */
|
|
25
|
+
injectStyles?: boolean;
|
|
26
|
+
/** 弹窗层级,默认 1000(库内面板最高 21,留足余量) */
|
|
27
|
+
zIndex?: number;
|
|
28
|
+
/** 是否提供「下载原图」按钮,默认 true */
|
|
29
|
+
downloadable?: boolean;
|
|
30
|
+
/** 关闭回调(点 × / 点空白 / Esc 都会触发) */
|
|
31
|
+
onClose?: () => void;
|
|
32
|
+
/** 翻页回调 —— 便于宿主把外部状态(如面板选中态)跟着同步 */
|
|
33
|
+
onNavigate?: (image: CapturedImage, index: number) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 影像弹窗查看器。
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* const viewer = new DroneImageViewer(service)
|
|
40
|
+
* viewer.open(image.id) // 打开(第二参不给则用当前会话)
|
|
41
|
+
* viewer.step(1) // 下一张(循环)
|
|
42
|
+
* viewer.close() // 关闭;destroy() 彻底卸载
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* DOM 是**懒挂载**的:构造只记住 service 与选项,第一次 `open()` 才建节点、注入样式、
|
|
46
|
+
* 订阅服务与键盘;`close()` 则整个拆掉(而不是藏起来)—— 于是"弹窗关着"时
|
|
47
|
+
* 它对页面零影响,键盘监听也不在。
|
|
48
|
+
*/
|
|
49
|
+
export declare class DroneImageViewer {
|
|
50
|
+
private readonly service;
|
|
51
|
+
private readonly options;
|
|
52
|
+
private root;
|
|
53
|
+
private refs;
|
|
54
|
+
private unsubscribe;
|
|
55
|
+
private sessionId;
|
|
56
|
+
private imageId;
|
|
57
|
+
/** 上一次渲染的图片下标:当前图被移除时用它顶到相邻位置,而不是跳回第一张 */
|
|
58
|
+
private lastIndex;
|
|
59
|
+
private bodyOverflow;
|
|
60
|
+
private swipeStart;
|
|
61
|
+
/** 滑动翻页后浏览器仍会补一个 click,用它在 onClick 里吃掉那一次 */
|
|
62
|
+
private suppressClick;
|
|
63
|
+
private destroyed;
|
|
64
|
+
/** 构造大图查看弹窗(双击/点遮罩/Esc 关闭) */
|
|
65
|
+
constructor(service: CaptureService, options?: DroneImageViewerOptions);
|
|
66
|
+
/** 弹窗当前是否打开 */
|
|
67
|
+
get isOpen(): boolean;
|
|
68
|
+
/** 当前显示的那张影像(未打开 / 已失效时返回 null) */
|
|
69
|
+
get current(): CapturedImage | null;
|
|
70
|
+
/** 打开弹窗;`sessionId` 缺省用采集服务里当前活跃的会话 */
|
|
71
|
+
open(imageId: string, sessionId?: string): void;
|
|
72
|
+
/** 关闭弹窗(并整个卸载 DOM / 摘掉键盘监听) */
|
|
73
|
+
close(): void;
|
|
74
|
+
/** 翻页:正值向后(下一张),负值向前;越界循环 */
|
|
75
|
+
step(delta: number): void;
|
|
76
|
+
/** 跳到指定下标(负值 = 最后一张) */
|
|
77
|
+
jump(index: number): void;
|
|
78
|
+
/** 下载当前显示的原图 */
|
|
79
|
+
download(): void;
|
|
80
|
+
/** 关闭并移除弹窗 */
|
|
81
|
+
destroy(): void;
|
|
82
|
+
private resolveSession;
|
|
83
|
+
private mount;
|
|
84
|
+
private unmount;
|
|
85
|
+
private render;
|
|
86
|
+
private readonly onClick;
|
|
87
|
+
private readonly onPointerDown;
|
|
88
|
+
private readonly onPointerUp;
|
|
89
|
+
private readonly onPointerCancel;
|
|
90
|
+
private readonly onImageError;
|
|
91
|
+
private readonly onKeyDown;
|
|
92
|
+
private lockScroll;
|
|
93
|
+
private unlockScroll;
|
|
94
|
+
private query;
|
|
95
|
+
private template;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=drone-image-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-image-viewer.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-image-viewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAkB,MAAM,iBAAiB,CAAA;AAGpF,gBAAgB;AAChB,MAAM,WAAW,uBAAuB;IACtC,uBAAuB;IACvB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,oCAAoC;IACpC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3D;AA+HD;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,OAAO,CAAsB;IACrC,0CAA0C;IAC1C,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAA2D;IAC7E,6CAA6C;IAC7C,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAQ;IAEzB,8BAA8B;gBAClB,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,uBAA4B;IAK1E,eAAe;IACf,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,mCAAmC;IACnC,IAAI,OAAO,IAAI,aAAa,GAAG,IAAI,CAIlC;IAED,uCAAuC;IACvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAY/C,+BAA+B;IAC/B,KAAK,IAAI,IAAI;IAOb,6BAA6B;IAC7B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAYzB,wBAAwB;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASzB,gBAAgB;IAChB,QAAQ,IAAI,IAAI;IAMhB,cAAc;IACd,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,KAAK;IA4Cb,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,MAAM;IAiDd,OAAO,CAAC,QAAQ,CAAC,OAAO,CA4BvB;IAED,OAAO,CAAC,QAAQ,CAAC,aAAa,CAU7B;IAED,OAAO,CAAC,QAAQ,CAAC,WAAW,CAS3B;IAED,OAAO,CAAC,QAAQ,CAAC,eAAe,CAE/B;IAED,OAAO,CAAC,QAAQ,CAAC,YAAY,CAM5B;IAED,OAAO,CAAC,QAAQ,CAAC,SAAS,CA+BzB;IAED,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,QAAQ;CAqBjB"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import type { DroneSim } from './drone-sim';
|
|
3
|
+
/**
|
|
4
|
+
* DJI Mini 4 Pro 灯光模拟。
|
|
5
|
+
*
|
|
6
|
+
* 依据《DJI Mini 4 Pro 灯光/灯语说明手册 v1.0》实现三类灯光:
|
|
7
|
+
* 1. 尾部状态指示灯(左右各一颗,常规灯语左右同色;电机启动后按国内固件左红右绿)
|
|
8
|
+
* 2. 智能飞行电池电量指示灯(4 颗 LED)
|
|
9
|
+
* 3. 底部辅助照明灯(Mini 4 Pro 独有:地面上电无法点亮,必须起飞后才能开启)
|
|
10
|
+
*
|
|
11
|
+
* 安装位置(依据手册与实机):
|
|
12
|
+
* 1. 飞行器状态指示灯(Remote ID 识别灯):机尾左右两个机臂末端,左右各 1 颗
|
|
13
|
+
* 2. 电池电量指示灯:机身尾部电池模块的尾面,电源按键旁,横向 4 颗
|
|
14
|
+
* 3. 底部辅助照明灯:机身正下方,紧贴下视视觉传感器,朝下照射
|
|
15
|
+
*
|
|
16
|
+
* 坐标约定:模型局部 -Z 为机头(云台),+Z 为机尾(电池),-X 为左侧、+X 为右侧。
|
|
17
|
+
* 锚点全部取自模型自带语义节点(LED_Status_Tail_* / SENSOR_Glass_Downward / LIGHT_*),
|
|
18
|
+
* 灯组 rig 挂在模型节点下,随模型一起移动旋转;模型自带的 LIGHT_* 点光源也由本模块驱动。
|
|
19
|
+
*/
|
|
20
|
+
/** 尾部状态灯语的键;每键对应 STATUS_PATTERNS 里的一套闪灯时序,由 statusPatternFor 按飞行状态映射 */
|
|
21
|
+
export type StatusLightKey = 'selfCheck' | 'sensorWarmup' | 'gnssNormal' | 'gnssWeak' | 'attiMode' | 'rcLost' | 'lowBattery' | 'criticalBattery' | 'tilted' | 'fcError' | 'compassError' | 'motorRunning' | 'off';
|
|
22
|
+
/** 电池电量灯模式:level=按电量分级点亮,其余为充电/满电/故障/关闭 */
|
|
23
|
+
export type BatteryLightMode = 'level' | 'charging' | 'full' | 'fault' | 'off';
|
|
24
|
+
/** 底部辅助灯模式:auto=夜间低空自动,on=强制开,off=关 */
|
|
25
|
+
export type AuxLightMode = 'auto' | 'on' | 'off';
|
|
26
|
+
/** 灯语的一个时间片段:colors 依次对应 [左灯, 右灯](只给一个颜色时左右同色) */
|
|
27
|
+
export interface LightStep {
|
|
28
|
+
colors: number[];
|
|
29
|
+
onMs: number;
|
|
30
|
+
offMs: number;
|
|
31
|
+
}
|
|
32
|
+
/** 一种灯语的元数据 + 时序(供面板展示,并由 applyStatusPattern 按时间轴驱动) */
|
|
33
|
+
export interface StatusPatternMeta {
|
|
34
|
+
key: StatusLightKey;
|
|
35
|
+
label: string;
|
|
36
|
+
meaning: string;
|
|
37
|
+
uiColor: string;
|
|
38
|
+
steps: LightStep[];
|
|
39
|
+
}
|
|
40
|
+
/** 尾部状态灯语库(与手册第 1 节一一对应) */
|
|
41
|
+
export declare const STATUS_PATTERNS: Record<StatusLightKey, Omit<StatusPatternMeta, 'key'>>;
|
|
42
|
+
/** 供面板渲染的模式列表(保持手册顺序) */
|
|
43
|
+
export declare const STATUS_PATTERN_LIST: StatusPatternMeta[];
|
|
44
|
+
/** 手册第 2 节:电量 -> [常亮数, 闪烁的那一颗索引(从 0 计, null 无)] */
|
|
45
|
+
export declare function batteryLedPlan(levelPercent: number): {
|
|
46
|
+
lit: number;
|
|
47
|
+
blinkIndex: number | null;
|
|
48
|
+
};
|
|
49
|
+
/** 生成电量对应的文字说明,例如 "3 常亮 + 1 闪烁" */
|
|
50
|
+
export declare function describeBatteryLevel(levelPercent: number): string;
|
|
51
|
+
/**
|
|
52
|
+
* 灯语与飞行状态的对应关系(与《Mini 4 Pro 灯光说明》一致)。
|
|
53
|
+
*
|
|
54
|
+
* 纯逻辑:只读 DroneSim 真值,不碰 three,也不碰任何渲染器 —— 所以 three 的 DroneLights
|
|
55
|
+
* 与 Cesium 的机体表现层共用同一份映射,两个后端在同样飞行状态下闪一样的灯。
|
|
56
|
+
* (原先定义在 drone-fly.ts,搬到这里是为了让 Cesium 侧不必 import 整个 three 装配层。)
|
|
57
|
+
*/
|
|
58
|
+
export declare function statusPatternFor(sim: DroneSim): StatusLightKey;
|
|
59
|
+
/** 单颗电量灯的对外快照(给面板做 CSS 动画镜像) */
|
|
60
|
+
export interface BatteryLedSnapshot {
|
|
61
|
+
/** 当前帧是否点亮 */
|
|
62
|
+
on: boolean;
|
|
63
|
+
/** 该灯是否属于"闪烁"角色(供面板用 CSS 动画镜像) */
|
|
64
|
+
blinking: boolean;
|
|
65
|
+
}
|
|
66
|
+
/** 灯光系统的整体快照(面板 100ms 轮询取用) */
|
|
67
|
+
export interface DroneLightsSnapshot {
|
|
68
|
+
statusKey: StatusLightKey;
|
|
69
|
+
statusLabel: string;
|
|
70
|
+
statusMeaning: string;
|
|
71
|
+
batteryMode: BatteryLightMode;
|
|
72
|
+
batteryLevel: number;
|
|
73
|
+
batteryLeds: BatteryLedSnapshot[];
|
|
74
|
+
auxMode: AuxLightMode;
|
|
75
|
+
/** 辅助灯当前是否真的点亮(受起飞状态门控) */
|
|
76
|
+
auxOn: boolean;
|
|
77
|
+
/** 是否处于"地面锁定"(未起飞,辅助灯不可点亮) */
|
|
78
|
+
auxLocked: boolean;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 灯光系统(见文件头):尾部状态灯 / 电池电量灯 / 底部辅助灯,以及模型自带的 LIGHT_* 点光源。
|
|
82
|
+
*
|
|
83
|
+
* ⚠️ 唯一驱动入口是每帧的 update(delta)(由 drone-fly 的 syncPose 调用);
|
|
84
|
+
* setStatusPattern / setBatteryMode 等只登记"意图",真正的灯效在 update 内按时间轴应用。
|
|
85
|
+
*/
|
|
86
|
+
export declare class DroneLights {
|
|
87
|
+
private rig;
|
|
88
|
+
private model;
|
|
89
|
+
private scene;
|
|
90
|
+
private statusLeds;
|
|
91
|
+
private batteryLeds;
|
|
92
|
+
private auxDisc;
|
|
93
|
+
private auxDiscMaterial;
|
|
94
|
+
private auxSpot;
|
|
95
|
+
private auxGlow;
|
|
96
|
+
private auxBeam;
|
|
97
|
+
/** 模型自带的 LIGHT_BottomAssist,强度随辅助灯淡入淡出 */
|
|
98
|
+
private auxModelLight;
|
|
99
|
+
private statusKey;
|
|
100
|
+
private batteryMode;
|
|
101
|
+
/**
|
|
102
|
+
* 底部辅助照明灯的下向光束锥是否绘制(页面"照明光束"勾选框)。
|
|
103
|
+
* 默认 false:辅助灯本身照常工作(聚光灯/灯面/模型点光源),只是不画那根锥形光柱。
|
|
104
|
+
* ⚠️ 这是"每帧被 applyAux() 刷新的显隐",必须存状态字段,不能只改 auxBeam.visible。
|
|
105
|
+
*/
|
|
106
|
+
private beamEnabled;
|
|
107
|
+
private batteryLevel;
|
|
108
|
+
private auxMode;
|
|
109
|
+
private flying;
|
|
110
|
+
private auxOn;
|
|
111
|
+
private auxIntensity;
|
|
112
|
+
private timeMs;
|
|
113
|
+
/** 状态灯珠是否已挂到后机臂折叠节点下(一次性,须在展开态完成) */
|
|
114
|
+
private statusArmsAttached;
|
|
115
|
+
/** 机臂折叠节点引用(按 statusLeds 索引对齐:[0]=右臂,[1]=左臂),供每帧骨骼同步 */
|
|
116
|
+
private statusArmFolds;
|
|
117
|
+
private batteryLedsUi;
|
|
118
|
+
private readonly tmpVector;
|
|
119
|
+
private readonly disposables;
|
|
120
|
+
/** 在模型局部坐标系中构建灯组并挂载到模型节点下 */
|
|
121
|
+
attach(model: THREE.Group, scene: THREE.Scene): void;
|
|
122
|
+
/** 每帧驱动:deltaSeconds */
|
|
123
|
+
update(deltaSeconds: number): void;
|
|
124
|
+
/** 设置状态灯语(仅登记意图,下一帧 update 生效);未知键忽略 */
|
|
125
|
+
setStatusPattern(key: StatusLightKey): void;
|
|
126
|
+
/** 设置电池灯模式(仅登记意图,下一帧 update 生效) */
|
|
127
|
+
setBatteryMode(mode: BatteryLightMode): void;
|
|
128
|
+
/** 设置电量百分比(0~100,越界自动夹紧);到灯珠的映射见 batteryLedPlan */
|
|
129
|
+
setBatteryLevel(levelPercent: number): void;
|
|
130
|
+
/** 设置底部辅助灯模式(仅登记意图;实际点亮还受"已起飞"门控,见 applyAux) */
|
|
131
|
+
setAuxLightMode(mode: AuxLightMode): void;
|
|
132
|
+
/**
|
|
133
|
+
* 底部辅助灯的锥形光束显隐(不影响辅助灯本身的照明)。
|
|
134
|
+
* 立即重算一次,不必等下一帧。
|
|
135
|
+
*/
|
|
136
|
+
setBeamVisible(visible: boolean): void;
|
|
137
|
+
/** 当前是否绘制锥形光束(探针用) */
|
|
138
|
+
isBeamVisible(): boolean;
|
|
139
|
+
/** 由飞行控制器每帧同步:是否已离地起飞 */
|
|
140
|
+
setFlying(flying: boolean): void;
|
|
141
|
+
/**
|
|
142
|
+
* 把尾部状态灯(模型自带灯珠网格 + 点光源)挂到后机臂折叠节点下,跟随折叠/展开运动。
|
|
143
|
+
*
|
|
144
|
+
* 真机(DJI Mini 4 Pro)状态灯位于"后机臂外端末梢",但模型把灯珠网格静态
|
|
145
|
+
* 烘焙在机身坐标系,折叠时灯珠悬空在机外、展开动画中也不跟随。
|
|
146
|
+
* 必须在机臂【展开态】调用一次:此刻灯珠世界位姿正好落在机臂末端
|
|
147
|
+
* (电机钟罩下方的端板),用 Object3D.attach 保持世界变换移挂进折叠节点,
|
|
148
|
+
* 之后随臂折叠、展开、飞行姿态一起运动。
|
|
149
|
+
*
|
|
150
|
+
* ⚠️ 锚点/移挂对象必须是模型自带灯珠网格本体:它挂在 CTRL_DJI_Root 之下,
|
|
151
|
+
* 带着停放配平俯仰,是真实渲染位置。早期版本用自发光克隆体(rig 挂在模型根,
|
|
152
|
+
* 不吃配平俯仰)导致灯珠恒定浮高 sin13.6°×0.73≈0.175m。
|
|
153
|
+
*/
|
|
154
|
+
attachStatusToArms(leftFold: THREE.Object3D | null, rightFold: THREE.Object3D | null): void;
|
|
155
|
+
/**
|
|
156
|
+
* 每帧把状态灯珠按"骨骼绑定位姿"强制同步(骨骼动画式跟随)。
|
|
157
|
+
* 灯珠像焊死在机臂末端一样随折叠/展开运动;任何外力(热更新、调试脚本
|
|
158
|
+
* 挪动、意外重挂)造成的偏移都会在下一帧自动归位。
|
|
159
|
+
*/
|
|
160
|
+
syncStatusToArms(): void;
|
|
161
|
+
/** 灯光系统快照(面板轮询用) */
|
|
162
|
+
getSnapshot(): DroneLightsSnapshot;
|
|
163
|
+
/** 拆除灯组:灯珠/点光源放回出厂父节点、还原共享材质、释放自建资源(漏掉会让热更新重建时找不到灯珠) */
|
|
164
|
+
destroy(): void;
|
|
165
|
+
/**
|
|
166
|
+
* 灯珠自发光材质。
|
|
167
|
+
*
|
|
168
|
+
* ⚠️ 底色必须跟着模型自带贴图走:灯珠网格用的是全机共享的贴图材质,灯位在贴图上就是
|
|
169
|
+
* "灯罩本色"(机臂末端为绿色)。早期版本把 color 写成深色(0x181d21)且不带 map,
|
|
170
|
+
* 结果灯没亮(emissive=0)时整颗灯珠只剩近黑底色,把原模型的绿色灯罩盖成了黑疙瘩。
|
|
171
|
+
*
|
|
172
|
+
* emissiveIntensity 默认按"远距离可辨"的臂尖状态灯取值;近距离成排的灯珠(电池条)应调低,否则过曝糊成一片。
|
|
173
|
+
*
|
|
174
|
+
* ⚠️ 径向亮度梯度(lightCenter/lightRadius 给出时启用),与 Cesium 版 CustomShader 同款:
|
|
175
|
+
* 发光感来自"过曝亮核 + 纯色边缘"的亮度梯度,不是整体提亮 —— 整体 ×2.4 会让红通道削顶、
|
|
176
|
+
* 绿蓝分量抬升,整颗灯变粉(观感"像粉红色")。边缘强度 1.0 保持灯语目标色纯度,
|
|
177
|
+
* 中心过曝 ~3.2 倍成亮核。中心/半径取灯珠网格几何包围球(几何烘在顶点里,包围球即灯珠本体)。
|
|
178
|
+
*/
|
|
179
|
+
private createLedMaterial;
|
|
180
|
+
/**
|
|
181
|
+
* 给自发光材质装上径向亮度梯度(过曝亮核 + 纯色边缘),状态灯/电量灯/辅助灯共用。
|
|
182
|
+
* 几何局部坐标经 varying 传入片元,与网格挂到哪个节点无关(移挂进机臂折叠节点也不受影响)。
|
|
183
|
+
*/
|
|
184
|
+
private installLedGradient;
|
|
185
|
+
/** 点亮/熄灭一颗灯珠:同时驱动自发光材质与模型自带的点光源 */
|
|
186
|
+
private setLed;
|
|
187
|
+
/** 手册第 1 节:尾部状态灯语(左右两颗;常规灯语左右同色,电机启动后左红右绿) */
|
|
188
|
+
private applyStatusPattern;
|
|
189
|
+
/** 手册第 2 节:电池 4 颗 LED */
|
|
190
|
+
private applyBattery;
|
|
191
|
+
/** 手册第 3 节:底部辅助照明灯(地面锁定 + 起飞后才能点亮) */
|
|
192
|
+
private applyAux;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=drone-lights.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-lights.d.ts","sourceRoot":"","sources":["../../src/lib/drone-camera/drone-lights.ts"],"names":[],"mappings":"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"}
|