@realsee/five 6.8.0-alpha.24 → 6.8.0-alpha.26
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/ai_guides/api.md +18 -8
- package/ai_guides/features/event.md +99 -8
- package/ai_guides/features/flowing-light-2d-pass.md +10 -6
- package/ai_guides/features/flowing-light-3d-pass.md +11 -6
- package/ai_guides/features/load-external-model.md +1 -0
- package/ai_guides/features/state.md +2 -2
- package/ai_guides/glossary.md +2 -2
- package/ai_guides/release_notes/6.8.md +1 -0
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/five.AdaptiveLuminancePass.html +1 -1
- package/docs/classes/five.BoundingMesh.html +1 -1
- package/docs/classes/five.Camera.html +1 -1
- package/docs/classes/five.EyeDomeLightingPass.html +1 -1
- package/docs/classes/five.Five.html +48 -48
- package/docs/classes/five.FivePass.html +1 -1
- package/docs/classes/five.InternalWebGLRenderer.html +1 -1
- package/docs/classes/five.Model.html +1 -1
- package/docs/classes/five.ModelScene.html +1 -1
- package/docs/classes/five.NetworkSubscribe.html +1 -1
- package/docs/classes/five.PBMContainer.html +1 -1
- package/docs/classes/five.PBMCustomShader.html +1 -1
- package/docs/classes/five.PBMGSObject.html +1 -1
- package/docs/classes/five.PBMGroup.html +1 -1
- package/docs/classes/five.PBMMesh.html +1 -1
- package/docs/classes/five.PBMMeshMaterial.html +1 -1
- package/docs/classes/five.PBMPanoFilter.html +1 -1
- package/docs/classes/five.PBMPointCloud.html +1 -1
- package/docs/classes/five.PBMPointCloudMaterial.html +1 -1
- package/docs/classes/five.PBMSkinnedMesh.html +1 -1
- package/docs/classes/five.PBMUpdateable.html +1 -1
- package/docs/classes/five.PanoCircleMesh.html +1 -1
- package/docs/classes/five.PanoCircleMeshCustom.html +1 -1
- package/docs/classes/five.PanoCircleMeshSolid.html +1 -1
- package/docs/classes/five.Parameter.html +1 -1
- package/docs/classes/five.Scene.html +1 -1
- package/docs/classes/five.Subscribe.html +1 -1
- package/docs/classes/five.Tile3D.html +1 -1
- package/docs/classes/five.TileNode.html +1 -1
- package/docs/classes/five.TrajectoryNode.html +1 -1
- package/docs/classes/five.WorkResolvedObserver.html +1 -1
- package/docs/classes/gltf-loader.DDSLoader.html +1 -1
- package/docs/classes/gltf-loader.DRACOLoader.html +1 -1
- package/docs/classes/gltf-loader.GLTFLoader.html +1 -1
- package/docs/classes/gltf-loader.GLTFObject.html +1 -1
- package/docs/classes/gltf-loader.THREEGLTFLoader.html +1 -1
- package/docs/classes/line.Line.html +1 -1
- package/docs/classes/line.LineGeometry.html +1 -1
- package/docs/classes/line.LineMaterial.html +1 -1
- package/docs/classes/line.LineSegmentsGeometry.html +1 -1
- package/docs/classes/line.THREE_Line2.html +1 -1
- package/docs/classes/line.THREE_LineSegments2.html +1 -1
- package/docs/classes/plugins.BasePlugin.Controller.html +1 -1
- package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
- package/docs/classes/sticker.Sticker.html +1 -1
- package/docs/classes/vfx.Airflow.html +1 -1
- package/docs/classes/vfx.Flame.html +1 -1
- package/docs/classes/vfx.Particle.html +1 -1
- package/docs/classes/vfx.ParticleGPU.html +1 -1
- package/docs/classes/vfx.SpotLight.html +1 -1
- package/docs/documents/api.html +58 -8
- package/docs/documents/features_event.html +39 -6
- package/docs/documents/features_flowing-light-2d-pass.html +12 -109
- package/docs/documents/features_flowing-light-3d-pass.html +15 -117
- package/docs/documents/features_load-external-model.html +1 -0
- package/docs/documents/features_state.html +1 -1
- package/docs/documents/glossary.html +3 -3
- package/docs/documents/release_notes_6.8.html +1 -0
- package/docs/functions/plugins.GaussianSplattingEntranceAnimationPlugin.html +1 -0
- package/docs/hierarchy.html +1 -1
- package/docs/interfaces/five.AddableObject.html +1 -1
- package/docs/interfaces/five.AjaxOptions.html +1 -1
- package/docs/interfaces/five.BaseEvent.html +5 -5
- package/docs/interfaces/five.BaseExtendableEvent.html +11 -0
- package/docs/interfaces/five.EventCallback.html +45 -43
- package/docs/interfaces/five.FloorplanControllerCustomInitArgs.html +9 -9
- package/docs/interfaces/five.GestureEvent.html +19 -19
- package/docs/interfaces/five.GesturePointer.html +9 -9
- package/docs/interfaces/five.ImageOptions.html +1 -1
- package/docs/interfaces/five.IntersectEvent.html +8 -8
- package/docs/interfaces/five.IntersectMesh.html +1 -1
- package/docs/interfaces/five.IntersectMeshInterface.html +1 -1
- package/docs/interfaces/five.Intersection.html +1 -1
- package/docs/interfaces/five.LooseWorkWithExtrinsics.html +1 -1
- package/docs/interfaces/five.MapviewControllerCustomInitArgs.html +9 -9
- package/docs/interfaces/five.ModeChangeEvent.html +7 -7
- package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.ModelEvent.html +5 -5
- package/docs/interfaces/five.ModelSceneEvent.html +5 -5
- package/docs/interfaces/five.ModelTileEvent.html +5 -5
- package/docs/interfaces/five.MovePanoOptions.html +1 -1
- package/docs/interfaces/five.NetworkAbortError.html +1 -1
- package/docs/interfaces/five.NetworkFirbiddenError.html +1 -1
- package/docs/interfaces/five.NetworkOptions.html +1 -1
- package/docs/interfaces/five.NetworkProxyError.html +1 -1
- package/docs/interfaces/five.NetworkResourceEvent.html +5 -5
- package/docs/interfaces/five.NetworkResponseError.html +1 -1
- package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
- package/docs/interfaces/five.ObjectEvent.html +5 -5
- package/docs/interfaces/five.PBMMaterial.html +1 -1
- package/docs/interfaces/five.PBMMeshMaterialParameters.html +1 -1
- package/docs/interfaces/five.PBMPointCloudMaterialParameters.html +1 -1
- package/docs/interfaces/five.PanoCircleMeshInterface.html +1 -1
- package/docs/interfaces/five.PanoEvent.html +13 -11
- package/docs/interfaces/five.PanoPrepareEvent.html +15 -0
- package/docs/interfaces/five.PanoTextureEvent.html +9 -9
- package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +9 -9
- package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.ParameterMaterialValue.html +1 -1
- package/docs/interfaces/five.ParameterTilesetValue.html +1 -1
- package/docs/interfaces/five.ParameterValue.html +1 -1
- package/docs/interfaces/five.Pose.html +1 -1
- package/docs/interfaces/five.RenderEvent.html +5 -5
- package/docs/interfaces/five.ResolvedParameterValue.html +1 -1
- package/docs/interfaces/five.State.html +1 -1
- package/docs/interfaces/five.StateEvent.html +7 -7
- package/docs/interfaces/five.TextureOptions.html +1 -1
- package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +7 -7
- package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +9 -9
- package/docs/interfaces/five.ViewLayer.html +1 -1
- package/docs/interfaces/five.WorkCubeImage.html +1 -1
- package/docs/interfaces/five.WorkImage.html +1 -1
- package/docs/interfaces/five.WorkObserver.html +1 -1
- package/docs/interfaces/five.WorkObserverProto.html +1 -1
- package/docs/interfaces/five.WorkTile.html +1 -1
- package/docs/interfaces/five.WorksEvent.html +5 -5
- package/docs/interfaces/five.XRControllerEvent.html +8 -8
- package/docs/interfaces/five.XRControllerState.html +4 -4
- package/docs/interfaces/five.XRGestureEvent.html +11 -11
- package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +9 -9
- package/docs/interfaces/five.XRSessionEvent.html +7 -7
- package/docs/interfaces/plugins.BackgroundPluginController.html +1 -1
- package/docs/interfaces/plugins.BackgroundPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.BasePlugin.State.html +1 -1
- package/docs/interfaces/plugins.DynamicPathLinePluginController.html +1 -1
- package/docs/interfaces/plugins.DynamicPathLinePluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.DynamicPathLinePluginType.State.html +1 -1
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationController.html +44 -0
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.BoundingAABB2D.html +3 -0
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.Config.html +8 -0
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +10 -0
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.Keyframe.html +3 -0
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +8 -0
- package/docs/interfaces/plugins.ItemMaskController.html +1 -1
- package/docs/interfaces/plugins.ItemMaskPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.ItemMaskPluginType.State.html +1 -1
- package/docs/interfaces/plugins.OrientationPluginController.html +1 -1
- package/docs/interfaces/plugins.OrientationPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.OrientationPluginType.State.html +1 -1
- package/docs/interfaces/plugins.PanoAnimeController.html +1 -1
- package/docs/interfaces/plugins.PanoAnimePluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.PanoAnimePluginType.State.html +1 -1
- package/docs/interfaces/plugins.PluginTemplateType.EventMap.html +1 -1
- package/docs/interfaces/plugins.PluginTemplateType.State.html +1 -1
- package/docs/interfaces/plugins.TrajectoryController.html +1 -1
- package/docs/interfaces/react.FiveInjectionTypes.html +13 -13
- package/docs/modules/five.html +1 -1
- package/docs/modules/plugins.GaussianSplattingEntranceAnimationPluginType.html +1 -0
- package/docs/modules/plugins.html +1 -1
- package/docs/types/five.ControllerEventTypes.html +22 -20
- package/docs/types/five.EventTypes.html +26 -26
- package/docs/types/five.ParseOptions.html +1 -1
- package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
- package/docs/variables/five.PROXY_CONTROLLER_EVENT_NAMES.html +1 -1
- package/five/application/events.d.ts +1 -1
- package/five/application/five.d.ts +1 -1
- package/five/controllers/events.d.ts +3 -1
- package/five/controllers/panorama.d.ts +1 -1
- package/five/controllers/xrPanorama.d.ts +1 -1
- package/five/index.d.ts +1 -1
- package/five/index.js +64 -61
- package/five/index.mjs +1927 -1692
- package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting.d.ts +8 -0
- package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting_compression_spz.d.ts +4 -4
- package/five/model/loaders/glTF-helpers/extensions/base.d.ts +2 -1
- package/five/model/loaders/glTF-helpers/index.d.ts +2 -0
- package/five/model/loaders/glTF-helpers/parser.d.ts +2 -1
- package/five/utils/error.d.ts +1 -0
- package/five/utils/event.d.ts +14 -0
- package/gltf-loader/index.js +3 -3
- package/gltf-loader/index.mjs +3 -3
- package/line/index.js +3 -3
- package/line/index.mjs +3 -3
- package/package.json +1 -1
- package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.d.ts +30 -0
- package/plugins/GaussianSplattingEntranceAnimationPlugin/index.d.ts +5 -0
- package/plugins/GaussianSplattingEntranceAnimationPlugin/typing.d.ts +28 -0
- package/plugins/index.d.ts +1 -0
- package/plugins/index.js +10 -10
- package/plugins/index.mjs +164 -4
- package/react/index.js +2 -2
- package/react/index.mjs +2 -2
- package/shader-lib/index.js +2 -2
- package/shader-lib/index.mjs +2 -2
- package/sticker/index.js +3 -3
- package/sticker/index.mjs +3 -3
- package/umd/five-gltf-loader.js +3 -3
- package/umd/five-line.js +3 -3
- package/umd/five-plugins.js +10 -10
- package/umd/five-react.js +2 -2
- package/umd/five-shader-lib.js +2 -2
- package/umd/five-sticker.js +3 -3
- package/umd/five-vfx.js +2 -2
- package/umd/five-vue.js +2 -2
- package/umd/five.js +27 -24
- package/vfx/index.js +2 -2
- package/vfx/index.mjs +2 -2
- package/vue/index.js +2 -2
- package/vue/index.mjs +2 -2
- package/work-downloader/index.js +2 -2
- package/work-downloader/index.mjs +2 -2
package/ai_guides/api.md
CHANGED
|
@@ -64,7 +64,7 @@ interface FiveInitArgs {
|
|
|
64
64
|
/** Max FPS limit. false = unlimited. Default: false */
|
|
65
65
|
maxFps?: number | false;
|
|
66
66
|
|
|
67
|
-
/** Mode transition duration in ms. Default:
|
|
67
|
+
/** Mode transition duration in ms. Default: 1000 */
|
|
68
68
|
modeChangeDuration?: number;
|
|
69
69
|
|
|
70
70
|
/** Initial plugins to load. */
|
|
@@ -224,10 +224,15 @@ These events follow a standard naming convention and provide typed event objects
|
|
|
224
224
|
|
|
225
225
|
| Event Name | Description | Payload |
|
|
226
226
|
| :--- | :--- | :--- |
|
|
227
|
-
| `gesture.tap` | Triggered on tap/click. Replaces `wantsTapGesture`. | `
|
|
228
|
-
| `gesture.
|
|
229
|
-
| `gesture.
|
|
230
|
-
| `gesture.
|
|
227
|
+
| `gesture.tap` | Triggered on tap/click. Replaces `wantsTapGesture`. | `GestureEvent` |
|
|
228
|
+
| `gesture.dbltap` | Triggered on double tap/click. | `GestureEvent` |
|
|
229
|
+
| `gesture.pan` | Triggered on pan/drag. | `GestureEvent` |
|
|
230
|
+
| `gesture.pinch` | Triggered on pinch/zoom. | `GestureEvent` |
|
|
231
|
+
| `gesture.press` | Triggered on long press. | `GestureEvent` |
|
|
232
|
+
| `gesture.mousewheel` | Triggered on mouse wheel scroll. | `GestureEvent` |
|
|
233
|
+
| `gesture.mousemove` | Triggered on mouse move. | `GestureEvent` |
|
|
234
|
+
| `gesture.momentum` | Triggered on inertia movement after pan. | `GestureEvent` |
|
|
235
|
+
| `gesture.fire` | Triggered when any gesture event fires. | `GestureEvent` |
|
|
231
236
|
|
|
232
237
|
#### State & Mode
|
|
233
238
|
|
|
@@ -242,12 +247,17 @@ These events follow a standard naming convention and provide typed event objects
|
|
|
242
247
|
| Event Name | Description | Payload |
|
|
243
248
|
| :--- | :--- | :--- |
|
|
244
249
|
| `works.load` | Triggered when work data starts loading. | `WorksEvent` |
|
|
250
|
+
| `works.ready` | Triggered when work data is loaded and controller is ready. | `WorksEvent` |
|
|
245
251
|
| `models.load` | Triggered when models are loaded. | `ModelSceneEvent` |
|
|
246
|
-
| `model.tileLoad` | Triggered when a 3D tile is loaded. | `
|
|
247
|
-
| `model.tileUnload` | Triggered when a 3D tile is unloaded. | `
|
|
252
|
+
| `model.tileLoad` | Triggered when a 3D tile is loaded. | `ModelTileEvent` |
|
|
253
|
+
| `model.tileUnload` | Triggered when a 3D tile is unloaded. | `ModelTileEvent` |
|
|
254
|
+
| `pano.prepare` | Triggered before switching to a new pano. `ExtendableEvent`, supports `waitUntil`. | `PanoPrepareEvent` |
|
|
248
255
|
| `pano.arrived` | Triggered when arrival at a panorama node. | `PanoEvent` |
|
|
249
|
-
| `pano.
|
|
256
|
+
| `pano.moving` | Triggered during pano transition animation. | `PanoEvent` |
|
|
257
|
+
| `pano.error` | Triggered when pano loading or movement fails. | `PanoEvent` |
|
|
258
|
+
| `pano.texture.progress` | Triggered when panorama texture loading progresses. | `PanoTextureEvent` |
|
|
250
259
|
| `render` | Triggered after each render frame. | `RenderEvent` |
|
|
260
|
+
| `render.prepare` | Triggered before each render frame. | `RenderEvent` |
|
|
251
261
|
| `error` | Triggered on internal errors. | `Error` |
|
|
252
262
|
|
|
253
263
|
### Legacy Events (Deprecated)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Events (事件系统)
|
|
2
2
|
|
|
3
3
|
- **Summary**: Five 提供了一套基于发布/订阅模式的事件系统,用于监听用户交互、状态变更、数据加载及渲染生命周期。
|
|
4
|
-
- **Schema**: `on` / `once` / `off`
|
|
5
|
-
- **Concepts**: Gesture Events, State Events, Pano Events, Model Events, Lifecycle Events.
|
|
6
|
-
- **Examples**:
|
|
4
|
+
- **Schema**: `on` / `once` / `off` 接口定义;`BaseEvent` / `BaseExtendableEvent` 事件对象。
|
|
5
|
+
- **Concepts**: Event 对象(`preventDefault` / `waitUntil`)、Gesture Events, State Events, Pano Events, Model Events, Lifecycle Events.
|
|
6
|
+
- **Examples**: 监听全景移动、手势交互及状态变更;使用 `preventDefault` 拦截默认行为;使用 `waitUntil` 延迟点位切换。
|
|
7
7
|
|
|
8
8
|
## Schema
|
|
9
9
|
|
|
@@ -50,6 +50,96 @@ five.off(
|
|
|
50
50
|
- **name**: (可选) 若不传,则清空所有事件;若传,则取消指定类型的事件。
|
|
51
51
|
- **callback**: (可选) 若传,则仅取消该特定的回调函数;若不传,则取消该类型下的所有回调。
|
|
52
52
|
|
|
53
|
+
## Event 对象
|
|
54
|
+
|
|
55
|
+
> **Definition**: [BaseEvent / BaseExtendableEvent](../../five/utils/event.d.ts)
|
|
56
|
+
|
|
57
|
+
Five 中所有事件回调的参数都是一个 Event 对象,分为两种基础类型:
|
|
58
|
+
|
|
59
|
+
### BaseEvent
|
|
60
|
+
|
|
61
|
+
所有事件的基础接口,包含以下属性和方法:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
interface BaseEvent {
|
|
65
|
+
/** 事件类型名称 */
|
|
66
|
+
type: string;
|
|
67
|
+
/** 事件触发时的时间戳 */
|
|
68
|
+
timeStamp: number;
|
|
69
|
+
/** 阻止事件的默认行为 */
|
|
70
|
+
preventDefault(): void;
|
|
71
|
+
/** 是否已调用过 preventDefault */
|
|
72
|
+
readonly defaultPrevented: boolean;
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### BaseExtendableEvent
|
|
77
|
+
|
|
78
|
+
继承自 `BaseEvent`,额外提供 `waitUntil` 方法,用于在事件处理中插入异步等待逻辑:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
interface BaseExtendableEvent extends BaseEvent {
|
|
82
|
+
waitUntil(f: Promise<any>): void;
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
目前 `pano.prepare` 事件使用 `BaseExtendableEvent`(对应 `PanoPrepareEvent`),其余事件均基于 `BaseEvent`。
|
|
87
|
+
|
|
88
|
+
### preventDefault
|
|
89
|
+
|
|
90
|
+
调用 `event.preventDefault()` 可以阻止事件的默认行为。Five 内部会在触发事件后检查 `event.defaultPrevented`,若为 `true` 则跳过后续的默认处理逻辑。
|
|
91
|
+
|
|
92
|
+
比如:
|
|
93
|
+
- `gesture.tap`:阻止默认的点位跳转或相机弹跳动画。
|
|
94
|
+
- `intersect.update`:阻止默认的交互高亮行为。
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// 示例:阻止点击时的默认点位跳转
|
|
98
|
+
five.on("gesture.tap", (event) => {
|
|
99
|
+
if (shouldBlockNavigation()) {
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
// 执行自定义逻辑
|
|
102
|
+
showCustomMenu(event);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// 示例:阻止拖拽时的默认相机旋转
|
|
107
|
+
five.on("gesture.pan", (event) => {
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
// 用拖拽手势实现自定义交互(如绘制标注)
|
|
110
|
+
drawAnnotation(event);
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### waitUntil
|
|
115
|
+
|
|
116
|
+
`waitUntil(promise)` 仅在 `ExtendableEvent` 上可用。调用后,Five 会等待传入的 Promise 完成后再继续后续流程。可多次调用,所有 Promise 会被并行等待。
|
|
117
|
+
|
|
118
|
+
目前仅 `pano.prepare` 事件支持 `waitUntil`。
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// 示例:在切换点位前预加载资源
|
|
122
|
+
five.on("pano.prepare", (event) => {
|
|
123
|
+
// 等待自定义资源加载完成后再继续点位切换
|
|
124
|
+
event.waitUntil(
|
|
125
|
+
loadCustomResources(event.pano)
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// 可以多次调用,所有 Promise 会被并行等待
|
|
129
|
+
event.waitUntil(
|
|
130
|
+
preloadTextures(event.pano)
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// 示例:结合 preventDefault 和 waitUntil 实现条件拦截
|
|
135
|
+
five.on("pano.prepare", async (event) => {
|
|
136
|
+
const allowed = await checkPermission(event.pano);
|
|
137
|
+
if (!allowed) {
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
53
143
|
## Concepts
|
|
54
144
|
|
|
55
145
|
Five 的事件系统将事件主要分为以下几类:
|
|
@@ -68,6 +158,7 @@ Five 的事件系统将事件主要分为以下几类:
|
|
|
68
158
|
### Pano Events (全景导航)
|
|
69
159
|
监听全景图的点位切换过程。
|
|
70
160
|
|
|
161
|
+
- `pano.prepare`: 准备切换到新点位。这是一个 `ExtendableEvent`,支持通过 `waitUntil(promise)` 延迟后续加载流程(如预加载资源)。
|
|
71
162
|
- `pano.arrived`: 成功到达新点位(移动动画结束)。
|
|
72
163
|
- `pano.moving`: 正在移动到新点位(动画进行中)。
|
|
73
164
|
- `pano.willChange`: 即将发生点位变更(旧版兼容)。
|
|
@@ -105,13 +196,13 @@ import { Five } from "@realsee/five";
|
|
|
105
196
|
const five = new Five();
|
|
106
197
|
|
|
107
198
|
// 监听点击事件
|
|
108
|
-
five.on("gesture.tap", (
|
|
109
|
-
console.log("User tapped at:",
|
|
199
|
+
five.on("gesture.tap", (event) => {
|
|
200
|
+
console.log("User tapped at:", event);
|
|
110
201
|
});
|
|
111
202
|
|
|
112
203
|
// 监听点位变更完成
|
|
113
|
-
five.on("pano.arrived", (
|
|
114
|
-
console.log("Arrived at pano
|
|
204
|
+
five.on("pano.arrived", (event) => {
|
|
205
|
+
console.log("Arrived at pano:", event.pano);
|
|
115
206
|
});
|
|
116
207
|
```
|
|
117
208
|
|
|
@@ -150,5 +241,5 @@ five.on("render", onRender);
|
|
|
150
241
|
---
|
|
151
242
|
|
|
152
243
|
```yaml
|
|
153
|
-
tags: [events, interaction, lifecycle, gesture, state]
|
|
244
|
+
tags: [events, interaction, lifecycle, gesture, state, preventDefault, waitUntil]
|
|
154
245
|
```
|
|
@@ -130,7 +130,7 @@ pass.setLines([pathLine]);
|
|
|
130
130
|
### `setLine(params: { id: string } & Partial<Omit<Line, 'id'>>)`
|
|
131
131
|
通过 `id` 修改单条线的参数。支持部分更新,只更新传入的字段。
|
|
132
132
|
|
|
133
|
-
**性能优化**:
|
|
133
|
+
**性能优化**:
|
|
134
134
|
- 如果 `points` 数量不变,只更新 GPU 的 instance attributes,性能极高
|
|
135
135
|
- 如果 `points` 数量改变,会重建整个 mesh,性能开销较大
|
|
136
136
|
|
|
@@ -187,7 +187,7 @@ pass.setLine({
|
|
|
187
187
|
|
|
188
188
|
### 快速上手 (Quick Example)
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
```typescript
|
|
191
191
|
import { Five } from '@realsee/five';
|
|
192
192
|
import { FlowingLight2DPass } from '../../lib/five/renderer/postprocessing';
|
|
193
193
|
import * as THREE from 'three';
|
|
@@ -221,11 +221,12 @@ function animate() {
|
|
|
221
221
|
five.render();
|
|
222
222
|
}
|
|
223
223
|
animate();
|
|
224
|
+
```
|
|
224
225
|
|
|
225
226
|
|
|
226
227
|
### 多条路径 & 动态更新
|
|
227
228
|
|
|
228
|
-
|
|
229
|
+
```typescript
|
|
229
230
|
const pass = new FlowingLight2DPass(five.camera);
|
|
230
231
|
|
|
231
232
|
// 初始路径集合
|
|
@@ -262,7 +263,7 @@ document.addEventListener('click', (e) => {
|
|
|
262
263
|
const rect = five.canvas.getBoundingClientRect();
|
|
263
264
|
const x = (e.clientX - rect.left) / rect.width;
|
|
264
265
|
const y = (e.clientY - rect.top) / rect.height; // 左上角为原点,无需翻转
|
|
265
|
-
|
|
266
|
+
|
|
266
267
|
const newPath = {
|
|
267
268
|
points: [
|
|
268
269
|
new THREE.Vector2(0.5, 0.5),
|
|
@@ -275,11 +276,12 @@ document.addEventListener('click', (e) => {
|
|
|
275
276
|
};
|
|
276
277
|
pass.setLines([...paths, newPath]);
|
|
277
278
|
});
|
|
279
|
+
```
|
|
278
280
|
|
|
279
281
|
|
|
280
282
|
### 计算路径总长度
|
|
281
283
|
|
|
282
|
-
|
|
284
|
+
```typescript
|
|
283
285
|
function calculatePathLength(points: THREE.Vector2[]): number {
|
|
284
286
|
let length = 0;
|
|
285
287
|
for (let i = 1; i < points.length; i++) {
|
|
@@ -303,6 +305,7 @@ const pathLine = {
|
|
|
303
305
|
duration: 2000,
|
|
304
306
|
lineWidth: 0.01,
|
|
305
307
|
};
|
|
308
|
+
```
|
|
306
309
|
|
|
307
310
|
|
|
308
311
|
### 矩形路径示例
|
|
@@ -332,7 +335,7 @@ pass.setLines([rectPath]);
|
|
|
332
335
|
|
|
333
336
|
### 高 DPR 场景优化
|
|
334
337
|
|
|
335
|
-
|
|
338
|
+
```typescript
|
|
336
339
|
// InstancedMesh 实现自动优化高 DPR 性能
|
|
337
340
|
// 在 DPR=2 的 Retina 屏幕上,性能显著优于全屏着色器方案
|
|
338
341
|
|
|
@@ -352,6 +355,7 @@ const paths = Array.from({ length: 10 }, (_, i) => ({
|
|
|
352
355
|
}));
|
|
353
356
|
|
|
354
357
|
pass.setLines(paths);
|
|
358
|
+
```
|
|
355
359
|
|
|
356
360
|
|
|
357
361
|
## Debugging
|
|
@@ -122,7 +122,7 @@ pass.setLines([pathLine]);
|
|
|
122
122
|
### `setLine(params: { id: string } & Partial<Omit<Line, 'id'>>)`
|
|
123
123
|
通过 `id` 修改单条线的参数。支持部分更新,只更新传入的字段。
|
|
124
124
|
|
|
125
|
-
**性能优化**:
|
|
125
|
+
**性能优化**:
|
|
126
126
|
- 如果 `points` 数量不变,只更新 GPU 的 instance attributes,性能极高
|
|
127
127
|
- 如果 `points` 数量改变,会重建整个 mesh,性能开销较大
|
|
128
128
|
|
|
@@ -180,7 +180,7 @@ pass.setLine({
|
|
|
180
180
|
|
|
181
181
|
### 快速上手 (Quick Example)
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
```typescript
|
|
184
184
|
import { Five } from '@realsee/five';
|
|
185
185
|
import { FlowingLight3DPass } from '../../lib/five/renderer/postprocessing';
|
|
186
186
|
import * as THREE from 'three';
|
|
@@ -215,11 +215,12 @@ function animate() {
|
|
|
215
215
|
five.render();
|
|
216
216
|
}
|
|
217
217
|
animate();
|
|
218
|
+
```
|
|
218
219
|
|
|
219
220
|
|
|
220
221
|
### 多条 3D 路径
|
|
221
222
|
|
|
222
|
-
|
|
223
|
+
```typescript
|
|
223
224
|
const pass = new FlowingLight3DPass(camera);
|
|
224
225
|
|
|
225
226
|
const paths = [
|
|
@@ -258,11 +259,12 @@ const paths = [
|
|
|
258
259
|
];
|
|
259
260
|
|
|
260
261
|
pass.setLines(paths);
|
|
262
|
+
```
|
|
261
263
|
|
|
262
264
|
|
|
263
265
|
### 计算 3D 路径长度
|
|
264
266
|
|
|
265
|
-
|
|
267
|
+
```typescript
|
|
266
268
|
function calculatePath3DLength(points: THREE.Vector3[]): number {
|
|
267
269
|
let length = 0;
|
|
268
270
|
for (let i = 1; i < points.length; i++) {
|
|
@@ -284,11 +286,12 @@ const pathLine = {
|
|
|
284
286
|
duration: 3000,
|
|
285
287
|
lineWidth: 3.0,
|
|
286
288
|
};
|
|
289
|
+
```
|
|
287
290
|
|
|
288
291
|
|
|
289
292
|
### 结合相机动画
|
|
290
293
|
|
|
291
|
-
|
|
294
|
+
```typescript
|
|
292
295
|
// 光带路径随相机移动自动投影
|
|
293
296
|
const pass = new FlowingLight3DPass(camera);
|
|
294
297
|
|
|
@@ -309,11 +312,12 @@ five.setState({
|
|
|
309
312
|
mode: Five.Mode.Model,
|
|
310
313
|
// ... 其他参数
|
|
311
314
|
});
|
|
315
|
+
```
|
|
312
316
|
|
|
313
317
|
|
|
314
318
|
### 高 DPR 场景优化
|
|
315
319
|
|
|
316
|
-
|
|
320
|
+
```typescript
|
|
317
321
|
// InstancedMesh 实现自动优化高 DPR 性能
|
|
318
322
|
// 在 DPR=2 的 Retina 屏幕上,性能显著优于全屏着色器方案
|
|
319
323
|
|
|
@@ -333,6 +337,7 @@ const paths = Array.from({ length: 10 }, (_, i) => ({
|
|
|
333
337
|
}));
|
|
334
338
|
|
|
335
339
|
pass.setLines(paths);
|
|
340
|
+
```
|
|
336
341
|
|
|
337
342
|
|
|
338
343
|
## Debugging
|
package/ai_guides/glossary.md
CHANGED
|
@@ -64,10 +64,10 @@ Five 定义的五种浏览状态:
|
|
|
64
64
|
- 拥有独立的 `Parameter` 配置(覆盖上层配置)。
|
|
65
65
|
- 支持可见性控制 (`visible`) 和优先级加载。
|
|
66
66
|
|
|
67
|
-
### Gaussian Splatting
|
|
67
|
+
### Gaussian Splatting
|
|
68
68
|
一种基于点的 3D 渲染技术,通过各向异性高斯球(Splat)来表示场景。
|
|
69
69
|
- 相比传统 Mesh,能更真实地还原复杂光照和细节。
|
|
70
|
-
- Five 支持 `.spz` 和 `.splat` 格式的
|
|
70
|
+
- Five 支持 `.spz` 和 `.splat` 格式的 Gaussian Splatting 渲染。
|
|
71
71
|
|
|
72
72
|
### 3D Tiles Refinement (细化)
|
|
73
73
|
3D Tiles 加载过程中的状态概念:
|
|
@@ -213,6 +213,7 @@ derived_id 的类型从 `number` 改为 `number | string`。
|
|
|
213
213
|
8. 修复 gesture.pan 中第一次并没有 event.isFirst = true 的问题。
|
|
214
214
|
9. 添加自定义着色器 mainPanoColor 插入点,可以修改 pano0Color、pano1Color。
|
|
215
215
|
10. 新增 `parameter.resolveValue('xxx')` 快速获取单个参数的最终值,无需创建完整的 `ResolvedParameterValue` 对象。
|
|
216
|
+
11. 新增 `pano.prepare` 事件(ExtendableEvent),支持通过 `waitUntil(promise)` 在点位切换前插入异步操作。`PanoEvent` 和 `PanoPrepareEvent` 新增 `pano` 字段,包含目标点位信息。
|
|
216
217
|
|
|
217
218
|
## 内部机制改动
|
|
218
219
|
1. glTF 加载 mesh / points 都将直接使用 PBM 材质,而不是作为 PBM_Mesh 扩展形式去替换覆盖使用three内置材质的方式。
|
package/docs/assets/hierarchy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "
|
|
1
|
+
window.hierarchyData = "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"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "
|
|
1
|
+
window.navigationData = "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"
|