@realsee/five 6.8.0-alpha.25 → 6.8.0-alpha.27

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.
Files changed (211) hide show
  1. package/ai_guides/api.md +18 -8
  2. package/ai_guides/features/event.md +104 -8
  3. package/ai_guides/features/flowing-light-2d-pass.md +10 -6
  4. package/ai_guides/features/flowing-light-3d-pass.md +11 -6
  5. package/ai_guides/features/load-external-model.md +1 -0
  6. package/ai_guides/features/state.md +2 -2
  7. package/ai_guides/glossary.md +2 -2
  8. package/ai_guides/release_notes/6.8.md +1 -0
  9. package/docs/assets/hierarchy.js +1 -1
  10. package/docs/assets/navigation.js +1 -1
  11. package/docs/assets/search.js +1 -1
  12. package/docs/classes/five.AdaptiveLuminancePass.html +1 -1
  13. package/docs/classes/five.BoundingMesh.html +1 -1
  14. package/docs/classes/five.Camera.html +1 -1
  15. package/docs/classes/five.EyeDomeLightingPass.html +1 -1
  16. package/docs/classes/five.Five.html +29 -29
  17. package/docs/classes/five.FivePass.html +1 -1
  18. package/docs/classes/five.InternalWebGLRenderer.html +1 -1
  19. package/docs/classes/five.Model.html +1 -1
  20. package/docs/classes/five.ModelScene.html +1 -1
  21. package/docs/classes/five.NetworkSubscribe.html +1 -1
  22. package/docs/classes/five.PBMContainer.html +1 -1
  23. package/docs/classes/five.PBMCustomShader.html +1 -1
  24. package/docs/classes/five.PBMGSObject.html +1 -1
  25. package/docs/classes/five.PBMGroup.html +1 -1
  26. package/docs/classes/five.PBMMesh.html +1 -1
  27. package/docs/classes/five.PBMMeshMaterial.html +1 -1
  28. package/docs/classes/five.PBMPanoFilter.html +1 -1
  29. package/docs/classes/five.PBMPointCloud.html +1 -1
  30. package/docs/classes/five.PBMPointCloudMaterial.html +1 -1
  31. package/docs/classes/five.PBMSkinnedMesh.html +1 -1
  32. package/docs/classes/five.PBMUpdateable.html +1 -1
  33. package/docs/classes/five.PanoCircleMesh.html +1 -1
  34. package/docs/classes/five.PanoCircleMeshCustom.html +1 -1
  35. package/docs/classes/five.PanoCircleMeshSolid.html +1 -1
  36. package/docs/classes/five.Parameter.html +1 -1
  37. package/docs/classes/five.Scene.html +1 -1
  38. package/docs/classes/five.Subscribe.html +1 -1
  39. package/docs/classes/five.Tile3D.html +1 -1
  40. package/docs/classes/five.TileNode.html +1 -1
  41. package/docs/classes/five.TrajectoryNode.html +1 -1
  42. package/docs/classes/five.WorkResolvedObserver.html +1 -1
  43. package/docs/classes/gltf-loader.DDSLoader.html +1 -1
  44. package/docs/classes/gltf-loader.DRACOLoader.html +1 -1
  45. package/docs/classes/gltf-loader.GLTFLoader.html +1 -1
  46. package/docs/classes/gltf-loader.GLTFObject.html +1 -1
  47. package/docs/classes/gltf-loader.THREEGLTFLoader.html +1 -1
  48. package/docs/classes/line.Line.html +1 -1
  49. package/docs/classes/line.LineGeometry.html +1 -1
  50. package/docs/classes/line.LineMaterial.html +1 -1
  51. package/docs/classes/line.LineSegmentsGeometry.html +1 -1
  52. package/docs/classes/line.THREE_Line2.html +1 -1
  53. package/docs/classes/line.THREE_LineSegments2.html +1 -1
  54. package/docs/classes/plugins.BasePlugin.Controller.html +1 -1
  55. package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
  56. package/docs/classes/sticker.Sticker.html +1 -1
  57. package/docs/classes/vfx.Airflow.html +1 -1
  58. package/docs/classes/vfx.Flame.html +1 -1
  59. package/docs/classes/vfx.Particle.html +1 -1
  60. package/docs/classes/vfx.ParticleGPU.html +1 -1
  61. package/docs/classes/vfx.SpotLight.html +1 -1
  62. package/docs/documents/api.html +58 -8
  63. package/docs/documents/features_event.html +42 -6
  64. package/docs/documents/features_flowing-light-2d-pass.html +12 -109
  65. package/docs/documents/features_flowing-light-3d-pass.html +15 -117
  66. package/docs/documents/features_load-external-model.html +1 -0
  67. package/docs/documents/features_state.html +1 -1
  68. package/docs/documents/glossary.html +3 -3
  69. package/docs/documents/release_notes_6.8.html +1 -0
  70. package/docs/functions/plugins.GaussianSplattingEntranceAnimationPlugin.html +1 -0
  71. package/docs/hierarchy.html +1 -1
  72. package/docs/interfaces/five.AddableObject.html +1 -1
  73. package/docs/interfaces/five.AjaxOptions.html +1 -1
  74. package/docs/interfaces/five.BaseEvent.html +5 -5
  75. package/docs/interfaces/five.BaseExtendableEvent.html +11 -0
  76. package/docs/interfaces/five.EventCallback.html +45 -43
  77. package/docs/interfaces/five.FloorplanControllerCustomInitArgs.html +9 -9
  78. package/docs/interfaces/five.GestureEvent.html +19 -19
  79. package/docs/interfaces/five.GesturePointer.html +9 -9
  80. package/docs/interfaces/five.ImageOptions.html +1 -1
  81. package/docs/interfaces/five.IntersectEvent.html +8 -8
  82. package/docs/interfaces/five.IntersectMesh.html +1 -1
  83. package/docs/interfaces/five.IntersectMeshInterface.html +1 -1
  84. package/docs/interfaces/five.Intersection.html +1 -1
  85. package/docs/interfaces/five.LooseWorkWithExtrinsics.html +1 -1
  86. package/docs/interfaces/five.MapviewControllerCustomInitArgs.html +9 -9
  87. package/docs/interfaces/five.ModeChangeEvent.html +7 -7
  88. package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
  89. package/docs/interfaces/five.ModelEvent.html +5 -5
  90. package/docs/interfaces/five.ModelSceneEvent.html +5 -5
  91. package/docs/interfaces/five.ModelTileEvent.html +5 -5
  92. package/docs/interfaces/five.MovePanoOptions.html +1 -1
  93. package/docs/interfaces/five.NetworkAbortError.html +1 -1
  94. package/docs/interfaces/five.NetworkFirbiddenError.html +1 -1
  95. package/docs/interfaces/five.NetworkOptions.html +1 -1
  96. package/docs/interfaces/five.NetworkProxyError.html +1 -1
  97. package/docs/interfaces/five.NetworkResourceEvent.html +5 -5
  98. package/docs/interfaces/five.NetworkResponseError.html +1 -1
  99. package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
  100. package/docs/interfaces/five.ObjectEvent.html +5 -5
  101. package/docs/interfaces/five.PBMMaterial.html +1 -1
  102. package/docs/interfaces/five.PBMMeshMaterialParameters.html +1 -1
  103. package/docs/interfaces/five.PBMPointCloudMaterialParameters.html +1 -1
  104. package/docs/interfaces/five.PanoCircleMeshInterface.html +1 -1
  105. package/docs/interfaces/five.PanoEvent.html +13 -11
  106. package/docs/interfaces/five.PanoPrepareEvent.html +15 -0
  107. package/docs/interfaces/five.PanoTextureEvent.html +9 -9
  108. package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +1 -1
  109. package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +1 -1
  110. package/docs/interfaces/five.ParameterMaterialValue.html +1 -1
  111. package/docs/interfaces/five.ParameterTilesetValue.html +1 -1
  112. package/docs/interfaces/five.ParameterValue.html +1 -1
  113. package/docs/interfaces/five.Pose.html +1 -1
  114. package/docs/interfaces/five.RenderEvent.html +5 -5
  115. package/docs/interfaces/five.ResolvedParameterValue.html +1 -1
  116. package/docs/interfaces/five.State.html +1 -1
  117. package/docs/interfaces/five.StateEvent.html +7 -7
  118. package/docs/interfaces/five.TextureOptions.html +1 -1
  119. package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +7 -7
  120. package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +1 -1
  121. package/docs/interfaces/five.ViewLayer.html +1 -1
  122. package/docs/interfaces/five.WorkCubeImage.html +1 -1
  123. package/docs/interfaces/five.WorkImage.html +1 -1
  124. package/docs/interfaces/five.WorkObserver.html +1 -1
  125. package/docs/interfaces/five.WorkObserverProto.html +1 -1
  126. package/docs/interfaces/five.WorkTile.html +1 -1
  127. package/docs/interfaces/five.WorksEvent.html +5 -5
  128. package/docs/interfaces/five.XRControllerEvent.html +8 -8
  129. package/docs/interfaces/five.XRControllerState.html +4 -4
  130. package/docs/interfaces/five.XRGestureEvent.html +11 -11
  131. package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +1 -1
  132. package/docs/interfaces/five.XRSessionEvent.html +7 -7
  133. package/docs/interfaces/plugins.BackgroundPluginController.html +1 -1
  134. package/docs/interfaces/plugins.BackgroundPluginType.EventMap.html +1 -1
  135. package/docs/interfaces/plugins.BasePlugin.State.html +1 -1
  136. package/docs/interfaces/plugins.DynamicPathLinePluginController.html +1 -1
  137. package/docs/interfaces/plugins.DynamicPathLinePluginType.EventMap.html +1 -1
  138. package/docs/interfaces/plugins.DynamicPathLinePluginType.State.html +1 -1
  139. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationController.html +44 -0
  140. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.BoundingAABB2D.html +3 -0
  141. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.Config.html +8 -0
  142. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +10 -0
  143. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.Keyframe.html +3 -0
  144. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +8 -0
  145. package/docs/interfaces/plugins.ItemMaskController.html +1 -1
  146. package/docs/interfaces/plugins.ItemMaskPluginType.EventMap.html +1 -1
  147. package/docs/interfaces/plugins.ItemMaskPluginType.State.html +1 -1
  148. package/docs/interfaces/plugins.OrientationPluginController.html +1 -1
  149. package/docs/interfaces/plugins.OrientationPluginType.EventMap.html +1 -1
  150. package/docs/interfaces/plugins.OrientationPluginType.State.html +1 -1
  151. package/docs/interfaces/plugins.PanoAnimeController.html +1 -1
  152. package/docs/interfaces/plugins.PanoAnimePluginType.EventMap.html +1 -1
  153. package/docs/interfaces/plugins.PanoAnimePluginType.State.html +1 -1
  154. package/docs/interfaces/plugins.PluginTemplateType.EventMap.html +1 -1
  155. package/docs/interfaces/plugins.PluginTemplateType.State.html +1 -1
  156. package/docs/interfaces/plugins.TrajectoryController.html +1 -1
  157. package/docs/interfaces/react.FiveInjectionTypes.html +13 -13
  158. package/docs/modules/five.html +1 -1
  159. package/docs/modules/plugins.GaussianSplattingEntranceAnimationPluginType.html +1 -0
  160. package/docs/modules/plugins.html +1 -1
  161. package/docs/types/five.ControllerEventTypes.html +22 -20
  162. package/docs/types/five.EventTypes.html +26 -26
  163. package/docs/types/five.ParseOptions.html +1 -1
  164. package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
  165. package/docs/variables/five.PROXY_CONTROLLER_EVENT_NAMES.html +1 -1
  166. package/five/application/events.d.ts +1 -1
  167. package/five/controllers/events.d.ts +3 -1
  168. package/five/controllers/panorama.d.ts +1 -1
  169. package/five/controllers/xrPanorama.d.ts +1 -1
  170. package/five/index.d.ts +1 -1
  171. package/five/index.js +83 -80
  172. package/five/index.mjs +2087 -1772
  173. package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting.d.ts +8 -0
  174. package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting_compression_spz.d.ts +4 -4
  175. package/five/model/loaders/glTF-helpers/extensions/base.d.ts +2 -1
  176. package/five/model/loaders/glTF-helpers/index.d.ts +2 -0
  177. package/five/model/loaders/glTF-helpers/parser.d.ts +2 -1
  178. package/five/utils/error.d.ts +1 -0
  179. package/five/utils/event.d.ts +14 -0
  180. package/gltf-loader/index.js +3 -3
  181. package/gltf-loader/index.mjs +3 -3
  182. package/line/index.js +3 -3
  183. package/line/index.mjs +3 -3
  184. package/package.json +1 -1
  185. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.d.ts +30 -0
  186. package/plugins/GaussianSplattingEntranceAnimationPlugin/index.d.ts +5 -0
  187. package/plugins/GaussianSplattingEntranceAnimationPlugin/typing.d.ts +28 -0
  188. package/plugins/index.d.ts +1 -0
  189. package/plugins/index.js +10 -10
  190. package/plugins/index.mjs +164 -4
  191. package/react/index.js +2 -2
  192. package/react/index.mjs +2 -2
  193. package/shader-lib/index.js +2 -2
  194. package/shader-lib/index.mjs +2 -2
  195. package/sticker/index.js +3 -3
  196. package/sticker/index.mjs +3 -3
  197. package/umd/five-gltf-loader.js +3 -3
  198. package/umd/five-line.js +3 -3
  199. package/umd/five-plugins.js +10 -10
  200. package/umd/five-react.js +2 -2
  201. package/umd/five-shader-lib.js +2 -2
  202. package/umd/five-sticker.js +3 -3
  203. package/umd/five-vfx.js +2 -2
  204. package/umd/five-vue.js +2 -2
  205. package/umd/five.js +27 -24
  206. package/vfx/index.js +2 -2
  207. package/vfx/index.mjs +2 -2
  208. package/vue/index.js +2 -2
  209. package/vue/index.mjs +2 -2
  210. package/work-downloader/index.js +2 -2
  211. package/work-downloader/index.mjs +2 -2
