@realsee/five 6.8.9 → 6.9.0-alpha.1
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/3dgs-current-branch-changes.md +237 -0
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/highlight.css +18 -18
- 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 +4 -4
- package/docs/classes/five.FivePass.html +1 -1
- package/docs/classes/five.FlowingFireworks3DPass.html +30 -0
- package/docs/classes/five.FlowingLight2DPass.html +1 -1
- package/docs/classes/five.FlowingLight3DPass.html +1 -1
- package/docs/classes/five.GaussianBlurPass.html +1 -1
- package/docs/classes/five.InternalWebGLRenderer.html +1 -1
- package/docs/classes/five.Model.html +2 -2
- package/docs/classes/five.ModelScene.html +1 -1
- package/docs/classes/five.NetworkSubscribe.html +2 -2
- package/docs/classes/five.PBMContainer.html +1 -1
- package/docs/classes/five.PBMCustomShader.html +2 -2
- package/docs/classes/five.PBMGSObject.html +10 -13
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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.CSS2DObject.html +1 -1
- package/docs/classes/plugins.CSS3DObject.html +1 -1
- package/docs/classes/plugins.CSS3DSprite.html +1 -1
- package/docs/classes/plugins.InstancedPrefabBufferGeometry.html +1 -1
- package/docs/classes/plugins.Object3DHelperController.html +1 -1
- package/docs/classes/plugins.PointBufferGeometry.html +1 -1
- package/docs/classes/plugins.PrefabBufferGeometry.html +1 -1
- package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
- package/docs/classes/react.Store.html +1 -1
- package/docs/classes/sticker.Sticker.html +2 -2
- 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/3dgs-current-branch-changes.html +205 -0
- package/docs/documents/api.html +6 -6
- package/docs/documents/features_3dtile.html +4 -4
- package/docs/documents/features_camera-animation.html +10 -10
- package/docs/documents/features_clipper.html +3 -3
- package/docs/documents/features_coordinate-system.html +3 -3
- package/docs/documents/features_event.html +10 -10
- package/docs/documents/features_five.html +4 -4
- package/docs/documents/features_flowing-fireworks-3d-pass.html +7 -7
- package/docs/documents/features_flowing-light-2d-pass.html +11 -11
- package/docs/documents/features_flowing-light-3d-pass.html +11 -11
- package/docs/documents/features_gaussian-blur-pass.html +6 -6
- package/docs/documents/features_gesture.html +6 -6
- package/docs/documents/features_get-screen-pixels.html +4 -4
- package/docs/documents/features_image-options.html +5 -5
- package/docs/documents/features_load-external-model.html +8 -8
- package/docs/documents/features_load-progress.html +7 -7
- package/docs/documents/features_material.html +3 -3
- package/docs/documents/features_mode.html +11 -11
- package/docs/documents/features_model.html +4 -4
- package/docs/documents/features_move-pano-effect.html +5 -5
- package/docs/documents/features_multi-work.html +5 -5
- package/docs/documents/features_pano-filter.html +3 -3
- package/docs/documents/features_pano-tile.html +4 -4
- package/docs/documents/features_pano-uv.html +4 -4
- package/docs/documents/features_parameter.html +7 -7
- package/docs/documents/features_plugin.html +4 -4
- package/docs/documents/features_postprocessing.html +5 -5
- package/docs/documents/features_raycast.html +4 -4
- package/docs/documents/features_request-proxy.html +4 -4
- package/docs/documents/features_screen-project.html +3 -3
- package/docs/documents/features_state.html +4 -4
- package/docs/documents/features_view-layer.html +4 -4
- package/docs/documents/features_work.html +5 -5
- package/docs/documents/quick-start.html +2 -2
- package/docs/documents/release_notes_6.6.html +4 -4
- package/docs/documents/release_notes_6.7.html +14 -14
- package/docs/documents/release_notes_6.8.html +4 -4
- package/docs/functions/five.loadSpz.html +1 -1
- package/docs/functions/react.useFiveAction.html +6 -6
- package/docs/functions/react.useFiveCurrentObserver.html +1 -1
- package/docs/functions/react.useFiveCurrentState.html +1 -1
- package/docs/functions/react.useFiveEventCallback.html +1 -1
- package/docs/functions/react.useFiveFloor.html +1 -1
- package/docs/functions/react.useFiveHelper.html +1 -1
- package/docs/functions/react.useFiveModelIntersectRaycaster.html +2 -2
- package/docs/functions/react.useFiveProject2d.html +2 -2
- package/docs/functions/react.useFiveSceneEffect.html +1 -1
- package/docs/functions/react.useFiveWork.html +2 -2
- package/docs/functions/vue.useFiveAction.html +8 -8
- package/docs/functions/vue.useFiveCurrentObserver.html +1 -1
- package/docs/functions/vue.useFiveCurrentState.html +1 -1
- package/docs/functions/vue.useFiveEventCallback.html +1 -1
- package/docs/functions/vue.useFiveFloor.html +1 -1
- package/docs/functions/vue.useFiveHelper.html +1 -1
- package/docs/functions/vue.useFiveModelIntersectRaycaster.html +2 -2
- package/docs/functions/vue.useFiveProject2d.html +2 -2
- package/docs/functions/vue.useFiveState.html +1 -1
- package/docs/functions/vue.useFiveWorks.html +2 -2
- 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 +1 -1
- package/docs/interfaces/five.BaseExtendableEvent.html +1 -1
- package/docs/interfaces/five.EventCallback.html +1 -1
- package/docs/interfaces/five.FiveInitArgs.html +2 -2
- package/docs/interfaces/five.GestureEvent.html +1 -1
- package/docs/interfaces/five.ImageOptions.html +1 -1
- package/docs/interfaces/five.IntersectEvent.html +1 -1
- 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.ModeChangeEvent.html +1 -1
- package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.ModelEvent.html +1 -1
- package/docs/interfaces/five.ModelSceneEvent.html +1 -1
- package/docs/interfaces/five.ModelTileEvent.html +1 -1
- 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 +1 -1
- package/docs/interfaces/five.NetworkResponseError.html +1 -1
- package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
- package/docs/interfaces/five.ObjectEvent.html +1 -1
- 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 +1 -1
- package/docs/interfaces/five.PanoPrepareEvent.html +1 -1
- package/docs/interfaces/five.PanoTextureEvent.html +1 -1
- package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +1 -1
- 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 +1 -1
- package/docs/interfaces/five.ResolvedParameterValue.html +1 -1
- package/docs/interfaces/five.SplatData.html +3 -6
- package/docs/interfaces/five.State.html +1 -1
- package/docs/interfaces/five.StateEvent.html +1 -1
- package/docs/interfaces/five.TextureOptions.html +1 -1
- package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +1 -1
- 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 +2 -2
- package/docs/interfaces/five.WorkObserverProto.html +1 -1
- package/docs/interfaces/five.WorkTile.html +1 -1
- package/docs/interfaces/five.WorksEvent.html +1 -1
- package/docs/interfaces/five.XRControllerEvent.html +1 -1
- package/docs/interfaces/five.XRGestureEvent.html +1 -1
- package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/five.XRSessionEvent.html +1 -1
- 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.CSS2DPluginController.html +1 -1
- package/docs/interfaces/plugins.CSS2DPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.CSS2DPluginType.State.html +1 -1
- package/docs/interfaces/plugins.CSS3DPluginController.html +1 -1
- package/docs/interfaces/plugins.CSS3DPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.CSS3DPluginType.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 +1 -1
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +1 -1
- package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +1 -1
- 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.Object3DHelperPluginType.BaseController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.BaseHelper.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.BoundingBoxController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.MoveController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.MoveHelperAbstract.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.RotateController.html +1 -1
- package/docs/interfaces/plugins.Object3DHelperPluginType.RotateHelperAbstract.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 +2 -2
- package/docs/interfaces/react.UseFivePluginOptions.html +1 -1
- package/docs/interfaces/react.UseFivePluginOptionsWithCreate.html +1 -1
- package/docs/modules/five.html +1 -1
- package/docs/modules.html +1 -1
- package/docs/types/five.FlowingFireworks3DPassLine.html +16 -0
- package/docs/types/five.ParseOptions.html +1 -1
- package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
- package/docs/variables/react.FiveCanvas.html +1 -1
- package/docs/variables/react.useFiveScene.html +1 -1
- package/docs/variables/vue.FiveCanvas.html +1 -1
- package/docs/variables/vue.FiveProvider.html +1 -1
- package/five/gaussian-splatting/layerRegistry.d.ts +10 -0
- package/five/gaussian-splatting/orderTexture.d.ts +18 -0
- package/five/gaussian-splatting/reorderPass.d.ts +34 -0
- package/five/gaussian-splatting/shStore.d.ts +16 -0
- package/five/gaussian-splatting/splatAssembler.d.ts +60 -0
- package/five/gaussian-splatting/tileTexture.d.ts +10 -0
- package/five/gaussian-splatting/transformStore.d.ts +20 -0
- package/five/index.js +305 -169
- package/five/index.mjs +6684 -6508
- package/five/model/index.d.ts +0 -1
- package/five/model/loaders/spz.d.ts +19 -3
- package/five/model/objects/pbmGaussianSplattingObject.d.ts +10 -14
- package/five/model/objects/pbmGaussianSplattingRenderMesh.d.ts +48 -42
- package/five/renderer/index.d.ts +1 -1
- package/five/renderer/postprocessing/index.d.ts +1 -1
- package/five/renderer/postprocessing/passes/flowing-fireworks-3d-pass.d.ts +4 -5
- 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 +2 -2
- package/pbmGaussianSplattingObject-C6i7CUTu.cjs +255 -0
- package/pbmGaussianSplattingObject-CaE6q4r-.js +324 -0
- package/plugins/index.js +2 -2
- package/plugins/index.mjs +2 -2
- 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 +2 -2
- 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 +218 -82
- 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/docs/functions/five.loadSplat.html +0 -1
- package/five/gaussian-splatting/util/renderData.d.ts +0 -68
- package/five/model/loaders/splat.d.ts +0 -8
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<p><strong>Definition</strong>: <a href="../../plugins/BasePlugin/index.d.ts">BasePlugin</a></p>
|
|
12
12
|
</blockquote>
|
|
13
13
|
<p><code>BasePlugin</code> 是一个命名空间,包含 <code>Controller</code> (抽象基类), <code>State</code> (状态接口), <code>EventMap</code> (事件映射) 等核心定义。</p>
|
|
14
|
-
<pre><code class="typescript"><span class="hl-
|
|
14
|
+
<pre><code class="typescript"><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">namespace</span><span class="hl-1"> </span><span class="hl-9">BasePlugin</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">State</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">enabled</span><span class="hl-1">: </span><span class="hl-9">boolean</span><br/><span class="hl-1"> </span><span class="hl-5">visible</span><span class="hl-1">?: </span><span class="hl-9">boolean</span><br/><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1">?: </span><span class="hl-9">unknown</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> </span><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">abstract</span><span class="hl-1"> </span><span class="hl-8">class</span><span class="hl-1"> </span><span class="hl-9">Controller</span><span class="hl-1"><</span><span class="hl-9">PluginState</span><span class="hl-1">, </span><span class="hl-9">PluginEventMap</span><span class="hl-1">, </span><span class="hl-9">PluginServerData</span><span class="hl-1">, </span><span class="hl-9">PluginData</span><span class="hl-1">> {</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">five</span><span class="hl-1">: </span><span class="hl-9">Five</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-8">abstract</span><span class="hl-1"> </span><span class="hl-5">state</span><span class="hl-1">: </span><span class="hl-9">PluginState</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">hooks</span><span class="hl-1">: </span><span class="hl-9">Subscribe</span><span class="hl-1"><</span><span class="hl-9">PluginEventMap</span><span class="hl-1">></span><br/><span class="hl-1"> </span><span class="hl-7">// ...</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
|
|
15
15
|
</code><button type="button">Copy</button></pre>
|
|
16
16
|
|
|
17
17
|
<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>
|
|
@@ -79,17 +79,17 @@
|
|
|
79
79
|
<p>以创建一个 <code>MyPlugin</code> 为例。</p>
|
|
80
80
|
<h4 id="1-定义类型-typingts" class="tsd-anchor-link">1. 定义类型 (typing.ts)<a href="#1-定义类型-typingts" 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></h4>
|
|
81
81
|
<p>定义插件所需的参数、状态、数据和事件类型。</p>
|
|
82
|
-
<pre><code class="typescript"><span class="hl-
|
|
82
|
+
<pre><code class="typescript"><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">BasePlugin</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'../BasePlugin'</span><br/><br/><span class="hl-7">// 1. 定义参数</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">Params</span><span class="hl-1"> </span><span class="hl-8">extends</span><span class="hl-1"> </span><span class="hl-9">BasePlugin</span><span class="hl-1">.</span><span class="hl-9">Config</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">initialState</span><span class="hl-1">?: </span><span class="hl-9">Partial</span><span class="hl-1"><</span><span class="hl-9">State</span><span class="hl-1">></span><br/><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1">?: </span><span class="hl-9">Config</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-7">// 2. 定义配置</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">Config</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">color</span><span class="hl-1">?: </span><span class="hl-9">string</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-7">// 3. 定义状态 (继承 BasePlugin.State)</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">State</span><span class="hl-1"> </span><span class="hl-8">extends</span><span class="hl-1"> </span><span class="hl-9">BasePlugin</span><span class="hl-1">.</span><span class="hl-9">State</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">activeId</span><span class="hl-1">?: </span><span class="hl-9">string</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-7">// 4. 定义数据类型</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">ServerData</span><span class="hl-1"> { </span><span class="hl-7">/* 服务端数据结构 */</span><span class="hl-1"> }</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">PluginData</span><span class="hl-1"> { </span><span class="hl-7">/* 解析后的数据结构 */</span><span class="hl-1"> }</span><br/><br/><span class="hl-7">// 5. 定义事件 (继承 BasePlugin.EventMap)</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">EventMap</span><span class="hl-1"> </span><span class="hl-8">extends</span><span class="hl-1"> </span><span class="hl-9">BasePlugin</span><span class="hl-1">.</span><span class="hl-9">EventMap</span><span class="hl-1"><</span><span class="hl-9">State</span><span class="hl-1">, </span><span class="hl-9">PluginData</span><span class="hl-1">> {</span><br/><span class="hl-1"> </span><span class="hl-4">click</span><span class="hl-1">: (</span><span class="hl-5">id</span><span class="hl-1">: </span><span class="hl-9">string</span><span class="hl-1">) </span><span class="hl-8">=></span><span class="hl-1"> </span><span class="hl-9">void</span><br/><span class="hl-1">}</span>
|
|
83
83
|
</code><button type="button">Copy</button></pre>
|
|
84
84
|
|
|
85
85
|
<h4 id="2-实现控制器-controllerts" class="tsd-anchor-link">2. 实现控制器 (Controller.ts)<a href="#2-实现控制器-controllerts" 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></h4>
|
|
86
86
|
<p>继承 <code>BasePlugin.Controller</code> 并实现核心逻辑。</p>
|
|
87
|
-
<pre><code class="typescript"><span class="hl-
|
|
87
|
+
<pre><code class="typescript"><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">Five</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'@realsee/five'</span><br/><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">BasePlugin</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'../BasePlugin'</span><br/><span class="hl-11">import</span><span class="hl-1"> </span><span class="hl-8">*</span><span class="hl-1"> </span><span class="hl-11">as</span><span class="hl-1"> </span><span class="hl-5">MyPluginType</span><span class="hl-1"> </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'./typing'</span><br/><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">class</span><span class="hl-1"> </span><span class="hl-9">Controller</span><span class="hl-1"> </span><span class="hl-8">extends</span><span class="hl-1"> </span><span class="hl-9">BasePlugin</span><span class="hl-1">.</span><span class="hl-9">Controller</span><span class="hl-1"><</span><br/><span class="hl-1"> </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">State</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">EventMap</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">ServerData</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">PluginData</span><br/><span class="hl-1">> {</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">state</span><span class="hl-1">: </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">State</span><br/><br/><span class="hl-1"> </span><span class="hl-8">constructor</span><span class="hl-1">(</span><span class="hl-5">five</span><span class="hl-1">: </span><span class="hl-9">Five</span><span class="hl-1">, </span><span class="hl-5">params</span><span class="hl-1">?: </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">Params</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-8">super</span><span class="hl-1">(</span><span class="hl-5">five</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-5">enabled:</span><span class="hl-1"> </span><span class="hl-8">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">visible:</span><span class="hl-1"> </span><span class="hl-8">true</span><span class="hl-1">,</span><br/><span class="hl-1"> ...</span><span class="hl-5">params</span><span class="hl-1">?.</span><span class="hl-5">initialState</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (</span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1">.</span><span class="hl-5">enabled</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-4">_enable</span><span class="hl-1">()</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-8">async</span><span class="hl-1"> </span><span class="hl-4">load</span><span class="hl-1">(</span><span class="hl-5">serverData</span><span class="hl-1">: </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">ServerData</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// 解析数据</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-4">enable</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (</span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1">.</span><span class="hl-5">enabled</span><span class="hl-1">) </span><span class="hl-11">return</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1">.</span><span class="hl-5">enabled</span><span class="hl-1"> = </span><span class="hl-8">true</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-4">_enable</span><span class="hl-1">()</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">hooks</span><span class="hl-1">.</span><span class="hl-4">emit</span><span class="hl-1">(</span><span class="hl-10">'stateChange'</span><span class="hl-1">, { </span><span class="hl-5">state:</span><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1">, </span><span class="hl-5">userAction:</span><span class="hl-1"> </span><span class="hl-8">true</span><span class="hl-1"> })</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-4">disable</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (!</span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1">.</span><span class="hl-5">enabled</span><span class="hl-1">) </span><span class="hl-11">return</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1">.</span><span class="hl-5">enabled</span><span class="hl-1"> = </span><span class="hl-8">false</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-4">_disable</span><span class="hl-1">()</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">hooks</span><span class="hl-1">.</span><span class="hl-4">emit</span><span class="hl-1">(</span><span class="hl-10">'stateChange'</span><span class="hl-1">, { </span><span class="hl-5">state:</span><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">state</span><span class="hl-1">, </span><span class="hl-5">userAction:</span><span class="hl-1"> </span><span class="hl-8">true</span><span class="hl-1"> })</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-4">dispose</span><span class="hl-1"> = () </span><span class="hl-8">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-4">disable</span><span class="hl-1">()</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">hooks</span><span class="hl-1">.</span><span class="hl-4">emit</span><span class="hl-1">(</span><span class="hl-10">'dispose'</span><span class="hl-1">)</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-8">private</span><span class="hl-1"> </span><span class="hl-4">_enable</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-7">// five.scene.add(...)</span><br/><span class="hl-1"> </span><span class="hl-7">// five.on('tap', this.onTap)</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-8">private</span><span class="hl-1"> </span><span class="hl-4">_disable</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-7">// five.scene.remove(...)</span><br/><span class="hl-1"> </span><span class="hl-7">// five.off('tap', this.onTap)</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
|
|
88
88
|
</code><button type="button">Copy</button></pre>
|
|
89
89
|
|
|
90
90
|
<h4 id="3-导出插件-indexts" class="tsd-anchor-link">3. 导出插件 (index.ts)<a href="#3-导出插件-indexts" 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></h4>
|
|
91
91
|
<p>提供一个工厂函数。</p>
|
|
92
|
-
<pre><code class="typescript"><span class="hl-
|
|
92
|
+
<pre><code class="typescript"><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">Five</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'@realsee/five'</span><br/><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">Controller</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'./Controller'</span><br/><span class="hl-11">import</span><span class="hl-1"> </span><span class="hl-8">*</span><span class="hl-1"> </span><span class="hl-11">as</span><span class="hl-1"> </span><span class="hl-5">MyPluginType</span><span class="hl-1"> </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'./typing'</span><br/><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-4">MyPlugin</span><span class="hl-1"> = (</span><span class="hl-5">five</span><span class="hl-1">: </span><span class="hl-9">Five</span><span class="hl-1">, </span><span class="hl-5">params</span><span class="hl-1">?: </span><span class="hl-9">MyPluginType</span><span class="hl-1">.</span><span class="hl-9">Params</span><span class="hl-1">) </span><span class="hl-8">=></span><br/><span class="hl-1"> </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-4">Controller</span><span class="hl-1">(</span><span class="hl-5">five</span><span class="hl-1">, </span><span class="hl-5">params</span><span class="hl-1">)</span><br/><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-11">type</span><span class="hl-1"> { </span><span class="hl-5">MyPluginType</span><span class="hl-1">, </span><span class="hl-5">Controller</span><span class="hl-1"> </span><span class="hl-11">as</span><span class="hl-1"> </span><span class="hl-5">MyPluginController</span><span class="hl-1"> }</span>
|
|
93
93
|
</code><button type="button">Copy</button></pre>
|
|
94
94
|
|
|
95
95
|
<h2 id="common-pitfalls-最佳实践" class="tsd-anchor-link">Common Pitfalls (最佳实践)<a href="#common-pitfalls-最佳实践" 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>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<blockquote>
|
|
11
11
|
<p><strong>Definition</strong>: <a href="../../five/renderer/postprocessing/passes/pass.d.ts">FivePass</a></p>
|
|
12
12
|
</blockquote>
|
|
13
|
-
<pre><code class="typescript"><span class="hl-
|
|
13
|
+
<pre><code class="typescript"><span class="hl-7">/**</span><br/><span class="hl-7"> * Pass 接口 (兼容 three.js EffectComposer)</span><br/><span class="hl-7"> */</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">Pass</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">enabled</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">needsSwap</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">clear</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">renderToScreen</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-4">setSize</span><span class="hl-1">(</span><span class="hl-5">width</span><span class="hl-1">: </span><span class="hl-9">number</span><span class="hl-1">, </span><span class="hl-5">height</span><span class="hl-1">: </span><span class="hl-9">number</span><span class="hl-1">): </span><span class="hl-9">void</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-4">render</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-5">renderer</span><span class="hl-1">: </span><span class="hl-9">THREE</span><span class="hl-1">.</span><span class="hl-9">WebGLRenderer</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">writeBuffer</span><span class="hl-1">: </span><span class="hl-9">THREE</span><span class="hl-1">.</span><span class="hl-9">WebGLRenderTarget</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">readBuffer</span><span class="hl-1">: </span><span class="hl-9">THREE</span><span class="hl-1">.</span><span class="hl-9">WebGLRenderTarget</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">deltaTime</span><span class="hl-1">?: </span><span class="hl-9">number</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">maskActive</span><span class="hl-1">?: </span><span class="hl-9">boolean</span><br/><span class="hl-1"> ): </span><span class="hl-9">void</span><span class="hl-1">;</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-7">/**</span><br/><span class="hl-7"> * FivePass 基类</span><br/><span class="hl-7"> * 支持 G-Buffer 注入 (depth, normal, color)</span><br/><span class="hl-7"> */</span><br/><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">class</span><span class="hl-1"> </span><span class="hl-9">FivePass</span><span class="hl-1"> </span><span class="hl-8">implements</span><span class="hl-1"> </span><span class="hl-9">Pass</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">enabled</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">needsSwap</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">clear</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1"> = </span><span class="hl-8">false</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">renderToScreen</span><span class="hl-1">: </span><span class="hl-9">boolean</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">dependencies</span><span class="hl-1">: (</span><span class="hl-10">'depth'</span><span class="hl-1"> | </span><span class="hl-10">'normal'</span><span class="hl-1"> | </span><span class="hl-10">'color'</span><span class="hl-1">)[];</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// 由 EffectComposer 在 render 时注入</span><br/><span class="hl-1"> </span><span class="hl-8">public</span><span class="hl-1"> </span><span class="hl-5">gbuffer</span><span class="hl-1">!: </span><span class="hl-9">Map</span><span class="hl-1"><</span><span class="hl-10">'depth'</span><span class="hl-1"> | </span><span class="hl-10">'normal'</span><span class="hl-1"> | </span><span class="hl-10">'color'</span><span class="hl-1">, </span><span class="hl-9">THREE</span><span class="hl-1">.</span><span class="hl-9">Texture</span><span class="hl-1">>;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">constructor</span><span class="hl-1">(</span><span class="hl-5">dependencies</span><span class="hl-1">?: (</span><span class="hl-10">'depth'</span><span class="hl-1"> | </span><span class="hl-10">'normal'</span><span class="hl-1"> | </span><span class="hl-10">'color'</span><span class="hl-1">)[]);</span><br/><span class="hl-1"> </span><span class="hl-7">// ... render method implementation</span><br/><span class="hl-1">}</span>
|
|
14
14
|
</code><button type="button">Copy</button></pre>
|
|
15
15
|
|
|
16
16
|
<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>
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
<li><strong><a href="features_flowing-fireworks-3d-pass.html">FlowingFireworks3DPass</a></strong>: 在 3D 流光尾部喷射烟花粒子的配套特效。</li>
|
|
57
57
|
</ul>
|
|
58
58
|
<h4 id="gaussianblurpass-使用示例" class="tsd-anchor-link">GaussianBlurPass 使用示例<a href="#gaussianblurpass-使用示例" 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></h4>
|
|
59
|
-
<pre><code class="typescript"><span class="hl-
|
|
59
|
+
<pre><code class="typescript"><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">GaussianBlurPass</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'@realsee/five'</span><span class="hl-1">;</span><br/><br/><span class="hl-7">// 1. 创建 GaussianBlurPass 实例 (需要传入 camera)</span><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">gaussianBlurPass</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-4">GaussianBlurPass</span><span class="hl-1">(</span><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">camera</span><span class="hl-1">);</span><br/><br/><span class="hl-7">// 2. 配置参数</span><br/><span class="hl-7">// 设置模糊半径 (默认 4.0)</span><br/><span class="hl-5">gaussianBlurPass</span><span class="hl-1">.</span><span class="hl-4">setRadius</span><span class="hl-1">(</span><span class="hl-3">6</span><span class="hl-1">);</span><br/><br/><span class="hl-7">// 3. 将 Pass 添加到渲染链</span><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-4">addPass</span><span class="hl-1">(</span><span class="hl-5">gaussianBlurPass</span><span class="hl-1">);</span><br/><br/><span class="hl-7">// 4. (可选) 动态开关</span><br/><span class="hl-7">// gaussianBlurPass.enabled = false;</span><br/><br/><span class="hl-7">// 5. (可选) 移除 Pass</span><br/><span class="hl-7">// five.removePass(gaussianBlurPass);</span>
|
|
60
60
|
</code><button type="button">Copy</button></pre>
|
|
61
61
|
|
|
62
62
|
<h2 id="custom-pass-自定义-pass" class="tsd-anchor-link">Custom Pass (自定义 Pass)<a href="#custom-pass-自定义-pass" 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>
|
|
@@ -70,16 +70,16 @@
|
|
|
70
70
|
</ol>
|
|
71
71
|
<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>
|
|
72
72
|
<h3 id="开启内置-pass" class="tsd-anchor-link">开启内置 Pass<a href="#开启内置-pass" 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>
|
|
73
|
-
<pre><code class="typescript"><span class="hl-
|
|
73
|
+
<pre><code class="typescript"><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">Five</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'@realsee/five'</span><span class="hl-1">;</span><br/><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">five</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-4">Five</span><span class="hl-1">();</span><br/><br/><span class="hl-7">// 开启自适应亮度</span><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">adaptiveLuminancePass</span><span class="hl-1">.</span><span class="hl-5">enabled</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">adaptiveLuminancePass</span><span class="hl-1">.</span><span class="hl-5">luminanceScale</span><span class="hl-1"> = </span><span class="hl-3">0.5</span><span class="hl-1">; </span><span class="hl-7">// 调整目标亮度</span><br/><br/><span class="hl-7">// 开启 EDL (通常用于点云模式)</span><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">eyeDomeLightingPass</span><span class="hl-1">.</span><span class="hl-5">enabled</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">eyeDomeLightingPass</span><span class="hl-1">.</span><span class="hl-5">strength</span><span class="hl-1"> = </span><span class="hl-3">1.5</span><span class="hl-1">; </span><span class="hl-7">// 增强轮廓感</span><br/><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">needsRender</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span>
|
|
74
74
|
</code><button type="button">Copy</button></pre>
|
|
75
75
|
|
|
76
76
|
<h3 id="自定义-pass-黑白滤镜" class="tsd-anchor-link">自定义 Pass (黑白滤镜)<a href="#自定义-pass-黑白滤镜" 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>
|
|
77
|
-
<pre><code class="typescript"><span class="hl-
|
|
77
|
+
<pre><code class="typescript"><span class="hl-11">import</span><span class="hl-1"> </span><span class="hl-8">*</span><span class="hl-1"> </span><span class="hl-11">as</span><span class="hl-1"> </span><span class="hl-5">THREE</span><span class="hl-1"> </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'three'</span><span class="hl-1">;</span><br/><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">Five</span><span class="hl-1">, </span><span class="hl-5">FivePass</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'@realsee/five'</span><span class="hl-1">;</span><br/><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">FullScreenQuad</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'@realsee/five/lib/five/tools/full-screen-quad'</span><span class="hl-1">; </span><span class="hl-7">// 需根据实际路径引用</span><br/><br/><span class="hl-7">// 1. 定义 Shader</span><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">grayscaleVertexShader</span><span class="hl-1"> = </span><span class="hl-10">`</span><br/><span class="hl-10"> varying vec2 vUv;</span><br/><span class="hl-10"> void main() {</span><br/><span class="hl-10"> vUv = uv;</span><br/><span class="hl-10"> gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);</span><br/><span class="hl-10"> }</span><br/><span class="hl-10">`</span><span class="hl-1">;</span><br/><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">grayscaleFragmentShader</span><span class="hl-1"> = </span><span class="hl-10">`</span><br/><span class="hl-10"> uniform sampler2D tDiffuse;</span><br/><span class="hl-10"> varying vec2 vUv;</span><br/><span class="hl-10"> void main() {</span><br/><span class="hl-10"> vec4 color = texture2D(tDiffuse, vUv);</span><br/><span class="hl-10"> float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));</span><br/><span class="hl-10"> gl_FragColor = vec4(vec3(gray), color.a);</span><br/><span class="hl-10"> }</span><br/><span class="hl-10">`</span><span class="hl-1">;</span><br/><br/><span class="hl-7">// 2. 创建 Pass 类</span><br/><span class="hl-8">class</span><span class="hl-1"> </span><span class="hl-9">GrayscalePass</span><span class="hl-1"> </span><span class="hl-8">extends</span><span class="hl-1"> </span><span class="hl-9">FivePass</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">private</span><span class="hl-1"> </span><span class="hl-5">material</span><span class="hl-1">: </span><span class="hl-9">THREE</span><span class="hl-1">.</span><span class="hl-9">ShaderMaterial</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">private</span><span class="hl-1"> </span><span class="hl-5">fsQuad</span><span class="hl-1">: </span><span class="hl-9">FullScreenQuad</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">constructor</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-8">super</span><span class="hl-1">(); </span><span class="hl-7">// 不需要额外的 G-Buffer 依赖,只需要前一个 Pass 的颜色结果</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">material</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-6">THREE</span><span class="hl-1">.</span><span class="hl-4">ShaderMaterial</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-5">uniforms:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">tDiffuse:</span><span class="hl-1"> { </span><span class="hl-5">value:</span><span class="hl-1"> </span><span class="hl-8">null</span><span class="hl-1"> }</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-5">vertexShader:</span><span class="hl-1"> </span><span class="hl-5">grayscaleVertexShader</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">fragmentShader:</span><span class="hl-1"> </span><span class="hl-5">grayscaleFragmentShader</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">fsQuad</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-4">FullScreenQuad</span><span class="hl-1">(</span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">material</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">render</span><span class="hl-1">(</span><span class="hl-5">renderer</span><span class="hl-1">, </span><span class="hl-5">writeBuffer</span><span class="hl-1">, </span><span class="hl-5">readBuffer</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// 将上一个 Pass 的结果 (readBuffer) 传给 Shader</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">material</span><span class="hl-1">.</span><span class="hl-5">uniforms</span><span class="hl-1">.</span><span class="hl-5">tDiffuse</span><span class="hl-1">.</span><span class="hl-5">value</span><span class="hl-1"> = </span><span class="hl-5">readBuffer</span><span class="hl-1">.</span><span class="hl-5">texture</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (</span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">renderToScreen</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// 如果是最后一个 Pass,直接渲染到屏幕</span><br/><span class="hl-1"> </span><span class="hl-5">renderer</span><span class="hl-1">.</span><span class="hl-4">setRenderTarget</span><span class="hl-1">(</span><span class="hl-8">null</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">fsQuad</span><span class="hl-1">.</span><span class="hl-4">render</span><span class="hl-1">(</span><span class="hl-5">renderer</span><span class="hl-1">);</span><br/><span class="hl-1"> } </span><span class="hl-11">else</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-7">// 否则渲染到 writeBuffer,供下一个 Pass 使用</span><br/><span class="hl-1"> </span><span class="hl-5">renderer</span><span class="hl-1">.</span><span class="hl-4">setRenderTarget</span><span class="hl-1">(</span><span class="hl-5">writeBuffer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (</span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">clear</span><span class="hl-1">) </span><span class="hl-5">renderer</span><span class="hl-1">.</span><span class="hl-4">clear</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">fsQuad</span><span class="hl-1">.</span><span class="hl-4">render</span><span class="hl-1">(</span><span class="hl-5">renderer</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/><br/><span class="hl-7">// 3. 挂载到 Five</span><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">grayPass</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-4">GrayscalePass</span><span class="hl-1">();</span><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-4">addPass</span><span class="hl-1">(</span><span class="hl-5">grayPass</span><span class="hl-1">);</span><br/><br/><span class="hl-7">// 触发重绘</span><br/><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">needsRender</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span>
|
|
78
78
|
</code><button type="button">Copy</button></pre>
|
|
79
79
|
|
|
80
80
|
<h3 id="使用-g-buffer-深度图示例" class="tsd-anchor-link">使用 G-Buffer (深度图示例)<a href="#使用-g-buffer-深度图示例" 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>
|
|
81
81
|
<p>如果你的 Pass 需要使用场景的深度信息(例如雾效),可以在构造函数中声明依赖。</p>
|
|
82
|
-
<pre><code class="typescript"><span class="hl-
|
|
82
|
+
<pre><code class="typescript"><span class="hl-8">class</span><span class="hl-1"> </span><span class="hl-9">FogPass</span><span class="hl-1"> </span><span class="hl-8">extends</span><span class="hl-1"> </span><span class="hl-9">FivePass</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">constructor</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-8">super</span><span class="hl-1">([</span><span class="hl-10">'depth'</span><span class="hl-1">]); </span><span class="hl-7">// 声明需要深度图</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">render</span><span class="hl-1">(</span><span class="hl-5">renderer</span><span class="hl-1">, </span><span class="hl-5">writeBuffer</span><span class="hl-1">, </span><span class="hl-5">readBuffer</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// 获取深度图</span><br/><span class="hl-1"> </span><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">depthTexture</span><span class="hl-1"> = </span><span class="hl-8">this</span><span class="hl-1">.</span><span class="hl-5">gbuffer</span><span class="hl-1">.</span><span class="hl-4">get</span><span class="hl-1">(</span><span class="hl-10">'depth'</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// 在 Shader 中使用 depthTexture ...</span><br/><span class="hl-1"> </span><span class="hl-7">// this.material.uniforms.tDepth.value = depthTexture;</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// ... 渲染逻辑</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
|
|
83
83
|
</code><button type="button">Copy</button></pre>
|
|
84
84
|
|
|
85
85
|
<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>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<p><strong>Definition</strong>: <a href="../../five/declare.d.ts">Raycaster</a></p>
|
|
11
11
|
</blockquote>
|
|
12
12
|
<p>Five 对 Three.js 的 <code>Raycaster</code> 进行了扩展,在 <code>declare module 'three'</code> 中增加了以下属性:</p>
|
|
13
|
-
<pre><code class="typescript"><span class="hl-
|
|
13
|
+
<pre><code class="typescript"><span class="hl-7">// defined in five/declare.d.ts</span><br/><span class="hl-8">declare</span><span class="hl-1"> </span><span class="hl-8">module</span><span class="hl-1"> </span><span class="hl-10">'three'</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">Raycaster</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-7">/**</span><br/><span class="hl-7"> * 只捕获第一个焦点 (性能优化)</span><br/><span class="hl-7"> * - true: 找到第一个交点后立即停止检测,返回结果。</span><br/><span class="hl-7"> * - false (默认): 检测所有可能的交点。</span><br/><span class="hl-7"> */</span><br/><span class="hl-1"> </span><span class="hl-5">firstHitOnly</span><span class="hl-1">?: </span><span class="hl-9">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-7">/**</span><br/><span class="hl-7"> * 自定义交点过滤器</span><br/><span class="hl-7"> * - 回调函数,返回 boolean。</span><br/><span class="hl-7"> * - true: 保留该交点。</span><br/><span class="hl-7"> * - false: 丢弃该交点。</span><br/><span class="hl-7"> */</span><br/><span class="hl-1"> </span><span class="hl-4">hitFilter</span><span class="hl-1">?: (</span><span class="hl-5">intersect</span><span class="hl-1">: </span><span class="hl-9">THREE</span><span class="hl-1">.</span><span class="hl-9">Intersection</span><span class="hl-1">) </span><span class="hl-8">=></span><span class="hl-1"> </span><span class="hl-9">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-7">/**</span><br/><span class="hl-7"> * 是否由近及远排序</span><br/><span class="hl-7"> * - true (默认): 返回的结果数组按距离摄像机从近到远排序。</span><br/><span class="hl-7"> * - false: 结果顺序不确定(通常按遍历顺序)。</span><br/><span class="hl-7"> */</span><br/><span class="hl-1"> </span><span class="hl-5">sortByDistance</span><span class="hl-1">?: </span><span class="hl-9">boolean</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-7">/**</span><br/><span class="hl-7"> * 作用楼层 (Five 特有逻辑)</span><br/><span class="hl-7"> * - 用于多楼层场景过滤。</span><br/><span class="hl-7"> */</span><br/><span class="hl-1"> </span><span class="hl-5">floorIndex</span><span class="hl-1">?: </span><span class="hl-9">number</span><span class="hl-1">;</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-11">export</span><span class="hl-1"> </span><span class="hl-8">interface</span><span class="hl-1"> </span><span class="hl-9">Intersection</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-7">/** 命中的具体 Tile 对象 (仅 3DTiles) */</span><br/><span class="hl-1"> </span><span class="hl-5">tile</span><span class="hl-1">?: </span><span class="hl-9">Tile</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-7">/** 命中的 ViewLayer 对象 */</span><br/><span class="hl-1"> </span><span class="hl-5">viewLayer</span><span class="hl-1">?: </span><span class="hl-9">ViewLayer</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-7">/** 命中的 Model 对象 */</span><br/><span class="hl-1"> </span><span class="hl-5">model</span><span class="hl-1">?: </span><span class="hl-9">Model</span><span class="hl-1">;</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
|
|
14
14
|
</code><button type="button">Copy</button></pre>
|
|
15
15
|
|
|
16
16
|
<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>
|
|
@@ -62,17 +62,17 @@
|
|
|
62
62
|
<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>
|
|
63
63
|
<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>
|
|
64
64
|
<p>最常见的场景是将鼠标点击的屏幕坐标转换为 3D 空间中的点。</p>
|
|
65
|
-
<pre><code class="typescript"><span class="hl-
|
|
65
|
+
<pre><code class="typescript"><span class="hl-11">import</span><span class="hl-1"> </span><span class="hl-8">*</span><span class="hl-1"> </span><span class="hl-11">as</span><span class="hl-1"> </span><span class="hl-5">THREE</span><span class="hl-1"> </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'three'</span><span class="hl-1">;</span><br/><span class="hl-11">import</span><span class="hl-1"> { </span><span class="hl-5">Five</span><span class="hl-1"> } </span><span class="hl-11">from</span><span class="hl-1"> </span><span class="hl-10">'@realsee/five'</span><span class="hl-1">;</span><br/><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">five</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-4">Five</span><span class="hl-1">();</span><br/><span class="hl-7">// ... 初始化 ...</span><br/><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">raycaster</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-6">THREE</span><span class="hl-1">.</span><span class="hl-4">Raycaster</span><span class="hl-1">();</span><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">vector</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-6">THREE</span><span class="hl-1">.</span><span class="hl-4">Vector2</span><span class="hl-1">();</span><br/><br/><span class="hl-7">// 假设 onTap 是点击事件处理函数</span><br/><span class="hl-8">function</span><span class="hl-1"> </span><span class="hl-4">onTap</span><span class="hl-1">(</span><span class="hl-5">event</span><span class="hl-1">: { </span><span class="hl-5">x</span><span class="hl-1">: </span><span class="hl-9">number</span><span class="hl-1">, </span><span class="hl-5">y</span><span class="hl-1">: </span><span class="hl-9">number</span><span class="hl-1"> }) {</span><br/><span class="hl-1"> </span><span class="hl-7">// 1. 将屏幕坐标转换为归一化设备坐标 (NDC)</span><br/><span class="hl-1"> </span><span class="hl-7">// 注意:five.getElement() 获取 canvas 容器</span><br/><span class="hl-1"> </span><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">element</span><span class="hl-1"> = </span><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-4">getElement</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (!</span><span class="hl-5">element</span><span class="hl-1">) </span><span class="hl-11">return</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">rect</span><span class="hl-1"> = </span><span class="hl-5">element</span><span class="hl-1">.</span><span class="hl-4">getBoundingClientRect</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-5">vector</span><span class="hl-1">.</span><span class="hl-5">x</span><span class="hl-1"> = ((</span><span class="hl-5">event</span><span class="hl-1">.</span><span class="hl-5">x</span><span class="hl-1"> - </span><span class="hl-5">rect</span><span class="hl-1">.</span><span class="hl-5">left</span><span class="hl-1">) / </span><span class="hl-5">rect</span><span class="hl-1">.</span><span class="hl-5">width</span><span class="hl-1">) * </span><span class="hl-3">2</span><span class="hl-1"> - </span><span class="hl-3">1</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">vector</span><span class="hl-1">.</span><span class="hl-5">y</span><span class="hl-1"> = -((</span><span class="hl-5">event</span><span class="hl-1">.</span><span class="hl-5">y</span><span class="hl-1"> - </span><span class="hl-5">rect</span><span class="hl-1">.</span><span class="hl-5">top</span><span class="hl-1">) / </span><span class="hl-5">rect</span><span class="hl-1">.</span><span class="hl-5">height</span><span class="hl-1">) * </span><span class="hl-3">2</span><span class="hl-1"> + </span><span class="hl-3">1</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// 2. 设置射线</span><br/><span class="hl-1"> </span><span class="hl-5">raycaster</span><span class="hl-1">.</span><span class="hl-4">setFromCamera</span><span class="hl-1">(</span><span class="hl-5">vector</span><span class="hl-1">, </span><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">camera</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// 3. 调用 Five 的检测方法</span><br/><span class="hl-1"> </span><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">intersects</span><span class="hl-1"> = </span><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">model</span><span class="hl-1">.</span><span class="hl-4">intersectRaycaster</span><span class="hl-1">(</span><span class="hl-5">raycaster</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (</span><span class="hl-5">intersects</span><span class="hl-1">.</span><span class="hl-5">length</span><span class="hl-1"> > </span><span class="hl-3">0</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">firstHit</span><span class="hl-1"> = </span><span class="hl-5">intersects</span><span class="hl-1">[</span><span class="hl-3">0</span><span class="hl-1">];</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-4">log</span><span class="hl-1">(</span><span class="hl-10">'点击到了模型:'</span><span class="hl-1">, </span><span class="hl-5">firstHit</span><span class="hl-1">.</span><span class="hl-5">object</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-4">log</span><span class="hl-1">(</span><span class="hl-10">'交点坐标 (世界坐标):'</span><span class="hl-1">, </span><span class="hl-5">firstHit</span><span class="hl-1">.</span><span class="hl-5">point</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
|
|
66
66
|
</code><button type="button">Copy</button></pre>
|
|
67
67
|
|
|
68
68
|
<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>
|
|
69
69
|
<p>在进行如“地面检测”或“视线遮挡检测”时,通常只需要知道最近的交点。此时开启 <code>firstHitOnly</code> 可以显著提升性能。</p>
|
|
70
|
-
<pre><code class="typescript"><span class="hl-
|
|
70
|
+
<pre><code class="typescript"><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">raycaster</span><span class="hl-1"> = </span><span class="hl-8">new</span><span class="hl-1"> </span><span class="hl-6">THREE</span><span class="hl-1">.</span><span class="hl-4">Raycaster</span><span class="hl-1">();</span><br/><span class="hl-5">raycaster</span><span class="hl-1">.</span><span class="hl-4">setFromCamera</span><span class="hl-1">(</span><span class="hl-5">mouseVector</span><span class="hl-1">, </span><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">camera</span><span class="hl-1">);</span><br/><br/><span class="hl-7">// 开启性能优化:找到最近的一个交点后立即停止</span><br/><span class="hl-5">raycaster</span><span class="hl-1">.</span><span class="hl-5">firstHitOnly</span><span class="hl-1"> = </span><span class="hl-8">true</span><span class="hl-1">;</span><br/><br/><span class="hl-7">// 结果数组长度最多为 1</span><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">intersects</span><span class="hl-1"> = </span><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">model</span><span class="hl-1">.</span><span class="hl-4">intersectRaycaster</span><span class="hl-1">(</span><span class="hl-5">raycaster</span><span class="hl-1">);</span><br/><br/><span class="hl-11">if</span><span class="hl-1"> (</span><span class="hl-5">intersects</span><span class="hl-1">.</span><span class="hl-5">length</span><span class="hl-1"> > </span><span class="hl-3">0</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// 处理最近的交点</span><br/><span class="hl-1">}</span>
|
|
71
71
|
</code><button type="button">Copy</button></pre>
|
|
72
72
|
|
|
73
73
|
<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>
|
|
74
74
|
<p>如果你只想检测特定类型的物体(例如只检测地板,忽略天花板),可以使用 <code>hitFilter</code>。</p>
|
|
75
|
-
<pre><code class="typescript"><span class="hl-
|
|
75
|
+
<pre><code class="typescript"><span class="hl-5">raycaster</span><span class="hl-1">.</span><span class="hl-4">hitFilter</span><span class="hl-1"> = (</span><span class="hl-5">intersect</span><span class="hl-1">) </span><span class="hl-8">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-7">// 示例:假设地板的法线是向上的 (0, 1, 0)</span><br/><span class="hl-1"> </span><span class="hl-7">// 只保留法线朝上的交点(地板)</span><br/><span class="hl-1"> </span><span class="hl-11">if</span><span class="hl-1"> (</span><span class="hl-5">intersect</span><span class="hl-1">.</span><span class="hl-5">face</span><span class="hl-1"> && </span><span class="hl-5">intersect</span><span class="hl-1">.</span><span class="hl-5">face</span><span class="hl-1">.</span><span class="hl-5">normal</span><span class="hl-1">.</span><span class="hl-5">y</span><span class="hl-1"> > </span><span class="hl-3">0.5</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-11">return</span><span class="hl-1"> </span><span class="hl-8">true</span><span class="hl-1">; </span><span class="hl-7">// 保留</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> </span><span class="hl-11">return</span><span class="hl-1"> </span><span class="hl-8">false</span><span class="hl-1">; </span><span class="hl-7">// 丢弃</span><br/><span class="hl-1">};</span><br/><br/><span class="hl-8">const</span><span class="hl-1"> </span><span class="hl-6">intersects</span><span class="hl-1"> = </span><span class="hl-5">five</span><span class="hl-1">.</span><span class="hl-5">model</span><span class="hl-1">.</span><span class="hl-4">intersectRaycaster</span><span class="hl-1">(</span><span class="hl-5">raycaster</span><span class="hl-1">);</span>
|
|
76
76
|
</code><button type="button">Copy</button></pre>
|
|
77
77
|
|
|
78
78
|
<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>
|