@realsee/dnalogel 4.0.0-webgpu.18 → 4.0.0-webgpu.20
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/CHANGELOG.md +10 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.js +19 -19
- package/dist/internal/{BasePlugin-Cr_atQUC.js → BasePlugin-hxM1EHtV.js} +2 -2
- package/dist/internal/{BasePlugin-Cr_atQUC.js.map → BasePlugin-hxM1EHtV.js.map} +1 -1
- package/dist/internal/BasePluginWithData-BS2O9hNu.js +7 -0
- package/dist/internal/{BasePluginWithData-CIQpqYGe.js.map → BasePluginWithData-BS2O9hNu.js.map} +1 -1
- package/dist/internal/{Controller-Cq-mYkzT.js → Controller-CDLmWyXz.js} +3 -3
- package/dist/internal/{Controller-Cq-mYkzT.js.map → Controller-CDLmWyXz.js.map} +1 -1
- package/dist/internal/{Controller-BDT5_ZNe.js → Controller-CxAUW5kD.js} +2 -2
- package/dist/internal/{Controller-BDT5_ZNe.js.map → Controller-CxAUW5kD.js.map} +1 -1
- package/dist/internal/{Controller-5BvatEWD.js → Controller-DSKeCecj.js} +171 -154
- package/dist/internal/Controller-DSKeCecj.js.map +1 -0
- package/dist/internal/PointHelper-G9EgUMWo.js +1052 -0
- package/dist/internal/PointHelper-G9EgUMWo.js.map +1 -0
- package/dist/internal/{Rectangle-Z2T_h74M.js → Rectangle-HB8jF_bX.js} +3 -3
- package/dist/internal/{Rectangle-Z2T_h74M.js.map → Rectangle-HB8jF_bX.js.map} +1 -1
- package/dist/internal/{Work-PKaUMpXd.js → Work-6uuml2Ft.js} +4 -4
- package/dist/internal/{Work-PKaUMpXd.js.map → Work-6uuml2Ft.js.map} +1 -1
- package/dist/internal/{area-maker-BTGqxG6D.js → area-maker-D2ZIYsTG.js} +2 -2
- package/dist/internal/{area-maker-BTGqxG6D.js.map → area-maker-D2ZIYsTG.js.map} +1 -1
- package/dist/internal/{controller-B0hqJtoB.js → controller-DjCi781H.js} +4 -4
- package/dist/internal/{controller-B0hqJtoB.js.map → controller-DjCi781H.js.map} +1 -1
- package/dist/internal/{cruise-BkSbiLjd.js → cruise-DWxq9GTd.js} +2 -2
- package/dist/internal/{cruise-BkSbiLjd.js.map → cruise-DWxq9GTd.js.map} +1 -1
- package/dist/internal/{current-pano-image-DqyUFIP6.js → current-pano-image-DPLm0-o2.js} +2 -2
- package/dist/internal/{current-pano-image-DqyUFIP6.js.map → current-pano-image-DPLm0-o2.js.map} +1 -1
- package/dist/internal/{edgeSnap-8fdFCcXB.js → edgeSnap-CH0HidZm.js} +206 -83
- package/dist/internal/edgeSnap-CH0HidZm.js.map +1 -0
- package/dist/internal/{floorplan-Dkp7omYn.js → floorplan-B6Y-8xjB.js} +2 -2
- package/dist/internal/{floorplan-Dkp7omYn.js.map → floorplan-B6Y-8xjB.js.map} +1 -1
- package/dist/internal/{measure-KVSCjRnS.js → measure-DIstq55p.js} +2 -2
- package/dist/internal/{measure-KVSCjRnS.js.map → measure-DIstq55p.js.map} +1 -1
- package/dist/internal/measure-v2-Byp1mE5q.js +215 -0
- package/dist/internal/measure-v2-Byp1mE5q.js.map +1 -0
- package/dist/internal/{model-maker-L5eqUgkU.js → model-maker-Cea52AmN.js} +2 -2
- package/dist/internal/{model-maker-L5eqUgkU.js.map → model-maker-Cea52AmN.js.map} +1 -1
- package/dist/internal/{model-view-BWUU0-uq.js → model-view-DSRXOhPg.js} +12 -2
- package/dist/internal/model-view-DSRXOhPg.js.map +1 -0
- package/dist/internal/object3d-helper-JrdReT4Y.js +7 -0
- package/dist/internal/{object3d-helper-CUhRRdCQ.js.map → object3d-helper-JrdReT4Y.js.map} +1 -1
- package/dist/internal/{pano-compass-dmcsnFDQ.js → pano-compass-DENjS-F-.js} +2 -2
- package/dist/internal/{pano-compass-dmcsnFDQ.js.map → pano-compass-DENjS-F-.js.map} +1 -1
- package/dist/internal/{pano-door-label-C0sd66vf.js → pano-door-label-DFcBreFx.js} +2 -2
- package/dist/internal/{pano-door-label-C0sd66vf.js.map → pano-door-label-DFcBreFx.js.map} +1 -1
- package/dist/internal/{pano-measure-NbB7-uVE.js → pano-measure-bIqtdQ8N.js} +2 -2
- package/dist/internal/{pano-measure-NbB7-uVE.js.map → pano-measure-bIqtdQ8N.js.map} +1 -1
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js → pano-measure-v2-BRr9Jses.js} +4 -4
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js.map → pano-measure-v2-BRr9Jses.js.map} +1 -1
- package/dist/internal/{pano-tag-j8ZPJDDK.js → pano-tag-BI_eOX_D.js} +2 -2
- package/dist/internal/{pano-tag-j8ZPJDDK.js.map → pano-tag-BI_eOX_D.js.map} +1 -1
- package/dist/internal/{pano-video-Dcspq4j1.js → pano-video-D0dQTeX6.js} +2 -2
- package/dist/internal/{pano-video-Dcspq4j1.js.map → pano-video-D0dQTeX6.js.map} +1 -1
- package/dist/internal/{pipeline-CD2YkN5U.js → pipeline-CyleoezT.js} +2 -2
- package/dist/internal/{pipeline-CD2YkN5U.js.map → pipeline-CyleoezT.js.map} +1 -1
- package/dist/internal/{sculpt-CbEBEh9F.js → sculpt-BGx4Dudb.js} +3 -3
- package/dist/internal/{sculpt-CbEBEh9F.js.map → sculpt-BGx4Dudb.js.map} +1 -1
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure-v2.js +2 -2
- package/dist/plugins/measure.js +2 -2
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/model-view.js +1 -1
- package/dist/plugins/object3d-helper.js +2 -2
- package/dist/plugins/pano-compass.js +1 -1
- package/dist/plugins/pano-door-label.js +1 -1
- package/dist/plugins/pano-measure-v2.js +1 -1
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-tag.js +2 -2
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.js +2 -2
- package/dist/types/MeasurePlugin/Controller.d.ts +7 -0
- package/dist/types/MeasurePlugin/utils/MeasureMesh.d.ts +5 -0
- package/dist/types/MeasurePluginV2/Controller.d.ts +9 -0
- package/dist/types/MeasurePluginV2/Magnifier.d.ts +33 -0
- package/dist/types/MeasurePluginV2/PointOverlay.d.ts +5 -0
- package/dist/types/MeasurePluginV2/closeupView.d.ts +69 -0
- package/dist/types/MeasurePluginV2/normalMeasure.d.ts +116 -0
- package/dist/types/shared-utils/three/Magnifier.d.ts +55 -0
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-CIQpqYGe.js +0 -7
- package/dist/internal/Controller-5BvatEWD.js.map +0 -1
- package/dist/internal/PointHelper-grrf8vu1.js +0 -953
- package/dist/internal/PointHelper-grrf8vu1.js.map +0 -1
- package/dist/internal/edgeSnap-8fdFCcXB.js.map +0 -1
- package/dist/internal/measure-v2-DqjBlSeF.js +0 -83
- package/dist/internal/measure-v2-DqjBlSeF.js.map +0 -1
- package/dist/internal/model-view-BWUU0-uq.js.map +0 -1
- package/dist/internal/object3d-helper-CUhRRdCQ.js +0 -7
|
@@ -20,6 +20,8 @@ export type MeasurePluginEventMap = {
|
|
|
20
20
|
export declare class MeasureController extends Subscribe<MeasurePluginEventMap> {
|
|
21
21
|
readonly name = "MeasurePlugin";
|
|
22
22
|
currentMeasureMesh?: MeasureMesh | null;
|
|
23
|
+
/** 双击快速测量结束后,用命中点继续下一段测量(由当前测量会话提供) */
|
|
24
|
+
protected continueMeasureFrom?: (end: THREE.Vector3) => void;
|
|
23
25
|
private five;
|
|
24
26
|
private group;
|
|
25
27
|
private currentEndReason;
|
|
@@ -50,6 +52,11 @@ export declare class MeasureController extends Subscribe<MeasurePluginEventMap>
|
|
|
50
52
|
* @description Initialize event listeners for all existing meshes
|
|
51
53
|
*/
|
|
52
54
|
initEventListeners: () => void;
|
|
55
|
+
/**
|
|
56
|
+
* 取消所有测量结果的选中态。
|
|
57
|
+
* 组内还并存着预览用的临时对象(点 / 线 / 多边形),它们没有选中态,需要跳过。
|
|
58
|
+
*/
|
|
59
|
+
private unselectAllMeasureMeshes;
|
|
53
60
|
/**
|
|
54
61
|
* @description 开始测量
|
|
55
62
|
*/
|
|
@@ -3,6 +3,11 @@ import { LineWithDotsMesh } from '../../Sculpt/Meshes/LineWithDots.js';
|
|
|
3
3
|
import { PolygonMesh, PolygonStyle } from '../../Sculpt/Meshes/Polygon.js';
|
|
4
4
|
import { LineMeshStyle } from '../../Sculpt/typings/index.js';
|
|
5
5
|
import type * as THREE from 'three/webgpu';
|
|
6
|
+
/**
|
|
7
|
+
* 判断对象是否为测量结果。
|
|
8
|
+
* MeasureGroup 内除测量结果外还并存着预览用的临时对象(点 / 线 / 多边形),它们没有选中态等测量接口。
|
|
9
|
+
*/
|
|
10
|
+
export declare function isMeasureMesh(item: unknown): item is MeasureMesh;
|
|
6
11
|
export declare class MeasureMesh extends IObject3D {
|
|
7
12
|
readonly name = "MeasureMesh";
|
|
8
13
|
readonly isMeasureMesh = true;
|
|
@@ -21,6 +21,11 @@ export type MeasurePluginV2Config = MeasurePluginConfig & {
|
|
|
21
21
|
* 传 `false` 可关闭;不传默认开启。
|
|
22
22
|
*/
|
|
23
23
|
edgeSnap?: boolean | EdgeSnapOptions;
|
|
24
|
+
/**
|
|
25
|
+
* @description 双击快速测量(仅鼠标):双击起点时沿所在平面的法线测到对面,例如墙到对面墙。
|
|
26
|
+
* 传 `false` 可关闭;不传默认开启。
|
|
27
|
+
*/
|
|
28
|
+
quickMeasure?: boolean;
|
|
24
29
|
};
|
|
25
30
|
export declare class MeasureControllerV2 extends MeasureController {
|
|
26
31
|
/** 最近一次查询到的候选边数量,示例页 / 调试用 */
|
|
@@ -30,6 +35,8 @@ export declare class MeasureControllerV2 extends MeasureController {
|
|
|
30
35
|
private v2Attached;
|
|
31
36
|
private readonly edgeSnapOptions;
|
|
32
37
|
private readonly edgeSnapCache;
|
|
38
|
+
private readonly quickMeasureEnabled;
|
|
39
|
+
private quickMeasure?;
|
|
33
40
|
constructor(five: Five, config?: MeasurePluginV2Config);
|
|
34
41
|
get edgeSnapEnabled(): boolean;
|
|
35
42
|
/** 运行时开关模型边缘吸附(不需要重开测量) */
|
|
@@ -41,6 +48,8 @@ export declare class MeasureControllerV2 extends MeasureController {
|
|
|
41
48
|
private attachOverlayRenderers;
|
|
42
49
|
private attachMagnifier;
|
|
43
50
|
private attachPointHelper;
|
|
51
|
+
/** 双击快速测量:只在测量过程中生效,选点链路仍由原 MeasureController 负责 */
|
|
52
|
+
private attachQuickMeasure;
|
|
44
53
|
/**
|
|
45
54
|
* 模型边缘吸附:每次选点器计算吸附前,按当前落点取附近的模型边界线。
|
|
46
55
|
* 真正的吸附判断(3D 距离 / 屏幕距离)仍在 PointSelector 里,这里只负责供线。
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import { Five } from '@realsee/five-webgpu';
|
|
2
2
|
import { PointIntersection } from '../shared-utils/index.js';
|
|
3
3
|
import { Magnifier, MagnifierParameter } from '../shared-utils/three/Magnifier.js';
|
|
4
|
+
export { CLOSEUP_DISTANCE } from './closeupView.js';
|
|
5
|
+
/** 近景取景方式;与 Editor V2 保持同一套语义 */
|
|
6
|
+
export type MeasureCloseupMode =
|
|
7
|
+
/** 只旋转、不平移:与主视图共用机位,无新增视差;默认 */
|
|
8
|
+
'rotate'
|
|
9
|
+
/** 旧行为:把相机推到落点附近 0.6m,再朝法线偏转;放大倍率高,但会产生视差 */
|
|
10
|
+
| 'push'
|
|
11
|
+
/** 完全沿用主相机,只放大局部像素 */
|
|
12
|
+
| 'off';
|
|
4
13
|
export interface MeasureMagnifierOptions extends MagnifierParameter {
|
|
5
14
|
/** 是否绘制坐标轴 / 平面框叠加层,默认 true(关掉后行为与现状 Magnifier 完全一致) */
|
|
6
15
|
overlayEnabled?: boolean;
|
|
16
|
+
/** 兼容旧参数:false 等价于 closeupMode='off' */
|
|
17
|
+
closeupEnabled?: boolean;
|
|
18
|
+
/** 近景取景方式,默认 'rotate' */
|
|
19
|
+
closeupMode?: MeasureCloseupMode;
|
|
7
20
|
}
|
|
8
21
|
/**
|
|
9
22
|
* 量尺 V2 用的放大镜。
|
|
@@ -19,11 +32,31 @@ export declare class MeasureMagnifier extends Magnifier {
|
|
|
19
32
|
/** 由 PointSelector 的 intersectionUpdate 事件注入 */
|
|
20
33
|
private overlayIntersection;
|
|
21
34
|
private overlayEnabled;
|
|
35
|
+
private closeupMode;
|
|
36
|
+
/** 本次渲染实际使用的相机(推近后的副本),叠加层投影必须和它一致 */
|
|
37
|
+
private overlayCamera;
|
|
38
|
+
/** 近景视角的平滑状态 */
|
|
39
|
+
private closeupState;
|
|
22
40
|
constructor(five: Five, options?: MeasureMagnifierOptions);
|
|
23
41
|
/** 每次交点更新时调用;传 null 表示当前没有命中任何模型 */
|
|
24
42
|
setIntersection(intersection: PointIntersection | null): void;
|
|
25
43
|
/** 开关叠加层,用于灰度 / 排查问题 */
|
|
26
44
|
setOverlayEnabled(enabled: boolean): void;
|
|
45
|
+
/** 开关近景 3D 视角,用于灰度 / 对比;开启时使用默认的 rotate 模式 */
|
|
46
|
+
setCloseupEnabled(enabled: boolean): void;
|
|
47
|
+
/** 切换近景取景方式,用于三种模式的对比 */
|
|
48
|
+
setCloseupMode(mode: MeasureCloseupMode): void;
|
|
49
|
+
getCloseupMode(): MeasureCloseupMode;
|
|
27
50
|
private renderOverlay;
|
|
51
|
+
/**
|
|
52
|
+
* 近景 3D 视角:读像素前把相机推到落点附近,并让视线朝落点所在表面的法线偏一点
|
|
53
|
+
* (斜向 / 侧向的表面在放大镜里以更接近正面的角度呈现),读完立即还原。
|
|
54
|
+
* 姿态由主相机绕落点做最小旋转得到:偏转角有上限、画面不翻滚,
|
|
55
|
+
* 相机始终朝向落点,落点因此仍在画面正中,父类按落点投影取的读取区域依旧对准落点。
|
|
56
|
+
*/
|
|
57
|
+
private prepareCloseup;
|
|
58
|
+
private moveCameraCloseup;
|
|
59
|
+
/** 只记录投影要用的矩阵;Five 的相机 clone() 开销大,也不保证可用 */
|
|
60
|
+
private snapshotOverlayCamera;
|
|
28
61
|
private getOverlayContext;
|
|
29
62
|
}
|
|
@@ -53,6 +53,11 @@ export interface MagnifierViewport {
|
|
|
53
53
|
/** 放大镜 canvas 的宽高(设备像素) */
|
|
54
54
|
canvasWidth: number;
|
|
55
55
|
canvasHeight: number;
|
|
56
|
+
/**
|
|
57
|
+
* 叠加层线宽缩放:canvas 设备像素 / CSS 像素。
|
|
58
|
+
* 高清读回时 canvas 变大,固定线宽需要同步放大,否则轴线和平面框会变细。
|
|
59
|
+
*/
|
|
60
|
+
lineScale?: number;
|
|
56
61
|
}
|
|
57
62
|
/**
|
|
58
63
|
* 求交点的世界坐标系法线。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as THREE from 'three/webgpu';
|
|
2
|
+
/**
|
|
3
|
+
* 放大镜近景视角的取向计算。
|
|
4
|
+
*
|
|
5
|
+
* 目标(与 MP 的观感一致):放大镜不是主视图的简单放大。落点所在表面没有正对相机时,
|
|
6
|
+
* 视角会朝表面法线偏一点,让斜面 / 侧面在放大镜里以更接近正面的角度呈现;
|
|
7
|
+
* 同时要保证它始终是「主视图那台相机绕落点转了一点」——不换机位、不翻滚、偏转角有上限。
|
|
8
|
+
*
|
|
9
|
+
* 这里只做纯数学,相机怎么临时改、怎么还原由调用方负责。
|
|
10
|
+
*/
|
|
11
|
+
/** 近景相机到落点的距离(米) */
|
|
12
|
+
export declare const CLOSEUP_DISTANCE = 0.6;
|
|
13
|
+
/** 朝表面转正的比例:把「主视线到正对表面」的夹角消掉这么多 */
|
|
14
|
+
export declare const CLOSEUP_NORMAL_BLEND = 0.5;
|
|
15
|
+
/** 近景视角相对主视图的最大偏转角(弧度)。超过就封顶,避免侧视时像换了个机位 */
|
|
16
|
+
export declare const CLOSEUP_MAX_DEVIATION: number;
|
|
17
|
+
/** 判定法线朝向时的滞回区间(点积):视线接近贴着表面时沿用上一帧朝向,避免来回翻 */
|
|
18
|
+
export declare const CLOSEUP_FLIP_EPSILON = 0.05;
|
|
19
|
+
/** 跨帧状态:目前只用于法线朝向的滞回 */
|
|
20
|
+
export interface CloseupViewState {
|
|
21
|
+
/** 本帧的视线方向(单位向量) */
|
|
22
|
+
direction: THREE.Vector3;
|
|
23
|
+
/** 本帧的落点 */
|
|
24
|
+
point: THREE.Vector3;
|
|
25
|
+
/** 本帧法线的朝向:1 = 与传入的法线同向,-1 = 反向,null = 没有法线 */
|
|
26
|
+
normalSign: 1 | -1 | null;
|
|
27
|
+
}
|
|
28
|
+
export interface CloseupViewOptions {
|
|
29
|
+
/** 落点(世界坐标) */
|
|
30
|
+
point: THREE.Vector3;
|
|
31
|
+
/** 落点所在表面的法线(世界坐标,方向不限);拿不到时传 null,只推近不偏转 */
|
|
32
|
+
normal: THREE.Vector3 | null;
|
|
33
|
+
/** 主相机位置 */
|
|
34
|
+
cameraPosition: THREE.Vector3;
|
|
35
|
+
/** 主相机世界四元数;近景姿态由它绕落点做最小旋转得到,因此不会翻滚 */
|
|
36
|
+
cameraQuaternion: THREE.Quaternion;
|
|
37
|
+
/** 近景距离,默认 CLOSEUP_DISTANCE;主相机比这更近时保持原距离。translate=false 时忽略 */
|
|
38
|
+
distance?: number;
|
|
39
|
+
/**
|
|
40
|
+
* 是否把相机沿最终视线移动到落点附近。
|
|
41
|
+
* true = 旧行为(推到 0.6m);false = 只旋转、不平移,放大镜与主视图共用同一机位,
|
|
42
|
+
* 不会产生视差,也不会让全景球心偏移导致画面扭曲。
|
|
43
|
+
*/
|
|
44
|
+
translate?: boolean;
|
|
45
|
+
/** 朝法线偏转的比例,默认 CLOSEUP_NORMAL_BLEND */
|
|
46
|
+
blend?: number;
|
|
47
|
+
/** 最大偏转角(弧度),默认 CLOSEUP_MAX_DEVIATION */
|
|
48
|
+
maxDeviation?: number;
|
|
49
|
+
/** 上一帧的状态,只用于法线朝向的滞回;第一帧传 null */
|
|
50
|
+
previous?: CloseupViewState | null;
|
|
51
|
+
}
|
|
52
|
+
export interface CloseupView {
|
|
53
|
+
/** 近景相机位置 */
|
|
54
|
+
position: THREE.Vector3;
|
|
55
|
+
/** 近景相机视线方向(单位向量) */
|
|
56
|
+
direction: THREE.Vector3;
|
|
57
|
+
/** 近景相机世界四元数(视线方向与 direction 一致,roll 由主相机继承) */
|
|
58
|
+
quaternion: THREE.Quaternion;
|
|
59
|
+
/** 供下一次调用使用的状态 */
|
|
60
|
+
state: CloseupViewState;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 计算近景相机的位姿:
|
|
64
|
+
* 1. translate=true 时相机落在「落点后方 distance 处、朝向落点」这条线上,落点因此仍在画面正中;
|
|
65
|
+
* translate=false 时保持原机位,只改变朝向(放大镜与主视图共用视点,不产生视差);
|
|
66
|
+
* 2. 姿态 = 主相机姿态先把视线校正到落点,再朝「正对表面」的方向转一小段(有上限);
|
|
67
|
+
* 3. 因为是绕相机的旋转,画面不会翻滚,观感就是「同一台相机微微转了个角度」。
|
|
68
|
+
*/
|
|
69
|
+
export declare function resolveCloseupView(options: CloseupViewOptions): CloseupView | null;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as THREE from 'three/webgpu';
|
|
2
|
+
/**
|
|
3
|
+
* 双击快速测量:从落点沿所在平面的法线发一条射线,取第一个打到的模型表面作为终点。
|
|
4
|
+
* 典型场景是双击墙面直接得到墙到对面墙的垂直距离。
|
|
5
|
+
*/
|
|
6
|
+
/** 射线起点离开表面的距离(米),避免射线一出发就打中落点所在的面 */
|
|
7
|
+
export declare const NORMAL_RAY_START_OFFSET = 0.01;
|
|
8
|
+
/** 终点离起点太近(米)视为无效,例如打中了落点旁边的小凸起 */
|
|
9
|
+
export declare const NORMAL_RAY_MIN_DISTANCE = 0.02;
|
|
10
|
+
/** 射线最远距离(米),超过视为没打到 */
|
|
11
|
+
export declare const NORMAL_RAY_MAX_DISTANCE = 100;
|
|
12
|
+
/** 双击判定:两次抬起的最大间隔(毫秒) */
|
|
13
|
+
export declare const DOUBLE_CLICK_INTERVAL = 350;
|
|
14
|
+
/** 双击判定:两次抬起的最大屏幕距离(像素) */
|
|
15
|
+
export declare const DOUBLE_CLICK_MAX_MOVE = 6;
|
|
16
|
+
export interface RaycastHit {
|
|
17
|
+
point: THREE.Vector3;
|
|
18
|
+
distance: number;
|
|
19
|
+
/** 命中面;THREE.Intersection 的 face.normal 已经是世界坐标系法线 */
|
|
20
|
+
face?: {
|
|
21
|
+
normal?: THREE.Vector3 | null;
|
|
22
|
+
} | null;
|
|
23
|
+
}
|
|
24
|
+
/** 法线快速测量的命中结果 */
|
|
25
|
+
export interface NormalMeasureHit {
|
|
26
|
+
/** 终点 */
|
|
27
|
+
point: THREE.Vector3;
|
|
28
|
+
/** 终点所在表面的世界坐标系法线;拿不到时为 null */
|
|
29
|
+
normal: THREE.Vector3 | null;
|
|
30
|
+
}
|
|
31
|
+
/** 对模型做射线检测,返回按距离排序的命中结果 */
|
|
32
|
+
export type ModelRaycast = (raycaster: THREE.Raycaster) => RaycastHit[];
|
|
33
|
+
/**
|
|
34
|
+
* 沿法线求快速测量的命中点。
|
|
35
|
+
* @param point - 起点(双击的落点)
|
|
36
|
+
* @param normal - 起点所在平面的法线(世界坐标,朝向表面外侧,即朝向相机这一侧)
|
|
37
|
+
* @returns 命中点及其表面法线;法线无效或没打到模型时返回 null
|
|
38
|
+
*/
|
|
39
|
+
export declare function findNormalMeasureHit(point: THREE.Vector3, normal: THREE.Vector3, raycast: ModelRaycast): NormalMeasureHit | null;
|
|
40
|
+
/** 只要终点时用这个 */
|
|
41
|
+
export declare function findNormalMeasureEnd(point: THREE.Vector3, normal: THREE.Vector3, raycast: ModelRaycast): THREE.Vector3 | null;
|
|
42
|
+
/**
|
|
43
|
+
* 识别「第二下点在刚打下的点上」的双击。
|
|
44
|
+
* 只记录上一次抬起的时间和屏幕位置;时间和位置都足够近才算双击,命中后清空,三连击不会触发两次。
|
|
45
|
+
*/
|
|
46
|
+
export declare class DoubleClickDetector {
|
|
47
|
+
private readonly interval;
|
|
48
|
+
private readonly maxMove;
|
|
49
|
+
private last;
|
|
50
|
+
constructor(interval?: number, maxMove?: number);
|
|
51
|
+
/** 每次单击抬起时调用;返回 true 表示与上一次构成双击 */
|
|
52
|
+
hit(x: number, y: number, time: number): boolean;
|
|
53
|
+
reset(): void;
|
|
54
|
+
}
|
|
55
|
+
/** 双击时第二下离起点的最大屏幕距离(像素)。起点可能被吸附偏离光标几像素,所以比双击判定宽一些 */
|
|
56
|
+
export declare const START_POINT_HIT_RADIUS = 16;
|
|
57
|
+
interface QuickMeasureCamera {
|
|
58
|
+
position: THREE.Vector3;
|
|
59
|
+
}
|
|
60
|
+
export interface QuickNormalMeasureOptions {
|
|
61
|
+
/** 当前相机;朝向判断和屏幕投影都用它 */
|
|
62
|
+
getCamera: () => THREE.Camera & QuickMeasureCamera;
|
|
63
|
+
/** five 画布,用来把世界坐标换算成屏幕坐标 */
|
|
64
|
+
getElement: () => HTMLElement | null | undefined;
|
|
65
|
+
/** 对模型做射线检测 */
|
|
66
|
+
raycast: ModelRaycast;
|
|
67
|
+
/** 正在测量的点;不在测量中返回 null */
|
|
68
|
+
getMeasuringPoints: () => THREE.Vector3[] | null;
|
|
69
|
+
/**
|
|
70
|
+
* 打到对面:用起点和终点生成测量。
|
|
71
|
+
* 返回 true 表示测量会话继续(控制器以终点作为下一段的起点),此时命中面的法线会留作下一段的起始法线。
|
|
72
|
+
*/
|
|
73
|
+
finish: (start: THREE.Vector3, end: THREE.Vector3) => boolean | void;
|
|
74
|
+
/** 没打到:撤掉起点,回到未打点状态 */
|
|
75
|
+
cancelStart: () => void;
|
|
76
|
+
}
|
|
77
|
+
/** 由 PointSelector 的 wantsSelect 事件驱动,返回 false 表示取消这次选点 */
|
|
78
|
+
type WantsSelectHandler = (intersection?: {
|
|
79
|
+
point?: THREE.Vector3;
|
|
80
|
+
face?: {
|
|
81
|
+
normal?: THREE.Vector3 | null;
|
|
82
|
+
} | null;
|
|
83
|
+
} | null) => boolean | void;
|
|
84
|
+
/**
|
|
85
|
+
* 双击快速测量(只处理鼠标,触屏不触发)。
|
|
86
|
+
*
|
|
87
|
+
* 规则与 MP 一致:
|
|
88
|
+
* - 第一下单击照常打下起点 A,不延迟;第二下在双击时间内又点在 A 上,就从 A 沿法线测到对面,直接完成这条测量;
|
|
89
|
+
* - A 已经打下一段时间后,再双击 A 也会快速测量:落在 A 上的单击不会再打一个重合的点;
|
|
90
|
+
* - 已经开始连线(两个点及以上)时双击按普通单击处理;法线没打到模型时撤掉 A,不生成测量;
|
|
91
|
+
* - 快速测量完成后不退出选点:控制器以命中点为新一段的起点(finish 返回 true),继续选择下一个点位。
|
|
92
|
+
*/
|
|
93
|
+
export declare class QuickNormalMeasure {
|
|
94
|
+
private readonly options;
|
|
95
|
+
private readonly detector;
|
|
96
|
+
private lastMouseUp;
|
|
97
|
+
/** 起点 A 所在平面的法线,在打下 A 的那次选点里记下 */
|
|
98
|
+
private startNormal;
|
|
99
|
+
private attached;
|
|
100
|
+
constructor(options: QuickNormalMeasureOptions);
|
|
101
|
+
attach(pointSelector: {
|
|
102
|
+
on: (name: 'wantsSelect', callback: WantsSelectHandler) => unknown;
|
|
103
|
+
}): void;
|
|
104
|
+
detach(pointSelector: {
|
|
105
|
+
off: (name: 'wantsSelect', callback: WantsSelectHandler) => unknown;
|
|
106
|
+
}): void;
|
|
107
|
+
reset(): void;
|
|
108
|
+
private onMouseUp;
|
|
109
|
+
private onWantsSelect;
|
|
110
|
+
/** 只认刚刚发生的鼠标抬起,用完即清,避免触屏选点误用上一次鼠标的位置 */
|
|
111
|
+
private consumeMouseUp;
|
|
112
|
+
private isOnStartPoint;
|
|
113
|
+
/** 面法线可能朝向表面内侧;射线要往相机这一侧(空的一侧)发 */
|
|
114
|
+
private orientTowardCamera;
|
|
115
|
+
}
|
|
116
|
+
export {};
|
|
@@ -18,11 +18,34 @@ interface MagnifierConfig {
|
|
|
18
18
|
interface MagnifierEvent extends SubscribeEventMap {
|
|
19
19
|
wantsPanGesture: (event: (typeof Hammer)['Input']) => boolean;
|
|
20
20
|
}
|
|
21
|
+
/** 自适应取景窗口参数 */
|
|
22
|
+
export interface AdaptiveReadWindowOptions {
|
|
23
|
+
/** 放大镜内希望覆盖的世界宽度(米),默认 0.25 */
|
|
24
|
+
worldSize?: number;
|
|
25
|
+
/** 最大光学倍率(相对主视图),默认 8 */
|
|
26
|
+
maxZoom?: number;
|
|
27
|
+
/** 取景窗口允许的最小像素,避免倍率过高把贴图放大成色块,默认 24 */
|
|
28
|
+
minWindowPx?: number;
|
|
29
|
+
/** 窗口变化的平滑系数(0~1),越小越稳,默认 0.25 */
|
|
30
|
+
smoothing?: number;
|
|
31
|
+
}
|
|
21
32
|
/** 放大镜配置参数 */
|
|
22
33
|
export interface MagnifierParameter extends Partial<MagnifierConfig> {
|
|
23
34
|
width?: number;
|
|
24
35
|
height?: number;
|
|
25
36
|
scale?: number;
|
|
37
|
+
/**
|
|
38
|
+
* 读回像素的分辨率倍数(相对 CSS 像素)。
|
|
39
|
+
* 1 = 旧行为;2 = 按设备像素读回,retina 上不再被浏览器二次放大。
|
|
40
|
+
* 默认 1,只有显式传入才改变;读回失败会自动降级回 1。
|
|
41
|
+
*/
|
|
42
|
+
readPixelsPixelRatio?: number;
|
|
43
|
+
/**
|
|
44
|
+
* 自适应取景窗口:按落点距离动态缩小取景区域,让放大镜里看到的物体大小
|
|
45
|
+
* 基本恒定,远点也能得到真正的光学放大。传 true 使用默认参数;
|
|
46
|
+
* 不传 / false 时保持旧的固定倍率行为。
|
|
47
|
+
*/
|
|
48
|
+
adaptiveReadWindow?: boolean | AdaptiveReadWindowOptions;
|
|
26
49
|
}
|
|
27
50
|
/** 像素读回并绘制到放大镜 canvas 之后,供插件叠加 2D 内容使用的渲染信息 */
|
|
28
51
|
export interface MagnifierRenderInfo {
|
|
@@ -53,8 +76,15 @@ export declare class Magnifier {
|
|
|
53
76
|
state: {
|
|
54
77
|
enabled: boolean;
|
|
55
78
|
};
|
|
79
|
+
/** 读回像素的分辨率倍数;运行时可能因读回失败被降级为 1 */
|
|
80
|
+
readPixelsPixelRatio: number;
|
|
56
81
|
/** 像素绘制完成后的回调(默认不设置,原行为不变) */
|
|
57
82
|
afterRender?: (info: MagnifierRenderInfo) => void;
|
|
83
|
+
/** 每次读取像素前调整 five 场景;返回的函数在同步渲染提交后立即执行 */
|
|
84
|
+
beforeRender?: (renderCenter: THREE.Vector3 | {
|
|
85
|
+
x: number;
|
|
86
|
+
y: number;
|
|
87
|
+
}) => (() => void) | void;
|
|
58
88
|
private five;
|
|
59
89
|
private scale;
|
|
60
90
|
private offset;
|
|
@@ -68,6 +98,12 @@ export declare class Magnifier {
|
|
|
68
98
|
private pendingRender?;
|
|
69
99
|
private renderRevision;
|
|
70
100
|
private invalidatedRevision;
|
|
101
|
+
/** 自适应取景参数 */
|
|
102
|
+
private adaptiveReadWindow;
|
|
103
|
+
/** 平滑后的取景窗口(CSS 像素),0 表示还没初始化 */
|
|
104
|
+
private smoothedReadWindowPx;
|
|
105
|
+
/** 读回失败后关闭自适应,退回旧的固定窗口 */
|
|
106
|
+
private adaptiveDisabled;
|
|
71
107
|
constructor(five: Five, options: MagnifierParameter);
|
|
72
108
|
enable(): this;
|
|
73
109
|
disable(): this;
|
|
@@ -86,10 +122,29 @@ export declare class Magnifier {
|
|
|
86
122
|
resetOffset(): void;
|
|
87
123
|
/** 更新放大镜的缩放比例 */
|
|
88
124
|
updateScale(newScale: number): void;
|
|
125
|
+
/** 更新读回分辨率倍数;V2 用它按设备像素渲染,读回失败的机型会自动降级 */
|
|
126
|
+
setReadPixelsPixelRatio(ratio: number): void;
|
|
127
|
+
/** 是否让放大镜强制渲染模型(true)还是沿用主视图的全景 / 模型状态(false) */
|
|
128
|
+
setSkipPanorama(enabled: boolean): void;
|
|
129
|
+
/** 运行时开关自适应取景,用于对比新旧行为 */
|
|
130
|
+
setAdaptiveReadWindow(enabled: boolean | AdaptiveReadWindowOptions): void;
|
|
131
|
+
getReadPixelsPixelRatio(): number;
|
|
89
132
|
/** 更新放大镜的尺寸 */
|
|
90
133
|
updateSize(newWidth: number, newHeight?: number): void;
|
|
91
134
|
render(): Promise<void>;
|
|
92
135
|
private renderLatest;
|
|
136
|
+
/** 旧的固定窗口:始终取 width / scale 大小的屏幕区域,倍率恒为 scale */
|
|
137
|
+
private getBaseReadWindow;
|
|
138
|
+
private isAdaptiveActive;
|
|
139
|
+
/**
|
|
140
|
+
* 按落点距离计算本帧取景窗口:放大镜里始终覆盖固定大小的世界范围,
|
|
141
|
+
* 远点取景窗口更小、光学倍率更高,近点退化为旧的固定窗口。
|
|
142
|
+
*/
|
|
143
|
+
private getReadWindow;
|
|
144
|
+
/** 由取景宽度反推读回倍率,让 canvas 的设备像素尺寸与旧版保持一致 */
|
|
145
|
+
private frameFromReadWidth;
|
|
146
|
+
/** 落点到相机的距离;屏幕坐标模式下无法计算,返回 undefined */
|
|
147
|
+
private getDistanceToCamera;
|
|
93
148
|
private _appendTo;
|
|
94
149
|
private autoFixPCPosition;
|
|
95
150
|
private initStyle;
|
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as e } from "./internal/transformPosition-Cc92Wf0o.js";
|
|
2
2
|
import { t } from "./internal/Subscribe-DLlAl88n.js";
|
|
3
|
-
import { c as n, g as r, r as i } from "./internal/PointHelper-
|
|
3
|
+
import { c as n, g as r, r as i } from "./internal/PointHelper-G9EgUMWo.js";
|
|
4
4
|
import { a, d as o, f as s, t as c } from "./internal/generatePolygonGeometry-DEr9kX3D.js";
|
|
5
5
|
import { n as l } from "./internal/fiveModelLoad-BUIBYxzp.js";
|
|
6
6
|
import { a as u, i as d, n as f, t as p } from "./internal/util-vGeVT4oo.js";
|
package/package.json
CHANGED