@@ -92,7 +92,7 @@
92
92
  </table>
93
93
  <h2 id="initialization-configuration-" class="tsd-anchor-link">Initialization Configuration (<code>FiveInitArgs</code>)<a href="#initialization-configuration-" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
94
94
  <p>Configuration object passed to the <code>Five</code> constructor.</p>
95
- <pre><code class="typescript"><span class="hl-3">interface</span><span class="hl-1"> </span><span class="hl-7">FiveInitArgs</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">/** External WebGLRenderer. If provided, internal renderer creation is skipped. */</span><br/><span class="hl-1"> </span><span class="hl-6">renderer</span><span class="hl-1">?: </span><span class="hl-7">THREE</span><span class="hl-1">.</span><span class="hl-7">WebGLRenderer</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Width/Height of the viewport relative to container (0-1). */</span><br/><span class="hl-1"> </span><span class="hl-6">viewport</span><span class="hl-1">?: { </span><span class="hl-6">left</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1">; </span><span class="hl-6">bottom</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1">; </span><span class="hl-6">width</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1">; </span><span class="hl-6">height</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1"> };</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Canvas background color. Default: 0x181A1C */</span><br/><span class="hl-1"> </span><span class="hl-6">backgroundColor</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1"> | </span><span class="hl-7">THREE</span><span class="hl-1">.</span><span class="hl-7">Color</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Canvas background alpha (0-1). Default: 1 */</span><br/><span class="hl-1"> </span><span class="hl-6">backgroundAlpha</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Enable antialiasing. Default: false */</span><br/><span class="hl-1"> </span><span class="hl-6">antialias</span><span class="hl-1">?: </span><span class="hl-7">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Auto-play rendering loop. Default: true */</span><br/><span class="hl-1"> </span><span class="hl-6">play</span><span class="hl-1">?: </span><span class="hl-7">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Enable on-demand rendering to save battery. Default: true */</span><br/><span class="hl-1"> </span><span class="hl-6">onlyRenderIfNeeds</span><span class="hl-1">?: </span><span class="hl-7">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Max FPS limit. false = unlimited. Default: false */</span><br/><span class="hl-1"> </span><span class="hl-6">maxFps</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1"> | </span><span class="hl-7">false</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Mode transition duration in ms. Default: 800 */</span><br/><span class="hl-1"> </span><span class="hl-6">modeChangeDuration</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Initial plugins to load. */</span><br/><span class="hl-1"> </span><span class="hl-6">plugins</span><span class="hl-1">?: </span><span class="hl-7">FivePlugin</span><span class="hl-1">[];</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Dynamic image configuration for optimization. */</span><br/><span class="hl-1"> </span><span class="hl-6">imageOptions</span><span class="hl-1">?: </span><span class="hl-7">ImageOptions</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Dynamic texture configuration for optimization. */</span><br/><span class="hl-1"> </span><span class="hl-6">textureOptions</span><span class="hl-1">?: </span><span class="hl-7">TextureOptions</span><span class="hl-1">;</span><br/><span class="hl-1">}</span>
95
+ <pre><code class="typescript"><span class="hl-3">interface</span><span class="hl-1"> </span><span class="hl-7">FiveInitArgs</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">/** External WebGLRenderer. If provided, internal renderer creation is skipped. */</span><br/><span class="hl-1"> </span><span class="hl-6">renderer</span><span class="hl-1">?: </span><span class="hl-7">THREE</span><span class="hl-1">.</span><span class="hl-7">WebGLRenderer</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Width/Height of the viewport relative to container (0-1). */</span><br/><span class="hl-1"> </span><span class="hl-6">viewport</span><span class="hl-1">?: { </span><span class="hl-6">left</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1">; </span><span class="hl-6">bottom</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1">; </span><span class="hl-6">width</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1">; </span><span class="hl-6">height</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1"> };</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Canvas background color. Default: 0x181A1C */</span><br/><span class="hl-1"> </span><span class="hl-6">backgroundColor</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1"> | </span><span class="hl-7">THREE</span><span class="hl-1">.</span><span class="hl-7">Color</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Canvas background alpha (0-1). Default: 1 */</span><br/><span class="hl-1"> </span><span class="hl-6">backgroundAlpha</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Enable antialiasing. Default: false */</span><br/><span class="hl-1"> </span><span class="hl-6">antialias</span><span class="hl-1">?: </span><span class="hl-7">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Auto-play rendering loop. Default: true */</span><br/><span class="hl-1"> </span><span class="hl-6">play</span><span class="hl-1">?: </span><span class="hl-7">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Enable on-demand rendering to save battery. Default: true */</span><br/><span class="hl-1"> </span><span class="hl-6">onlyRenderIfNeeds</span><span class="hl-1">?: </span><span class="hl-7">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Max FPS limit. false = unlimited. Default: false */</span><br/><span class="hl-1"> </span><span class="hl-6">maxFps</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1"> | </span><span class="hl-7">false</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Mode transition duration in ms. Default: 1000 */</span><br/><span class="hl-1"> </span><span class="hl-6">modeChangeDuration</span><span class="hl-1">?: </span><span class="hl-7">number</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Initial plugins to load. */</span><br/><span class="hl-1"> </span><span class="hl-6">plugins</span><span class="hl-1">?: </span><span class="hl-7">FivePlugin</span><span class="hl-1">[];</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Dynamic image configuration for optimization. */</span><br/><span class="hl-1"> </span><span class="hl-6">imageOptions</span><span class="hl-1">?: </span><span class="hl-7">ImageOptions</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">/** Dynamic texture configuration for optimization. */</span><br/><span class="hl-1"> </span><span class="hl-6">textureOptions</span><span class="hl-1">?: </span><span class="hl-7">TextureOptions</span><span class="hl-1">;</span><br/><span class="hl-1">}</span>
96
96
  </code><button type="button">Copy</button></pre>
97
97
 
98
98
  <h2 id="core-methods" class="tsd-anchor-link">Core Methods<a href="#core-methods" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
@@ -199,22 +199,47 @@
199
199
  <tr>
200
200
  <td style="text-align:left"><code>gesture.tap</code></td>
201
201
  <td style="text-align:left">Triggered on tap/click. Replaces <code>wantsTapGesture</code>.</td>
202
- <td style="text-align:left"><code>{ pointers, event, ... }</code></td>
202
+ <td style="text-align:left"><code>GestureEvent</code></td>
203
+ </tr>
204
+ <tr>
205
+ <td style="text-align:left"><code>gesture.dbltap</code></td>
206
+ <td style="text-align:left">Triggered on double tap/click.</td>
207
+ <td style="text-align:left"><code>GestureEvent</code></td>
203
208
  </tr>
204
209
  <tr>
205
210
  <td style="text-align:left"><code>gesture.pan</code></td>
206
211
  <td style="text-align:left">Triggered on pan/drag.</td>
207
- <td style="text-align:left"><code>{ pointers, ... }</code></td>
212
+ <td style="text-align:left"><code>GestureEvent</code></td>
208
213
  </tr>
209
214
  <tr>
210
215
  <td style="text-align:left"><code>gesture.pinch</code></td>
211
216
  <td style="text-align:left">Triggered on pinch/zoom.</td>
212
- <td style="text-align:left"><code>{ scale, ... }</code></td>
217
+ <td style="text-align:left"><code>GestureEvent</code></td>
213
218
  </tr>
214
219
  <tr>
215
220
  <td style="text-align:left"><code>gesture.press</code></td>
216
221
  <td style="text-align:left">Triggered on long press.</td>
217
- <td style="text-align:left"><code>{ pointers, ... }</code></td>
222
+ <td style="text-align:left"><code>GestureEvent</code></td>
223
+ </tr>
224
+ <tr>
225
+ <td style="text-align:left"><code>gesture.mousewheel</code></td>
226
+ <td style="text-align:left">Triggered on mouse wheel scroll.</td>
227
+ <td style="text-align:left"><code>GestureEvent</code></td>
228
+ </tr>
229
+ <tr>
230
+ <td style="text-align:left"><code>gesture.mousemove</code></td>
231
+ <td style="text-align:left">Triggered on mouse move.</td>
232
+ <td style="text-align:left"><code>GestureEvent</code></td>
233
+ </tr>
234
+ <tr>
235
+ <td style="text-align:left"><code>gesture.momentum</code></td>
236
+ <td style="text-align:left">Triggered on inertia movement after pan.</td>
237
+ <td style="text-align:left"><code>GestureEvent</code></td>
238
+ </tr>
239
+ <tr>
240
+ <td style="text-align:left"><code>gesture.fire</code></td>
241
+ <td style="text-align:left">Triggered when any gesture event fires.</td>
242
+ <td style="text-align:left"><code>GestureEvent</code></td>
218
243
  </tr>
219
244
  </tbody>
220
245
  </table>
@@ -261,6 +286,11 @@
261
286
  <td style="text-align:left"><code>WorksEvent</code></td>
262
287
  </tr>
263
288
  <tr>
289
+ <td style="text-align:left"><code>works.ready</code></td>
290
+ <td style="text-align:left">Triggered when work data is loaded and controller is ready.</td>
291
+ <td style="text-align:left"><code>WorksEvent</code></td>
292
+ </tr>
293
+ <tr>
264
294
  <td style="text-align:left"><code>models.load</code></td>
265
295
  <td style="text-align:left">Triggered when models are loaded.</td>
266
296
  <td style="text-align:left"><code>ModelSceneEvent</code></td>
@@ -268,12 +298,17 @@
268
298
  <tr>
269
299
  <td style="text-align:left"><code>model.tileLoad</code></td>
270
300
  <td style="text-align:left">Triggered when a 3D tile is loaded.</td>
271
- <td style="text-align:left"><code>Tile</code></td>
301
+ <td style="text-align:left"><code>ModelTileEvent</code></td>
272
302
  </tr>
273
303
  <tr>
274
304
  <td style="text-align:left"><code>model.tileUnload</code></td>
275
305
  <td style="text-align:left">Triggered when a 3D tile is unloaded.</td>
276
- <td style="text-align:left"><code>Tile</code></td>
306
+ <td style="text-align:left"><code>ModelTileEvent</code></td>
307
+ </tr>
308
+ <tr>
309
+ <td style="text-align:left"><code>pano.prepare</code></td>
310
+ <td style="text-align:left">Triggered before switching to a new pano. <code>ExtendableEvent</code>, supports <code>waitUntil</code>.</td>
311
+ <td style="text-align:left"><code>PanoPrepareEvent</code></td>
277
312
  </tr>
278
313
  <tr>
279
314
  <td style="text-align:left"><code>pano.arrived</code></td>
@@ -281,9 +316,19 @@
281
316
  <td style="text-align:left"><code>PanoEvent</code></td>
282
317
  </tr>
283
318
  <tr>
319
+ <td style="text-align:left"><code>pano.moving</code></td>
320
+ <td style="text-align:left">Triggered during pano transition animation.</td>
321
+ <td style="text-align:left"><code>PanoEvent</code></td>
322
+ </tr>
323
+ <tr>
324
+ <td style="text-align:left"><code>pano.error</code></td>
325
+ <td style="text-align:left">Triggered when pano loading or movement fails.</td>
326
+ <td style="text-align:left"><code>PanoEvent</code></td>
327
+ </tr>
328
+ <tr>
284
329
  <td style="text-align:left"><code>pano.texture.progress</code></td>
285
330
  <td style="text-align:left">Triggered when panorama texture loading progresses.</td>
286
- <td style="text-align:left"><code>{ progress, panoIndex }</code></td>
331
+ <td style="text-align:left"><code>PanoTextureEvent</code></td>
287
332
  </tr>
288
333
  <tr>
289
334
  <td style="text-align:left"><code>render</code></td>
@@ -291,6 +336,11 @@
291
336
  <td style="text-align:left"><code>RenderEvent</code></td>
292
337
  </tr>
293
338
  <tr>
339
+ <td style="text-align:left"><code>render.prepare</code></td>
340
+ <td style="text-align:left">Triggered before each render frame.</td>
341
+ <td style="text-align:left"><code>RenderEvent</code></td>
342
+ </tr>
343
+ <tr>
294
344
  <td style="text-align:left"><code>error</code></td>
295
345
  <td style="text-align:left">Triggered on internal errors.</td>
296
346
  <td style="text-align:left"><code>Error</code></td>
@@ -1,9 +1,9 @@
1
1
  <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>features/event | 如视 Five SDK</title><meta name="description" content="Documentation for 如视 Five SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">如视 Five SDK</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">features/event</a></li></ul></div><div class="tsd-panel tsd-typography"><h1 id="events-事件系统" class="tsd-anchor-link">Events (事件系统)<a href="#events-事件系统" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h1>
2
2
  <ul>
3
3
  <li><strong>Summary</strong>: Five 提供了一套基于发布/订阅模式的事件系统,用于监听用户交互、状态变更、数据加载及渲染生命周期。</li>
4
- <li><strong>Schema</strong>: <code>on</code> / <code>once</code> / <code>off</code> 接口定义。</li>
5
- <li><strong>Concepts</strong>: Gesture Events, State Events, Pano Events, Model Events, Lifecycle Events.</li>
6
- <li><strong>Examples</strong>: 监听全景移动、手势交互及状态变更。</li>
4
+ <li><strong>Schema</strong>: <code>on</code> / <code>once</code> / <code>off</code> 接口定义;<code>BaseEvent</code> / <code>BaseExtendableEvent</code> 事件对象。</li>
5
+ <li><strong>Concepts</strong>: Event 对象(<code>preventDefault</code> / <code>waitUntil</code>)、Gesture Events, State Events, Pano Events, Model Events, Lifecycle Events.</li>
6
+ <li><strong>Examples</strong>: 监听全景移动、手势交互及状态变更;使用 <code>preventDefault</code> 拦截默认行为;使用 <code>waitUntil</code> 延迟点位切换。</li>
7
7
  </ul>
8
8
  <h2 id="schema" class="tsd-anchor-link">Schema<a href="#schema" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
9
9
  <blockquote>
@@ -35,6 +35,41 @@
35
35
  <li><strong>name</strong>: (可选) 若不传,则清空所有事件;若传,则取消指定类型的事件。</li>
36
36
  <li><strong>callback</strong>: (可选) 若传,则仅取消该特定的回调函数;若不传,则取消该类型下的所有回调。</li>
37
37
  </ul>
38
+ <h2 id="event-对象" class="tsd-anchor-link">Event 对象<a href="#event-对象" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
39
+ <blockquote>
40
+ <p><strong>Definition</strong>: <a href="../../five/utils/event.d.ts">BaseEvent / BaseExtendableEvent</a></p>
41
+ </blockquote>
42
+ <p>Five 中所有事件回调的参数都是一个 Event 对象,分为两种基础类型:</p>
43
+ <h3 id="baseevent" class="tsd-anchor-link">BaseEvent<a href="#baseevent" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
44
+ <p>所有事件的基础接口,包含以下属性和方法:</p>
45
+ <pre><code class="typescript"><span class="hl-3">interface</span><span class="hl-1"> </span><span class="hl-7">BaseEvent</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">/** 事件类型名称 */</span><br/><span class="hl-1"> </span><span class="hl-6">type</span><span class="hl-1">: </span><span class="hl-7">string</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">/** 事件触发时的时间戳 */</span><br/><span class="hl-1"> </span><span class="hl-6">timeStamp</span><span class="hl-1">: </span><span class="hl-7">number</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">/** 阻止事件的默认行为 */</span><br/><span class="hl-1"> </span><span class="hl-5">preventDefault</span><span class="hl-1">(): </span><span class="hl-7">void</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">/** 是否已调用过 preventDefault */</span><br/><span class="hl-1"> </span><span class="hl-3">readonly</span><span class="hl-1"> </span><span class="hl-6">defaultPrevented</span><span class="hl-1">: </span><span class="hl-7">boolean</span><span class="hl-1">;</span><br/><span class="hl-1">}</span>
46
+ </code><button type="button">Copy</button></pre>
47
+
48
+ <h3 id="baseextendableevent" class="tsd-anchor-link">BaseExtendableEvent<a href="#baseextendableevent" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
49
+ <p>继承自 <code>BaseEvent</code>,额外提供 <code>waitUntil</code> 方法,用于在事件处理中插入异步等待逻辑:</p>
50
+ <pre><code class="typescript"><span class="hl-3">interface</span><span class="hl-1"> </span><span class="hl-7">BaseExtendableEvent</span><span class="hl-1"> </span><span class="hl-3">extends</span><span class="hl-1"> </span><span class="hl-7">BaseEvent</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">waitUntil</span><span class="hl-1">(</span><span class="hl-6">f</span><span class="hl-1">: </span><span class="hl-7">Promise</span><span class="hl-1">&lt;</span><span class="hl-7">any</span><span class="hl-1">&gt;): </span><span class="hl-7">void</span><span class="hl-1">;</span><br/><span class="hl-1">}</span>
51
+ </code><button type="button">Copy</button></pre>
52
+
53
+ <p>目前 <code>pano.prepare</code> 事件使用 <code>BaseExtendableEvent</code>(对应 <code>PanoPrepareEvent</code>),其余事件均基于 <code>BaseEvent</code>。</p>
54
+ <h3 id="preventdefault" class="tsd-anchor-link">preventDefault<a href="#preventdefault" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
55
+ <p>调用 <code>event.preventDefault()</code> 可以阻止事件的默认行为。Five 内部会在触发事件后检查 <code>event.defaultPrevented</code>,若为 <code>true</code> 则跳过后续的默认处理逻辑。</p>
56
+ <p>比如:</p>
57
+ <ul>
58
+ <li><code>gesture.tap</code>:阻止默认的点位跳转或相机弹跳动画。</li>
59
+ <li><code>intersect.update</code>:阻止默认的交互高亮行为。</li>
60
+ </ul>
61
+ <pre><code class="typescript"><span class="hl-8">// 示例:阻止点击时的默认点位跳转</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;gesture.tap&quot;</span><span class="hl-1">, (</span><span class="hl-6">event</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-10">if</span><span class="hl-1"> (</span><span class="hl-5">shouldBlockNavigation</span><span class="hl-1">()) {</span><br/><span class="hl-1"> </span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-5">preventDefault</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-8">// 执行自定义逻辑</span><br/><span class="hl-1"> </span><span class="hl-5">showCustomMenu</span><span class="hl-1">(</span><span class="hl-6">event</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-8">// 示例:阻止拖拽时的默认相机旋转</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;gesture.pan&quot;</span><span class="hl-1">, (</span><span class="hl-6">event</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-5">preventDefault</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-8">// 用拖拽手势实现自定义交互(如绘制标注)</span><br/><span class="hl-1"> </span><span class="hl-5">drawAnnotation</span><span class="hl-1">(</span><span class="hl-6">event</span><span class="hl-1">);</span><br/><span class="hl-1">});</span>
62
+ </code><button type="button">Copy</button></pre>
63
+
64
+ <h3 id="waituntil" class="tsd-anchor-link">waitUntil<a href="#waituntil" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
65
+ <p><code>waitUntil(promise)</code> 仅在 <code>ExtendableEvent</code> 上可用。调用后,Five 会等待传入的 Promise 完成后再继续后续流程。可多次调用,所有 Promise 会被并行等待。</p>
66
+ <p>目前仅 <code>pano.prepare</code> 事件支持 <code>waitUntil</code>。</p>
67
+ <pre><code class="typescript"><span class="hl-8">// 示例:在切换点位前预加载资源</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;pano.prepare&quot;</span><span class="hl-1">, (</span><span class="hl-6">event</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">// 等待自定义资源加载完成后再继续点位切换</span><br/><span class="hl-1"> </span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-5">waitUntil</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-5">loadCustomResources</span><span class="hl-1">(</span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-6">pano</span><span class="hl-1">)</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-8">// 可以多次调用,所有 Promise 会被并行等待</span><br/><span class="hl-1"> </span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-5">waitUntil</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-5">preloadTextures</span><span class="hl-1">(</span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-6">pano</span><span class="hl-1">)</span><br/><span class="hl-1"> );</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-8">// 示例:通过 waitUntil reject 来取消走点</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;pano.prepare&quot;</span><span class="hl-1">, (</span><span class="hl-6">event</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-5">waitUntil</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-5">showConfirmDialog</span><span class="hl-1">(</span><span class="hl-9">&quot;是否前往该点位?&quot;</span><span class="hl-1">).</span><span class="hl-5">then</span><span class="hl-1">((</span><span class="hl-6">confirmed</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-10">if</span><span class="hl-1"> (!</span><span class="hl-6">confirmed</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-10">throw</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">Error</span><span class="hl-1">(</span><span class="hl-9">&quot;用户取消走点&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> })</span><br/><span class="hl-1"> );</span><br/><span class="hl-1">});</span>
68
+ </code><button type="button">Copy</button></pre>
69
+
70
+ <blockquote>
71
+ <p><strong>注意</strong>: <code>preventDefault</code> 和 <code>waitUntil</code> 必须在事件回调的同步执行阶段调用,不能放在 <code>await</code> 之后。</p>
72
+ </blockquote>
38
73
  <h2 id="concepts" class="tsd-anchor-link">Concepts<a href="#concepts" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
39
74
  <p>Five 的事件系统将事件主要分为以下几类:</p>
40
75
  <h3 id="gesture-events-交互手势" class="tsd-anchor-link">Gesture Events (交互手势)<a href="#gesture-events-交互手势" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
@@ -51,6 +86,7 @@
51
86
  <h3 id="pano-events-全景导航" class="tsd-anchor-link">Pano Events (全景导航)<a href="#pano-events-全景导航" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
52
87
  <p>监听全景图的点位切换过程。</p>
53
88
  <ul>
89
+ <li><code>pano.prepare</code>: 准备切换到新点位。这是一个 <code>ExtendableEvent</code>,支持通过 <code>waitUntil(promise)</code> 延迟后续加载流程(如预加载资源),以及通过 <code>preventDefault()</code> 取消本次走点。</li>
54
90
  <li><code>pano.arrived</code>: 成功到达新点位(移动动画结束)。</li>
55
91
  <li><code>pano.moving</code>: 正在移动到新点位(动画进行中)。</li>
56
92
  <li><code>pano.willChange</code>: 即将发生点位变更(旧版兼容)。</li>
@@ -80,7 +116,7 @@
80
116
  <h2 id="examples" class="tsd-anchor-link">Examples<a href="#examples" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
81
117
  <h3 id="快速上手-quick-example" class="tsd-anchor-link">快速上手 (Quick Example)<a href="#快速上手-quick-example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
82
118
  <p>监听点击事件并打印日志。</p>
83
- <pre><code class="typescript"><span class="hl-10">import</span><span class="hl-1"> { </span><span class="hl-6">Five</span><span class="hl-1"> } </span><span class="hl-10">from</span><span class="hl-1"> </span><span class="hl-9">&quot;@realsee/five&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">five</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">Five</span><span class="hl-1">();</span><br/><br/><span class="hl-8">// 监听点击事件</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;gesture.tap&quot;</span><span class="hl-1">, (</span><span class="hl-6">pose</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">console</span><span class="hl-1">.</span><span class="hl-5">log</span><span class="hl-1">(</span><span class="hl-9">&quot;User tapped at:&quot;</span><span class="hl-1">, </span><span class="hl-6">pose</span><span class="hl-1">);</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-8">// 监听点位变更完成</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;pano.arrived&quot;</span><span class="hl-1">, (</span><span class="hl-6">index</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">console</span><span class="hl-1">.</span><span class="hl-5">log</span><span class="hl-1">(</span><span class="hl-9">&quot;Arrived at pano index:&quot;</span><span class="hl-1">, </span><span class="hl-6">index</span><span class="hl-1">);</span><br/><span class="hl-1">});</span>
119
+ <pre><code class="typescript"><span class="hl-10">import</span><span class="hl-1"> { </span><span class="hl-6">Five</span><span class="hl-1"> } </span><span class="hl-10">from</span><span class="hl-1"> </span><span class="hl-9">&quot;@realsee/five&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">five</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">Five</span><span class="hl-1">();</span><br/><br/><span class="hl-8">// 监听点击事件</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;gesture.tap&quot;</span><span class="hl-1">, (</span><span class="hl-6">event</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">console</span><span class="hl-1">.</span><span class="hl-5">log</span><span class="hl-1">(</span><span class="hl-9">&quot;User tapped at:&quot;</span><span class="hl-1">, </span><span class="hl-6">event</span><span class="hl-1">);</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-8">// 监听点位变更完成</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">on</span><span class="hl-1">(</span><span class="hl-9">&quot;pano.arrived&quot;</span><span class="hl-1">, (</span><span class="hl-6">event</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">console</span><span class="hl-1">.</span><span class="hl-5">log</span><span class="hl-1">(</span><span class="hl-9">&quot;Arrived at pano:&quot;</span><span class="hl-1">, </span><span class="hl-6">event</span><span class="hl-1">.</span><span class="hl-6">pano</span><span class="hl-1">);</span><br/><span class="hl-1">});</span>
84
120
  </code><button type="button">Copy</button></pre>
85
121
 
86
122
  <h3 id="进阶用法-advanced-usage" class="tsd-anchor-link">进阶用法 (Advanced Usage)<a href="#进阶用法-advanced-usage" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
@@ -98,7 +134,7 @@
98
134
  <li><a href="features_five.html">five.md</a>: Five 核心类说明。</li>
99
135
  </ul>
100
136
  <hr>
101
- <pre><code class="yaml"><span class="hl-0">tags</span><span class="hl-1">: [</span><span class="hl-2">events</span><span class="hl-1">, </span><span class="hl-2">interaction</span><span class="hl-1">, </span><span class="hl-2">lifecycle</span><span class="hl-1">, </span><span class="hl-2">gesture</span><span class="hl-1">, </span><span class="hl-2">state</span><span class="hl-1">]</span>
137
+ <pre><code class="yaml"><span class="hl-0">tags</span><span class="hl-1">: [</span><span class="hl-2">events</span><span class="hl-1">, </span><span class="hl-2">interaction</span><span class="hl-1">, </span><span class="hl-2">lifecycle</span><span class="hl-1">, </span><span class="hl-2">gesture</span><span class="hl-1">, </span><span class="hl-2">state</span><span class="hl-1">, </span><span class="hl-2">preventDefault</span><span class="hl-1">, </span><span class="hl-2">waitUntil</span><span class="hl-1">]</span>
102
138
  </code><button type="button">Copy</button></pre>
103
139
 
104
- </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#events-事件系统"><span>Events (事件系统)</span></a><ul><li><a href="#schema"><span>Schema</span></a></li><li><ul><li><a href="#on"><span>on</span></a></li><li><a href="#once"><span>once</span></a></li><li><a href="#off"><span>off</span></a></li></ul></li><li><a href="#concepts"><span>Concepts</span></a></li><li><ul><li><a href="#gesture-events-交互手势"><span>Gesture <wbr/>Events (交互手势)</span></a></li><li><a href="#pano-events-全景导航"><span>Pano <wbr/>Events (全景导航)</span></a></li><li><a href="#state-events-状态变更"><span>State <wbr/>Events (状态变更)</span></a></li><li><a href="#model-work-events-数据加载"><span>Model &amp; <wbr/>Work <wbr/>Events (数据加载)</span></a></li><li><a href="#render-events-渲染循环"><span>Render <wbr/>Events (渲染循环)</span></a></li></ul></li><li><a href="#examples"><span>Examples</span></a></li><li><ul><li><a href="#快速上手-quick-example"><span>快速上手 (<wbr/>Quick <wbr/>Example)</span></a></li><li><a href="#进阶用法-advanced-usage"><span>进阶用法 (<wbr/>Advanced <wbr/>Usage)</span></a></li></ul></li><li><a href="#debugging"><span>Debugging</span></a></li><li><a href="#related"><span>Related</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">如视 Five SDK</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
140
+ </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#events-事件系统"><span>Events (事件系统)</span></a><ul><li><a href="#schema"><span>Schema</span></a></li><li><ul><li><a href="#on"><span>on</span></a></li><li><a href="#once"><span>once</span></a></li><li><a href="#off"><span>off</span></a></li></ul></li><li><a href="#event-对象"><span>Event 对象</span></a></li><li><ul><li><a href="#baseevent"><span>Base<wbr/>Event</span></a></li><li><a href="#baseextendableevent"><span>Base<wbr/>Extendable<wbr/>Event</span></a></li><li><a href="#preventdefault"><span>prevent<wbr/>Default</span></a></li><li><a href="#waituntil"><span>wait<wbr/>Until</span></a></li></ul></li><li><a href="#concepts"><span>Concepts</span></a></li><li><ul><li><a href="#gesture-events-交互手势"><span>Gesture <wbr/>Events (交互手势)</span></a></li><li><a href="#pano-events-全景导航"><span>Pano <wbr/>Events (全景导航)</span></a></li><li><a href="#state-events-状态变更"><span>State <wbr/>Events (状态变更)</span></a></li><li><a href="#model-work-events-数据加载"><span>Model &amp; <wbr/>Work <wbr/>Events (数据加载)</span></a></li><li><a href="#render-events-渲染循环"><span>Render <wbr/>Events (渲染循环)</span></a></li></ul></li><li><a href="#examples"><span>Examples</span></a></li><li><ul><li><a href="#快速上手-quick-example"><span>快速上手 (<wbr/>Quick <wbr/>Example)</span></a></li><li><a href="#进阶用法-advanced-usage"><span>进阶用法 (<wbr/>Advanced <wbr/>Usage)</span></a></li></ul></li><li><a href="#debugging"><span>Debugging</span></a></li><li><a href="#related"><span>Related</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">如视 Five SDK</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -157,122 +157,25 @@
157
157
  <p>释放 InstancedMesh、着色材质和渲染目标资源,避免内存泄漏。销毁 Pass 时必须调用。</p>
158
158
  <h2 id="examples" class="tsd-anchor-link">Examples<a href="#examples" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
159
159
  <h3 id="快速上手-quick-example" class="tsd-anchor-link">快速上手 (Quick Example)<a href="#快速上手-quick-example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
160
- <p>import { Five } from '@realsee/five';
161
- import { FlowingLight2DPass } from '../../lib/five/renderer/postprocessing';
162
- import * as THREE from 'three';</p>
163
- <p>const five = new Five();</p>
164
- <p>// 创建 2D 流光通道
165
- const flowing2D = new FlowingLight2DPass(five.camera);</p>
166
- <p>// 定义一条屏幕空间的路径(归一化坐标)
167
- const path = [
168
- new THREE.Vector2(0.2, 0.2),
169
- new THREE.Vector2(0.5, 0.8),
170
- new THREE.Vector2(0.8, 0.2),
171
- ];
172
- const totalLen = 1.2; // 归一化单位</p>
173
- <p>flowing2D.setLines([{
174
- points: path,
175
- totalLength: totalLen,
176
- color: new THREE.Color(0x00ff00),
177
- opacity: 0.9,
178
- duration: 2000,
179
- lineWidth: 0.01,
180
- }]);</p>
181
- <p>five.addPass(flowing2D);</p>
182
- <p>function animate() {
183
- requestAnimationFrame(animate);
184
- five.render();
185
- }
186
- animate();</p>
160
+ <pre><code class="typescript"><span class="hl-10">import</span><span class="hl-1"> { </span><span class="hl-6">Five</span><span class="hl-1"> } </span><span class="hl-10">from</span><span class="hl-1"> </span><span class="hl-9">&#39;@realsee/five&#39;</span><span class="hl-1">;</span><br/><span class="hl-10">import</span><span class="hl-1"> { </span><span class="hl-6">FlowingLight2DPass</span><span class="hl-1"> } </span><span class="hl-10">from</span><span class="hl-1"> </span><span class="hl-9">&#39;../../lib/five/renderer/postprocessing&#39;</span><span class="hl-1">;</span><br/><span class="hl-10">import</span><span class="hl-1"> </span><span class="hl-3">*</span><span class="hl-1"> </span><span class="hl-10">as</span><span class="hl-1"> </span><span class="hl-6">THREE</span><span class="hl-1"> </span><span class="hl-10">from</span><span class="hl-1"> </span><span class="hl-9">&#39;three&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">five</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">Five</span><span class="hl-1">();</span><br/><br/><span class="hl-8">// 创建 2D 流光通道</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">flowing2D</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">FlowingLight2DPass</span><span class="hl-1">(</span><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-6">camera</span><span class="hl-1">);</span><br/><br/><span class="hl-8">// 定义一条屏幕空间的路径(归一化坐标)</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">path</span><span class="hl-1"> = [</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.2</span><span class="hl-1">, </span><span class="hl-11">0.2</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.5</span><span class="hl-1">, </span><span class="hl-11">0.8</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.8</span><span class="hl-1">, </span><span class="hl-11">0.2</span><span class="hl-1">),</span><br/><span class="hl-1">];</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">totalLen</span><span class="hl-1"> = </span><span class="hl-11">1.2</span><span class="hl-1">; </span><span class="hl-8">// 归一化单位</span><br/><br/><span class="hl-6">flowing2D</span><span class="hl-1">.</span><span class="hl-5">setLines</span><span class="hl-1">([{</span><br/><span class="hl-1"> </span><span class="hl-6">points:</span><span class="hl-1"> </span><span class="hl-6">path</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">totalLength:</span><span class="hl-1"> </span><span class="hl-6">totalLen</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">color:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Color</span><span class="hl-1">(</span><span class="hl-11">0x00ff00</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">opacity:</span><span class="hl-1"> </span><span class="hl-11">0.9</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">duration:</span><span class="hl-1"> </span><span class="hl-11">2000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">lineWidth:</span><span class="hl-1"> </span><span class="hl-11">0.01</span><span class="hl-1">,</span><br/><span class="hl-1">}]);</span><br/><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">addPass</span><span class="hl-1">(</span><span class="hl-6">flowing2D</span><span class="hl-1">);</span><br/><br/><span class="hl-3">function</span><span class="hl-1"> </span><span class="hl-5">animate</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-5">requestAnimationFrame</span><span class="hl-1">(</span><span class="hl-6">animate</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">render</span><span class="hl-1">();</span><br/><span class="hl-1">}</span><br/><span class="hl-5">animate</span><span class="hl-1">();</span>
161
+ </code><button type="button">Copy</button></pre>
162
+
187
163
  <h3 id="多条路径-动态更新" class="tsd-anchor-link">多条路径 &amp; 动态更新<a href="#多条路径-动态更新" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
188
- <p>const pass = new FlowingLight2DPass(five.camera);</p>
189
- <p>// 初始路径集合
190
- const paths = [
191
- {
192
- points: [
193
- new THREE.Vector2(0.1, 0.1),
194
- new THREE.Vector2(0.9, 0.1),
195
- ],
196
- totalLength: 0.8,
197
- color: new THREE.Color(0xff6600),
198
- duration: 1500,
199
- lineWidth: 0.01,
200
- },
201
- {
202
- points: [
203
- new THREE.Vector2(0.1, 0.5),
204
- new THREE.Vector2(0.9, 0.5),
205
- ],
206
- totalLength: 0.8,
207
- color: new THREE.Color(0x0066ff),
208
- opacity: 0.7,
209
- duration: 2000,
210
- delay: 500,
211
- lineWidth: 0.015,
212
- },
213
- ];</p>
214
- <p>pass.setLines(paths);
215
- five.addPass(pass);</p>
216
- <p>// 响应用户交互动态更新路径
217
- document.addEventListener('click', (e) =&gt; {
218
- const rect = five.canvas.getBoundingClientRect();
219
- const x = (e.clientX - rect.left) / rect.width;
220
- const y = (e.clientY - rect.top) / rect.height; // 左上角为原点,无需翻转</p>
221
- <p>const newPath = {
222
- points: [
223
- new THREE.Vector2(0.5, 0.5),
224
- new THREE.Vector2(x, y),
225
- ],
226
- totalLength: Math.hypot(x - 0.5, y - 0.5),
227
- color: new THREE.Color(Math.random() * 0xffffff),
228
- duration: 1200,
229
- lineWidth: 0.01,
230
- };
231
- pass.setLines([...paths, newPath]);
232
- });</p>
164
+ <pre><code class="typescript"><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">pass</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">FlowingLight2DPass</span><span class="hl-1">(</span><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-6">camera</span><span class="hl-1">);</span><br/><br/><span class="hl-8">// 初始路径集合</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">paths</span><span class="hl-1"> = [</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">points:</span><span class="hl-1"> [</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.1</span><span class="hl-1">, </span><span class="hl-11">0.1</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.9</span><span class="hl-1">, </span><span class="hl-11">0.1</span><span class="hl-1">),</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> </span><span class="hl-6">totalLength:</span><span class="hl-1"> </span><span class="hl-11">0.8</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">color:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Color</span><span class="hl-1">(</span><span class="hl-11">0xff6600</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">duration:</span><span class="hl-1"> </span><span class="hl-11">1500</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">lineWidth:</span><span class="hl-1"> </span><span class="hl-11">0.01</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">points:</span><span class="hl-1"> [</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.1</span><span class="hl-1">, </span><span class="hl-11">0.5</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.9</span><span class="hl-1">, </span><span class="hl-11">0.5</span><span class="hl-1">),</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> </span><span class="hl-6">totalLength:</span><span class="hl-1"> </span><span class="hl-11">0.8</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">color:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Color</span><span class="hl-1">(</span><span class="hl-11">0x0066ff</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">opacity:</span><span class="hl-1"> </span><span class="hl-11">0.7</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">duration:</span><span class="hl-1"> </span><span class="hl-11">2000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">delay:</span><span class="hl-1"> </span><span class="hl-11">500</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">lineWidth:</span><span class="hl-1"> </span><span class="hl-11">0.015</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-6">pass</span><span class="hl-1">.</span><span class="hl-5">setLines</span><span class="hl-1">(</span><span class="hl-6">paths</span><span class="hl-1">);</span><br/><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-5">addPass</span><span class="hl-1">(</span><span class="hl-6">pass</span><span class="hl-1">);</span><br/><br/><span class="hl-8">// 响应用户交互动态更新路径</span><br/><span class="hl-6">document</span><span class="hl-1">.</span><span class="hl-5">addEventListener</span><span class="hl-1">(</span><span class="hl-9">&#39;click&#39;</span><span class="hl-1">, (</span><span class="hl-6">e</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">rect</span><span class="hl-1"> = </span><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-6">canvas</span><span class="hl-1">.</span><span class="hl-5">getBoundingClientRect</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">x</span><span class="hl-1"> = (</span><span class="hl-6">e</span><span class="hl-1">.</span><span class="hl-6">clientX</span><span class="hl-1"> - </span><span class="hl-6">rect</span><span class="hl-1">.</span><span class="hl-6">left</span><span class="hl-1">) / </span><span class="hl-6">rect</span><span class="hl-1">.</span><span class="hl-6">width</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">y</span><span class="hl-1"> = (</span><span class="hl-6">e</span><span class="hl-1">.</span><span class="hl-6">clientY</span><span class="hl-1"> - </span><span class="hl-6">rect</span><span class="hl-1">.</span><span class="hl-6">top</span><span class="hl-1">) / </span><span class="hl-6">rect</span><span class="hl-1">.</span><span class="hl-6">height</span><span class="hl-1">; </span><span class="hl-8">// 左上角为原点,无需翻转</span><br/><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">newPath</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-6">points:</span><span class="hl-1"> [</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.5</span><span class="hl-1">, </span><span class="hl-11">0.5</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-6">x</span><span class="hl-1">, </span><span class="hl-6">y</span><span class="hl-1">),</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> </span><span class="hl-6">totalLength:</span><span class="hl-1"> </span><span class="hl-6">Math</span><span class="hl-1">.</span><span class="hl-5">hypot</span><span class="hl-1">(</span><span class="hl-6">x</span><span class="hl-1"> - </span><span class="hl-11">0.5</span><span class="hl-1">, </span><span class="hl-6">y</span><span class="hl-1"> - </span><span class="hl-11">0.5</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">color:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Color</span><span class="hl-1">(</span><span class="hl-6">Math</span><span class="hl-1">.</span><span class="hl-5">random</span><span class="hl-1">() * </span><span class="hl-11">0xffffff</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">duration:</span><span class="hl-1"> </span><span class="hl-11">1200</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">lineWidth:</span><span class="hl-1"> </span><span class="hl-11">0.01</span><span class="hl-1">,</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> </span><span class="hl-6">pass</span><span class="hl-1">.</span><span class="hl-5">setLines</span><span class="hl-1">([...</span><span class="hl-6">paths</span><span class="hl-1">, </span><span class="hl-6">newPath</span><span class="hl-1">]);</span><br/><span class="hl-1">});</span>
165
+ </code><button type="button">Copy</button></pre>
166
+
233
167
  <h3 id="计算路径总长度" class="tsd-anchor-link">计算路径总长度<a href="#计算路径总长度" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
234
- <p>function calculatePathLength(points: THREE.Vector2[]): number {
235
- let length = 0;
236
- for (let i = 1; i &lt; points.length; i++) {
237
- length += points[i].distanceTo(points[i - 1]);
238
- }
239
- return length;
240
- }</p>
241
- <p>const points = [
242
- new THREE.Vector2(0.3, 0.7),
243
- new THREE.Vector2(0.7, 0.7),
244
- new THREE.Vector2(0.7, 0.3),
245
- new THREE.Vector2(0.3, 0.3),
246
- new THREE.Vector2(0.3, 0.7),
247
- ];</p>
248
- <p>const pathLine = {
249
- points: points,
250
- totalLength: calculatePathLength(points),
251
- color: new THREE.Color(0x00ffff),
252
- duration: 2000,
253
- lineWidth: 0.01,
254
- };</p>
168
+ <pre><code class="typescript"><span class="hl-3">function</span><span class="hl-1"> </span><span class="hl-5">calculatePathLength</span><span class="hl-1">(</span><span class="hl-6">points</span><span class="hl-1">: </span><span class="hl-7">THREE</span><span class="hl-1">.</span><span class="hl-7">Vector2</span><span class="hl-1">[]): </span><span class="hl-7">number</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-3">let</span><span class="hl-1"> </span><span class="hl-6">length</span><span class="hl-1"> = </span><span class="hl-11">0</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-10">for</span><span class="hl-1"> (</span><span class="hl-3">let</span><span class="hl-1"> </span><span class="hl-6">i</span><span class="hl-1"> = </span><span class="hl-11">1</span><span class="hl-1">; </span><span class="hl-6">i</span><span class="hl-1"> &lt; </span><span class="hl-6">points</span><span class="hl-1">.</span><span class="hl-6">length</span><span class="hl-1">; </span><span class="hl-6">i</span><span class="hl-1">++) {</span><br/><span class="hl-1"> </span><span class="hl-6">length</span><span class="hl-1"> += </span><span class="hl-6">points</span><span class="hl-1">[</span><span class="hl-6">i</span><span class="hl-1">].</span><span class="hl-5">distanceTo</span><span class="hl-1">(</span><span class="hl-6">points</span><span class="hl-1">[</span><span class="hl-6">i</span><span class="hl-1"> - </span><span class="hl-11">1</span><span class="hl-1">]);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> </span><span class="hl-10">return</span><span class="hl-1"> </span><span class="hl-6">length</span><span class="hl-1">;</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">points</span><span class="hl-1"> = [</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.3</span><span class="hl-1">, </span><span class="hl-11">0.7</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.7</span><span class="hl-1">, </span><span class="hl-11">0.7</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.7</span><span class="hl-1">, </span><span class="hl-11">0.3</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.3</span><span class="hl-1">, </span><span class="hl-11">0.3</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.3</span><span class="hl-1">, </span><span class="hl-11">0.7</span><span class="hl-1">),</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">pathLine</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-6">points:</span><span class="hl-1"> </span><span class="hl-6">points</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">totalLength:</span><span class="hl-1"> </span><span class="hl-5">calculatePathLength</span><span class="hl-1">(</span><span class="hl-6">points</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">color:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Color</span><span class="hl-1">(</span><span class="hl-11">0x00ffff</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">duration:</span><span class="hl-1"> </span><span class="hl-11">2000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">lineWidth:</span><span class="hl-1"> </span><span class="hl-11">0.01</span><span class="hl-1">,</span><br/><span class="hl-1">};</span>
169
+ </code><button type="button">Copy</button></pre>
170
+
255
171
  <h3 id="矩形路径示例" class="tsd-anchor-link">矩形路径示例<a href="#矩形路径示例" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
256
172
  <pre><code class="ts"><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">pass</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">FlowingLight2DPass</span><span class="hl-1">(</span><span class="hl-6">five</span><span class="hl-1">.</span><span class="hl-6">camera</span><span class="hl-1">);</span><br/><br/><span class="hl-8">// 创建一个矩形路径(注意:左上角为原点)</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">rectPath</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-6">points:</span><span class="hl-1"> [</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.3</span><span class="hl-1">, </span><span class="hl-11">0.3</span><span class="hl-1">), </span><span class="hl-8">// 左上</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.7</span><span class="hl-1">, </span><span class="hl-11">0.3</span><span class="hl-1">), </span><span class="hl-8">// 右上</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.7</span><span class="hl-1">, </span><span class="hl-11">0.7</span><span class="hl-1">), </span><span class="hl-8">// 右下</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.3</span><span class="hl-1">, </span><span class="hl-11">0.7</span><span class="hl-1">), </span><span class="hl-8">// 左下</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.3</span><span class="hl-1">, </span><span class="hl-11">0.3</span><span class="hl-1">), </span><span class="hl-8">// 闭合路径</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> </span><span class="hl-6">totalLength:</span><span class="hl-1"> </span><span class="hl-11">1.6</span><span class="hl-1">, </span><span class="hl-8">// 矩形周长</span><br/><span class="hl-1"> </span><span class="hl-6">color:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Color</span><span class="hl-1">(</span><span class="hl-11">1.0</span><span class="hl-1">, </span><span class="hl-11">1.0</span><span class="hl-1">, </span><span class="hl-11">1.0</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">opacity:</span><span class="hl-1"> </span><span class="hl-11">1.0</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">duration:</span><span class="hl-1"> </span><span class="hl-11">4000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">delay:</span><span class="hl-1"> </span><span class="hl-11">2000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">lineWidth:</span><span class="hl-1"> </span><span class="hl-11">0.01</span><span class="hl-1">,</span><br/><span class="hl-1">};</span><br/><br/><span class="hl-6">pass</span><span class="hl-1">.</span><span class="hl-5">setLines</span><span class="hl-1">([</span><span class="hl-6">rectPath</span><span class="hl-1">]);</span>
257
173
  </code><button type="button">Copy</button></pre>
258
174
 
259
175
  <h3 id="高-dpr-场景优化" class="tsd-anchor-link">高 DPR 场景优化<a href="#高-dpr-场景优化" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3>
260
- <p>// InstancedMesh 实现自动优化高 DPR 性能
261
- // 在 DPR=2 的 Retina 屏幕上,性能显著优于全屏着色器方案</p>
262
- <p>const pass = new FlowingLight2DPass(camera);</p>
263
- <p>// 多条路径在高 DPR 下仍能保持流畅
264
- const paths = Array.from({ length: 10 }, (_, i) =&gt; ({
265
- points: [
266
- new THREE.Vector2(0.1, 0.1 + i * 0.08),
267
- new THREE.Vector2(0.9, 0.1 + i * 0.08),
268
- ],
269
- totalLength: 0.8,
270
- color: new THREE.Color(Math.random() * 0xffffff),
271
- duration: 2000 + i * 100,
272
- delay: i * 200,
273
- lineWidth: 0.01,
274
- }));</p>
275
- <p>pass.setLines(paths);</p>
176
+ <pre><code class="typescript"><span class="hl-8">// InstancedMesh 实现自动优化高 DPR 性能</span><br/><span class="hl-8">// 在 DPR=2 的 Retina 屏幕上,性能显著优于全屏着色器方案</span><br/><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">pass</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-5">FlowingLight2DPass</span><span class="hl-1">(</span><span class="hl-6">camera</span><span class="hl-1">);</span><br/><br/><span class="hl-8">// 多条路径在高 DPR 下仍能保持流畅</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">paths</span><span class="hl-1"> = </span><span class="hl-6">Array</span><span class="hl-1">.</span><span class="hl-5">from</span><span class="hl-1">({ </span><span class="hl-6">length:</span><span class="hl-1"> </span><span class="hl-11">10</span><span class="hl-1"> }, (</span><span class="hl-6">_</span><span class="hl-1">, </span><span class="hl-6">i</span><span class="hl-1">) </span><span class="hl-3">=&gt;</span><span class="hl-1"> ({</span><br/><span class="hl-1"> </span><span class="hl-6">points:</span><span class="hl-1"> [</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.1</span><span class="hl-1">, </span><span class="hl-11">0.1</span><span class="hl-1"> + </span><span class="hl-6">i</span><span class="hl-1"> * </span><span class="hl-11">0.08</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Vector2</span><span class="hl-1">(</span><span class="hl-11">0.9</span><span class="hl-1">, </span><span class="hl-11">0.1</span><span class="hl-1"> + </span><span class="hl-6">i</span><span class="hl-1"> * </span><span class="hl-11">0.08</span><span class="hl-1">),</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> </span><span class="hl-6">totalLength:</span><span class="hl-1"> </span><span class="hl-11">0.8</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">color:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-4">THREE</span><span class="hl-1">.</span><span class="hl-5">Color</span><span class="hl-1">(</span><span class="hl-6">Math</span><span class="hl-1">.</span><span class="hl-5">random</span><span class="hl-1">() * </span><span class="hl-11">0xffffff</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">duration:</span><span class="hl-1"> </span><span class="hl-11">2000</span><span class="hl-1"> + </span><span class="hl-6">i</span><span class="hl-1"> * </span><span class="hl-11">100</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">delay:</span><span class="hl-1"> </span><span class="hl-6">i</span><span class="hl-1"> * </span><span class="hl-11">200</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">lineWidth:</span><span class="hl-1"> </span><span class="hl-11">0.01</span><span class="hl-1">,</span><br/><span class="hl-1">}));</span><br/><br/><span class="hl-6">pass</span><span class="hl-1">.</span><span class="hl-5">setLines</span><span class="hl-1">(</span><span class="hl-6">paths</span><span class="hl-1">);</span>
177
+ </code><button type="button">Copy</button></pre>
178
+
276
179
  <h2 id="debugging" class="tsd-anchor-link">Debugging<a href="#debugging" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2>
277
180
  <ul>
278
181
  <li><strong>光带不出现</strong>: 检查 <code>color</code> 和 <code>opacity</code>,确保非全透明;验证 <code>points</code> 至少 2 个;确认坐标在 [0, 1] 范围内。</li>