@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.
Files changed (281) hide show
  1. package/ai_guides/3dgs-current-branch-changes.md +237 -0
  2. package/docs/assets/hierarchy.js +1 -1
  3. package/docs/assets/highlight.css +18 -18
  4. package/docs/assets/navigation.js +1 -1
  5. package/docs/assets/search.js +1 -1
  6. package/docs/classes/five.AdaptiveLuminancePass.html +1 -1
  7. package/docs/classes/five.BoundingMesh.html +1 -1
  8. package/docs/classes/five.Camera.html +1 -1
  9. package/docs/classes/five.EyeDomeLightingPass.html +1 -1
  10. package/docs/classes/five.Five.html +4 -4
  11. package/docs/classes/five.FivePass.html +1 -1
  12. package/docs/classes/five.FlowingFireworks3DPass.html +30 -0
  13. package/docs/classes/five.FlowingLight2DPass.html +1 -1
  14. package/docs/classes/five.FlowingLight3DPass.html +1 -1
  15. package/docs/classes/five.GaussianBlurPass.html +1 -1
  16. package/docs/classes/five.InternalWebGLRenderer.html +1 -1
  17. package/docs/classes/five.Model.html +2 -2
  18. package/docs/classes/five.ModelScene.html +1 -1
  19. package/docs/classes/five.NetworkSubscribe.html +2 -2
  20. package/docs/classes/five.PBMContainer.html +1 -1
  21. package/docs/classes/five.PBMCustomShader.html +2 -2
  22. package/docs/classes/five.PBMGSObject.html +10 -13
  23. package/docs/classes/five.PBMGroup.html +1 -1
  24. package/docs/classes/five.PBMMesh.html +1 -1
  25. package/docs/classes/five.PBMMeshMaterial.html +1 -1
  26. package/docs/classes/five.PBMPanoFilter.html +2 -2
  27. package/docs/classes/five.PBMPointCloud.html +1 -1
  28. package/docs/classes/five.PBMPointCloudMaterial.html +1 -1
  29. package/docs/classes/five.PBMSkinnedMesh.html +1 -1
  30. package/docs/classes/five.PBMUpdateable.html +2 -2
  31. package/docs/classes/five.PanoCircleMesh.html +1 -1
  32. package/docs/classes/five.PanoCircleMeshCustom.html +1 -1
  33. package/docs/classes/five.PanoCircleMeshSolid.html +1 -1
  34. package/docs/classes/five.Parameter.html +1 -1
  35. package/docs/classes/five.Scene.html +1 -1
  36. package/docs/classes/five.Subscribe.html +2 -2
  37. package/docs/classes/five.Tile3D.html +1 -1
  38. package/docs/classes/five.TileNode.html +1 -1
  39. package/docs/classes/five.TrajectoryNode.html +1 -1
  40. package/docs/classes/five.WorkResolvedObserver.html +2 -2
  41. package/docs/classes/gltf-loader.DDSLoader.html +1 -1
  42. package/docs/classes/gltf-loader.DRACOLoader.html +1 -1
  43. package/docs/classes/gltf-loader.GLTFLoader.html +2 -2
  44. package/docs/classes/gltf-loader.GLTFObject.html +1 -1
  45. package/docs/classes/gltf-loader.THREEGLTFLoader.html +1 -1
  46. package/docs/classes/line.Line.html +1 -1
  47. package/docs/classes/line.LineGeometry.html +1 -1
  48. package/docs/classes/line.LineMaterial.html +1 -1
  49. package/docs/classes/line.LineSegmentsGeometry.html +1 -1
  50. package/docs/classes/line.THREE_Line2.html +1 -1
  51. package/docs/classes/line.THREE_LineSegments2.html +1 -1
  52. package/docs/classes/plugins.BasePlugin.Controller.html +1 -1
  53. package/docs/classes/plugins.CSS2DObject.html +1 -1
  54. package/docs/classes/plugins.CSS3DObject.html +1 -1
  55. package/docs/classes/plugins.CSS3DSprite.html +1 -1
  56. package/docs/classes/plugins.InstancedPrefabBufferGeometry.html +1 -1
  57. package/docs/classes/plugins.Object3DHelperController.html +1 -1
  58. package/docs/classes/plugins.PointBufferGeometry.html +1 -1
  59. package/docs/classes/plugins.PrefabBufferGeometry.html +1 -1
  60. package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
  61. package/docs/classes/react.Store.html +1 -1
  62. package/docs/classes/sticker.Sticker.html +2 -2
  63. package/docs/classes/vfx.Airflow.html +1 -1
  64. package/docs/classes/vfx.Flame.html +1 -1
  65. package/docs/classes/vfx.Particle.html +1 -1
  66. package/docs/classes/vfx.ParticleGPU.html +1 -1
  67. package/docs/classes/vfx.SpotLight.html +1 -1
  68. package/docs/documents/3dgs-current-branch-changes.html +205 -0
  69. package/docs/documents/api.html +6 -6
  70. package/docs/documents/features_3dtile.html +4 -4
  71. package/docs/documents/features_camera-animation.html +10 -10
  72. package/docs/documents/features_clipper.html +3 -3
  73. package/docs/documents/features_coordinate-system.html +3 -3
  74. package/docs/documents/features_event.html +10 -10
  75. package/docs/documents/features_five.html +4 -4
  76. package/docs/documents/features_flowing-fireworks-3d-pass.html +7 -7
  77. package/docs/documents/features_flowing-light-2d-pass.html +11 -11
  78. package/docs/documents/features_flowing-light-3d-pass.html +11 -11
  79. package/docs/documents/features_gaussian-blur-pass.html +6 -6
  80. package/docs/documents/features_gesture.html +6 -6
  81. package/docs/documents/features_get-screen-pixels.html +4 -4
  82. package/docs/documents/features_image-options.html +5 -5
  83. package/docs/documents/features_load-external-model.html +8 -8
  84. package/docs/documents/features_load-progress.html +7 -7
  85. package/docs/documents/features_material.html +3 -3
  86. package/docs/documents/features_mode.html +11 -11
  87. package/docs/documents/features_model.html +4 -4
  88. package/docs/documents/features_move-pano-effect.html +5 -5
  89. package/docs/documents/features_multi-work.html +5 -5
  90. package/docs/documents/features_pano-filter.html +3 -3
  91. package/docs/documents/features_pano-tile.html +4 -4
  92. package/docs/documents/features_pano-uv.html +4 -4
  93. package/docs/documents/features_parameter.html +7 -7
  94. package/docs/documents/features_plugin.html +4 -4
  95. package/docs/documents/features_postprocessing.html +5 -5
  96. package/docs/documents/features_raycast.html +4 -4
  97. package/docs/documents/features_request-proxy.html +4 -4
  98. package/docs/documents/features_screen-project.html +3 -3
  99. package/docs/documents/features_state.html +4 -4
  100. package/docs/documents/features_view-layer.html +4 -4
  101. package/docs/documents/features_work.html +5 -5
  102. package/docs/documents/quick-start.html +2 -2
  103. package/docs/documents/release_notes_6.6.html +4 -4
  104. package/docs/documents/release_notes_6.7.html +14 -14
  105. package/docs/documents/release_notes_6.8.html +4 -4
  106. package/docs/functions/five.loadSpz.html +1 -1
  107. package/docs/functions/react.useFiveAction.html +6 -6
  108. package/docs/functions/react.useFiveCurrentObserver.html +1 -1
  109. package/docs/functions/react.useFiveCurrentState.html +1 -1
  110. package/docs/functions/react.useFiveEventCallback.html +1 -1
  111. package/docs/functions/react.useFiveFloor.html +1 -1
  112. package/docs/functions/react.useFiveHelper.html +1 -1
  113. package/docs/functions/react.useFiveModelIntersectRaycaster.html +2 -2
  114. package/docs/functions/react.useFiveProject2d.html +2 -2
  115. package/docs/functions/react.useFiveSceneEffect.html +1 -1
  116. package/docs/functions/react.useFiveWork.html +2 -2
  117. package/docs/functions/vue.useFiveAction.html +8 -8
  118. package/docs/functions/vue.useFiveCurrentObserver.html +1 -1
  119. package/docs/functions/vue.useFiveCurrentState.html +1 -1
  120. package/docs/functions/vue.useFiveEventCallback.html +1 -1
  121. package/docs/functions/vue.useFiveFloor.html +1 -1
  122. package/docs/functions/vue.useFiveHelper.html +1 -1
  123. package/docs/functions/vue.useFiveModelIntersectRaycaster.html +2 -2
  124. package/docs/functions/vue.useFiveProject2d.html +2 -2
  125. package/docs/functions/vue.useFiveState.html +1 -1
  126. package/docs/functions/vue.useFiveWorks.html +2 -2
  127. package/docs/hierarchy.html +1 -1
  128. package/docs/interfaces/five.AddableObject.html +1 -1
  129. package/docs/interfaces/five.AjaxOptions.html +1 -1
  130. package/docs/interfaces/five.BaseEvent.html +1 -1
  131. package/docs/interfaces/five.BaseExtendableEvent.html +1 -1
  132. package/docs/interfaces/five.EventCallback.html +1 -1
  133. package/docs/interfaces/five.FiveInitArgs.html +2 -2
  134. package/docs/interfaces/five.GestureEvent.html +1 -1
  135. package/docs/interfaces/five.ImageOptions.html +1 -1
  136. package/docs/interfaces/five.IntersectEvent.html +1 -1
  137. package/docs/interfaces/five.IntersectMesh.html +1 -1
  138. package/docs/interfaces/five.IntersectMeshInterface.html +1 -1
  139. package/docs/interfaces/five.Intersection.html +1 -1
  140. package/docs/interfaces/five.LooseWorkWithExtrinsics.html +1 -1
  141. package/docs/interfaces/five.ModeChangeEvent.html +1 -1
  142. package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
  143. package/docs/interfaces/five.ModelEvent.html +1 -1
  144. package/docs/interfaces/five.ModelSceneEvent.html +1 -1
  145. package/docs/interfaces/five.ModelTileEvent.html +1 -1
  146. package/docs/interfaces/five.MovePanoOptions.html +1 -1
  147. package/docs/interfaces/five.NetworkAbortError.html +1 -1
  148. package/docs/interfaces/five.NetworkFirbiddenError.html +1 -1
  149. package/docs/interfaces/five.NetworkOptions.html +1 -1
  150. package/docs/interfaces/five.NetworkProxyError.html +1 -1
  151. package/docs/interfaces/five.NetworkResourceEvent.html +1 -1
  152. package/docs/interfaces/five.NetworkResponseError.html +1 -1
  153. package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
  154. package/docs/interfaces/five.ObjectEvent.html +1 -1
  155. package/docs/interfaces/five.PBMMaterial.html +1 -1
  156. package/docs/interfaces/five.PBMMeshMaterialParameters.html +1 -1
  157. package/docs/interfaces/five.PBMPointCloudMaterialParameters.html +1 -1
  158. package/docs/interfaces/five.PanoCircleMeshInterface.html +1 -1
  159. package/docs/interfaces/five.PanoEvent.html +1 -1
  160. package/docs/interfaces/five.PanoPrepareEvent.html +1 -1
  161. package/docs/interfaces/five.PanoTextureEvent.html +1 -1
  162. package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +1 -1
  163. package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +1 -1
  164. package/docs/interfaces/five.ParameterMaterialValue.html +1 -1
  165. package/docs/interfaces/five.ParameterTilesetValue.html +1 -1
  166. package/docs/interfaces/five.ParameterValue.html +1 -1
  167. package/docs/interfaces/five.Pose.html +1 -1
  168. package/docs/interfaces/five.RenderEvent.html +1 -1
  169. package/docs/interfaces/five.ResolvedParameterValue.html +1 -1
  170. package/docs/interfaces/five.SplatData.html +3 -6
  171. package/docs/interfaces/five.State.html +1 -1
  172. package/docs/interfaces/five.StateEvent.html +1 -1
  173. package/docs/interfaces/five.TextureOptions.html +1 -1
  174. package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +1 -1
  175. package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +1 -1
  176. package/docs/interfaces/five.ViewLayer.html +1 -1
  177. package/docs/interfaces/five.WorkCubeImage.html +1 -1
  178. package/docs/interfaces/five.WorkImage.html +1 -1
  179. package/docs/interfaces/five.WorkObserver.html +2 -2
  180. package/docs/interfaces/five.WorkObserverProto.html +1 -1
  181. package/docs/interfaces/five.WorkTile.html +1 -1
  182. package/docs/interfaces/five.WorksEvent.html +1 -1
  183. package/docs/interfaces/five.XRControllerEvent.html +1 -1
  184. package/docs/interfaces/five.XRGestureEvent.html +1 -1
  185. package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +1 -1
  186. package/docs/interfaces/five.XRSessionEvent.html +1 -1
  187. package/docs/interfaces/plugins.BackgroundPluginController.html +1 -1
  188. package/docs/interfaces/plugins.BackgroundPluginType.EventMap.html +1 -1
  189. package/docs/interfaces/plugins.BasePlugin.State.html +1 -1
  190. package/docs/interfaces/plugins.CSS2DPluginController.html +1 -1
  191. package/docs/interfaces/plugins.CSS2DPluginType.EventMap.html +1 -1
  192. package/docs/interfaces/plugins.CSS2DPluginType.State.html +1 -1
  193. package/docs/interfaces/plugins.CSS3DPluginController.html +1 -1
  194. package/docs/interfaces/plugins.CSS3DPluginType.EventMap.html +1 -1
  195. package/docs/interfaces/plugins.CSS3DPluginType.State.html +1 -1
  196. package/docs/interfaces/plugins.DynamicPathLinePluginController.html +1 -1
  197. package/docs/interfaces/plugins.DynamicPathLinePluginType.EventMap.html +1 -1
  198. package/docs/interfaces/plugins.DynamicPathLinePluginType.State.html +1 -1
  199. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationController.html +1 -1
  200. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +1 -1
  201. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +1 -1
  202. package/docs/interfaces/plugins.ItemMaskController.html +1 -1
  203. package/docs/interfaces/plugins.ItemMaskPluginType.EventMap.html +1 -1
  204. package/docs/interfaces/plugins.ItemMaskPluginType.State.html +1 -1
  205. package/docs/interfaces/plugins.Object3DHelperPluginType.BaseController.html +1 -1
  206. package/docs/interfaces/plugins.Object3DHelperPluginType.BaseHelper.html +1 -1
  207. package/docs/interfaces/plugins.Object3DHelperPluginType.BoundingBoxController.html +1 -1
  208. package/docs/interfaces/plugins.Object3DHelperPluginType.MoveController.html +1 -1
  209. package/docs/interfaces/plugins.Object3DHelperPluginType.MoveHelperAbstract.html +1 -1
  210. package/docs/interfaces/plugins.Object3DHelperPluginType.RotateController.html +1 -1
  211. package/docs/interfaces/plugins.Object3DHelperPluginType.RotateHelperAbstract.html +1 -1
  212. package/docs/interfaces/plugins.OrientationPluginController.html +1 -1
  213. package/docs/interfaces/plugins.OrientationPluginType.EventMap.html +1 -1
  214. package/docs/interfaces/plugins.OrientationPluginType.State.html +1 -1
  215. package/docs/interfaces/plugins.PanoAnimeController.html +1 -1
  216. package/docs/interfaces/plugins.PanoAnimePluginType.EventMap.html +1 -1
  217. package/docs/interfaces/plugins.PanoAnimePluginType.State.html +1 -1
  218. package/docs/interfaces/plugins.PluginTemplateType.EventMap.html +1 -1
  219. package/docs/interfaces/plugins.PluginTemplateType.State.html +1 -1
  220. package/docs/interfaces/plugins.TrajectoryController.html +1 -1
  221. package/docs/interfaces/react.FiveInjectionTypes.html +2 -2
  222. package/docs/interfaces/react.UseFivePluginOptions.html +1 -1
  223. package/docs/interfaces/react.UseFivePluginOptionsWithCreate.html +1 -1
  224. package/docs/modules/five.html +1 -1
  225. package/docs/modules.html +1 -1
  226. package/docs/types/five.FlowingFireworks3DPassLine.html +16 -0
  227. package/docs/types/five.ParseOptions.html +1 -1
  228. package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
  229. package/docs/variables/react.FiveCanvas.html +1 -1
  230. package/docs/variables/react.useFiveScene.html +1 -1
  231. package/docs/variables/vue.FiveCanvas.html +1 -1
  232. package/docs/variables/vue.FiveProvider.html +1 -1
  233. package/five/gaussian-splatting/layerRegistry.d.ts +10 -0
  234. package/five/gaussian-splatting/orderTexture.d.ts +18 -0
  235. package/five/gaussian-splatting/reorderPass.d.ts +34 -0
  236. package/five/gaussian-splatting/shStore.d.ts +16 -0
  237. package/five/gaussian-splatting/splatAssembler.d.ts +60 -0
  238. package/five/gaussian-splatting/tileTexture.d.ts +10 -0
  239. package/five/gaussian-splatting/transformStore.d.ts +20 -0
  240. package/five/index.js +305 -169
  241. package/five/index.mjs +6684 -6508
  242. package/five/model/index.d.ts +0 -1
  243. package/five/model/loaders/spz.d.ts +19 -3
  244. package/five/model/objects/pbmGaussianSplattingObject.d.ts +10 -14
  245. package/five/model/objects/pbmGaussianSplattingRenderMesh.d.ts +48 -42
  246. package/five/renderer/index.d.ts +1 -1
  247. package/five/renderer/postprocessing/index.d.ts +1 -1
  248. package/five/renderer/postprocessing/passes/flowing-fireworks-3d-pass.d.ts +4 -5
  249. package/gltf-loader/index.js +3 -3
  250. package/gltf-loader/index.mjs +3 -3
  251. package/line/index.js +3 -3
  252. package/line/index.mjs +3 -3
  253. package/package.json +2 -2
  254. package/pbmGaussianSplattingObject-C6i7CUTu.cjs +255 -0
  255. package/pbmGaussianSplattingObject-CaE6q4r-.js +324 -0
  256. package/plugins/index.js +2 -2
  257. package/plugins/index.mjs +2 -2
  258. package/react/index.js +2 -2
  259. package/react/index.mjs +2 -2
  260. package/shader-lib/index.js +2 -2
  261. package/shader-lib/index.mjs +2 -2
  262. package/sticker/index.js +3 -3
  263. package/sticker/index.mjs +3 -3
  264. package/umd/five-gltf-loader.js +3 -3
  265. package/umd/five-line.js +3 -3
  266. package/umd/five-plugins.js +2 -2
  267. package/umd/five-react.js +2 -2
  268. package/umd/five-shader-lib.js +2 -2
  269. package/umd/five-sticker.js +3 -3
  270. package/umd/five-vfx.js +2 -2
  271. package/umd/five-vue.js +2 -2
  272. package/umd/five.js +218 -82
  273. package/vfx/index.js +2 -2
  274. package/vfx/index.mjs +2 -2
  275. package/vue/index.js +2 -2
  276. package/vue/index.mjs +2 -2
  277. package/work-downloader/index.js +2 -2
  278. package/work-downloader/index.mjs +2 -2
  279. package/docs/functions/five.loadSplat.html +0 -1
  280. package/five/gaussian-splatting/util/renderData.d.ts +0 -68
  281. package/five/model/loaders/splat.d.ts +0 -8
@@ -0,0 +1,237 @@
1
+ # 当前分支(6.8.x)3DGS 渲染架构总结
2
+
3
+ > 本文档记录当前分支 `6.8.x`(HEAD: 8df53101d)上 3DGS 渲染管线中**协方差、着色器、J 矩阵**的完整实现细节,
4
+ > 供切换到 `6.x` 分支(含 `18562e668 3dgs重构` 及 aholo tile 局部更新架构)后参考合并。
5
+
6
+ ---
7
+
8
+ ## 1. 协方差(Covariance)计算
9
+
10
+ ### 1.1 CPU/WASM 预计算(`data.cpp` / `_pack` 函数)
11
+
12
+ **路径**: `lib/five/gaussian-splatting/wasm/data.cpp`
13
+
14
+ - 输入: `positions[N*3]`, `rotations[N*4]` (wxyz), `scales[N*3]`, `colors[N*4]`
15
+ - 输出: `data[N*4]` (RGBA32UI texel per splat)
16
+
17
+ **协方差计算过程** (`computeCov3D`):
18
+ ```
19
+ 1. 归一化四元数 (w, x, y, z)
20
+ 2. 构造旋转矩阵 R(Hamilton 标准,row-major)
21
+ 3. M = R * diag(sx, sy, sz)
22
+ 4. Σ = M * M^T → 对称矩阵,6个独立分量
23
+ s00, s01, s02, s11, s12, s22
24
+ ```
25
+
26
+ **Texel 打包格式** (每 splat 1 个 RGBA32UI = 16 bytes):
27
+ ```
28
+ data[0] = packHalf2x16(s00, s01) // cov(0,0) | cov(0,1)
29
+ data[1] = packHalf2x16(s02, s11) // cov(0,2) | cov(1,1)
30
+ data[2] = packHalf2x16(s12, s22) // cov(1,2) | cov(2,2)
31
+ data[3] = R | G<<8 | B<<16 | A<<24 // 颜色 RGBA8
32
+ ```
33
+
34
+ ### 1.2 位置数据(独立纹理)
35
+
36
+ 为规避 fp16 量化导致的直线锯齿,splat 中心用独立的 `positionTexture`(RGB32F)存储全精度 float32 坐标。
37
+
38
+ - `positionData: Float32Array` → `u_positionTexture` (RGB32F)
39
+ - 寻址: `ivec2(splatIndexU & 0x7ff, splatIndexU >> 11)`(宽度 2048)
40
+
41
+ ---
42
+
43
+ ## 2. 顶点着色器(vertex.glsl)
44
+
45
+ **路径**: `lib/five/model/shaders/pbm_gaussian_splatting/vertex.glsl`
46
+
47
+ ### 2.1 数据读取
48
+
49
+ ```glsl
50
+ // 协方差纹理 (RGBA32UI)
51
+ uvec4 packed = texelFetch(u_texture, ivec2(splatIndexU & 0x7ff, splatIndexU >> 11), 0);
52
+
53
+ // 全精度位置 (RGB32F)
54
+ vec3 splatCenter = texelFetch(u_positionTexture, ivec2(splatIndexU & 0x7ff, splatIndexU >> 11), 0).xyz;
55
+
56
+ // 解包 3D 协方差
57
+ vec2 cov_a = unpackHalf2x16(packed.x); // (s00, s01)
58
+ vec2 cov_b = unpackHalf2x16(packed.y); // (s02, s11)
59
+ vec2 cov_c = unpackHalf2x16(packed.z); // (s12, s22)
60
+
61
+ // 对称矩阵 Vrk (object space)
62
+ mat3 Vrk = mat3(
63
+ cov_a.x, cov_a.y, cov_b.x,
64
+ cov_a.y, cov_b.y, cov_c.x,
65
+ cov_b.x, cov_c.x, cov_c.y
66
+ );
67
+ ```
68
+
69
+ ### 2.2 J 矩阵(Jacobian)计算
70
+
71
+ ```glsl
72
+ vec2 focal = vec2(
73
+ projectionMatrix[0][0] * resolution.x * 0.5,
74
+ projectionMatrix[1][1] * resolution.y * 0.5
75
+ );
76
+
77
+ bool isOrthographic = projectionMatrix[3][3] > 0.7;
78
+ mat3 J;
79
+ if (isOrthographic) {
80
+ J = transpose(mat3(
81
+ focal.x, 0.0, 0.0,
82
+ 0.0, focal.y, 0.0,
83
+ 0.0, 0.0, 0.0
84
+ ));
85
+ } else {
86
+ float s = 1.0 / (viewCenter.z * viewCenter.z);
87
+ J = mat3(
88
+ focal.x / viewCenter.z, 0.0, -(focal.x * viewCenter.x) * s,
89
+ 0.0, focal.y / viewCenter.z, -(focal.y * viewCenter.y) * s,
90
+ 0.0, 0.0, 0.0
91
+ );
92
+ }
93
+ ```
94
+
95
+ **注意**: J 矩阵直接构造(非 transpose),因为后续投影公式会配合 W 的 transpose 来完成。
96
+
97
+ ### 2.3 2D 协方差投影(gsplat RenderProgram 一致)
98
+
99
+ ```glsl
100
+ mat3 W = transpose(mat3(transformModelViewMatrix));
101
+ mat3 T = W * J;
102
+
103
+ // 3D → 2D 投影: cov2D = T^T * Vrk * T
104
+ mat3 cov2Dm = transpose(T) * Vrk * T;
105
+
106
+ // 低通滤波(防止亚像素 splat 产生混叠)
107
+ cov2Dm[0][0] += kernel2DSize; // kernel2DSize = 0.3
108
+ cov2Dm[1][1] += kernel2DSize;
109
+ ```
110
+
111
+ ### 2.4 特征值分解 → 椭圆轴
112
+
113
+ ```glsl
114
+ float mid = (cov2Dm[0][0] + cov2Dm[1][1]) / 2.0;
115
+ float radius = length(vec2((cov2Dm[0][0] - cov2Dm[1][1]) / 2.0, cov2Dm[0][1]));
116
+ float lambda1 = mid + radius;
117
+ float lambda2 = mid - radius;
118
+
119
+ if (lambda2 < 0.0) return; // 退化情况
120
+
121
+ vec2 diagonalVector = normalize(vec2(cov2Dm[0][1], lambda1 - cov2Dm[0][0]));
122
+ vec2 majorAxis = min(sqrt(8.0 * lambda1), maxScreenSpaceSplatSize) * diagonalVector;
123
+ vec2 minorAxis = min(sqrt(8.0 * lambda2), maxScreenSpaceSplatSize) * vec2(diagonalVector.y, -diagonalVector.x);
124
+ ```
125
+
126
+ ### 2.5 Quad 顶点偏移
127
+
128
+ ```glsl
129
+ // quad 顶点为 [-2,2],等价于 gsplat 的 position * axis / viewport
130
+ vec2 basisViewport = vec2(1.0 / resolution.x, 1.0 / resolution.y);
131
+ vec2 ndcOffset = (vPosition.x * majorAxis + vPosition.y * minorAxis) * basisViewport;
132
+ vec4 quadPos = vec4(ndcCenter.xy + ndcOffset, ndcCenter.z, 1.0);
133
+ gl_Position = quadPos;
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 3. 片段着色器(fragment.glsl)
139
+
140
+ ```glsl
141
+ // vPosition 为 [-2,2] 的 quad 坐标
142
+ float A = -dot(vPosition, vPosition);
143
+ if (A < -4.0) discard;
144
+
145
+ vec3 color = vColor.rgb;
146
+ float opacity = exp(A) * vColor.a;
147
+ gl_FragColor = vec4(color.rgb, opacity);
148
+ ```
149
+
150
+ 与 gsplat RenderProgram 完全一致:高斯衰减 `exp(-r²)`,`r² > 4` 时丢弃。
151
+
152
+ ---
153
+
154
+ ## 4. 数据管线架构(当前分支)
155
+
156
+ ### 4.1 RenderData(`renderData.ts`)
157
+
158
+ - **单一聚合类**: 管理所有 `PBMGaussianSplattingObject` 的合并数据
159
+ - **CPU 端数组**:
160
+ - `data: Uint32Array` → 协方差+颜色 (RGBA32UI)
161
+ - `positionData: Float32Array` → 全精度位置 (RGB32F)
162
+ - `transforms: Float32Array` → 变换矩阵
163
+ - `transformIndices / layerIndices: Uint32Array` → 索引
164
+ - `sh1/sh2/sh3: Float32Array` → 球谐数据
165
+ - `positions/rotations/scales: Float32Array` → 排序用世界坐标
166
+
167
+ ### 4.2 RenderMesh(`pbmGaussianSplattingRenderMesh.ts`)
168
+
169
+ - **双缓冲 Slot 架构** (active + pending):
170
+ - `RenderSlot = { generation, renderData, textures, awaitingFirstSort, sortDataUploaded }`
171
+ - pending 构建完成后,首次排序回来时 swap 到 active
172
+ - **增量追加** (`appendObjects`): 新对象追加到已有 slot 而非全量重建
173
+ - **纹理复用池** (`freeSlotPool`): 回收旧 slot 的 DataTexture 对象
174
+ - **排序**: 专用 SortWorker + WASM radix sort,通过 transferable 零拷贝
175
+
176
+ ### 4.3 内存管理
177
+
178
+ - `releaseSortData()`: 排序完成后释放 positions/rotations/scales
179
+ - `releaseAggregatedData()`: 纹理上传后释放 CPU 端 data/positionData
180
+ - `releaseSHData()`: SH 纹理创建后释放 CPU 端 sh1/sh2/sh3
181
+ - `releaseIndexData()`: transformIndices/layerIndices 纹理已创建且 sortData 已上传后释放
182
+
183
+ ---
184
+
185
+ ## 5. 排序(sort.cpp / sortWorker)
186
+
187
+ - Two-pass radix sort (base 65536)
188
+ - 深度编码: `floatToSortableUint` (IEEE 754 正序利用)
189
+ - 降序 (远→近): 对 key 做 `~key` 实现
190
+ - 无效 splat (∞深度) 跳过
191
+
192
+ ---
193
+
194
+ ## 6. 球谐(SH)
195
+
196
+ - 最高支持 2 阶(`u_maxShDegree = 0/1/2`)
197
+ - 数据打包到单张 RGBA32F 纹理,按 padded component count 排列
198
+ - 着色器中逐阶计算视角相关颜色
199
+
200
+ ---
201
+
202
+ ## 7. 其他特性
203
+
204
+ - **入场聚合动画** (`ENABLE_GS_INIT_ANIMATION`): 通过 define 开关,splat 从爆炸散开收敛到正确位置
205
+ - **Clipper 裁剪**: 层级 clipper 系统,每层分配 clipper range
206
+ - **Transform 系统**: 每对象独立变换矩阵,通过 transformIndices 索引
207
+
208
+ ---
209
+
210
+ ## 8. 与目标分支(6.x / 3dgs重构)的关键差异预览
211
+
212
+ 目标分支(`18562e668`)引入了以下新文件/重构:
213
+ - `splatAssembler.ts` — tile-based 数据组装(替代 RenderData 的整体聚合)
214
+ - `tileTexture.ts` — tile 级别的纹理管理
215
+ - `orderTexture.ts` — 排序结果纹理
216
+ - `reorderPass.ts` — GPU reorder pass
217
+ - `layerRegistry.ts` — 层注册表
218
+ - `shStore.ts` — SH 数据存储
219
+ - `transformStore.ts` — 变换存储
220
+ - `renderData.ts` — **已删除**(被上述模块替代)
221
+ - `vertex.glsl` — 着色器改动 (123 行变动)
222
+ - `pbmGaussianSplattingRenderMesh.ts` — 大幅重构(1062行变动)
223
+
224
+ **核心架构变化**: 从"全量聚合 + CPU 端数据管理"转向"tile 粒度局部更新 + GPU 端重排"。
225
+
226
+ ---
227
+
228
+ ## 9. 切换分支后的修改指导
229
+
230
+ 切换到目标分支后,需要确保:
231
+
232
+ 1. **协方差计算**: `data.cpp` 的 `computeCov3D` + `packHalf2x16` 逻辑保持一致(对称矩阵 6 分量 → 3 个 half2x16)
233
+ 2. **着色器 J 矩阵**: 目标分支的 vertex.glsl 中 J 矩阵计算需要与当前分支保持相同的透视/正交分支逻辑
234
+ 3. **2D 投影公式**: `cov2D = T^T * Vrk * T`(T = W * J),加 kernel2DSize 低通
235
+ 4. **Fragment**: 保持 `exp(-dot(vPos, vPos))` 和 `discard < -4.0`
236
+ 5. **位置纹理**: 保持 RGB32F 独立纹理避免 fp16 精度问题
237
+ 6. **SH**: 确保新架构下 SH 纹理布局与着色器读取一致
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "eJytW2tT2zgb/S/+rLLWXeIb1y4zsGUatvvO7DDvmEQNLo6dtR0Ks8N/35FdiKQ48aPAl7ZQHZ3zXPTo6n+TuqraJjn8G6dMCIRpyhDGlCmEUy2QxkhILhAWWiGsMEFKpxzJVCIsFUaUUoq4lBxxhTkSFkgVp4gyQhG2UM6QJBopzRRSUkvEpFBIs1QjrhRFXGt5i5LafC/MtM2rskkO/004tX+W2cIkh8lx1pjrYjXPywQlD3k5Sw4ZSlZ1kRwmi2q2Kkzz27L7/+Zg3fbgvl0UCUqmRdY0yWHSNrNPFvzJ9toss6lJXlDCmUM0abPWvHEQLl5Z8rI19fdsOkzUwbbSvWETlKzK/J+V+SNbmOusNmXneU5vUTK9z4tZbcrk8G+ZcoIkSQWSTGEkBSFISs2QSgVBCqsUKUHo7QtKNHbEn1RlW1dFYeo3CzBRrxZ0soblr4Fbbeh/EciUAklCFJKMcCR5SpAUXCOpmEQqVRQpkmKkSCeYp1YwltpR/Pny5vyyyma7Fc+L9vunomt2sEaMSLWRJcTh+sO0P6v6YbK6a6Z1fmd2MX7PH81BCBgnFDJ1CI9+ZE9fln1C786ojs5pDsikF5TIVG6aF0HoI0DZ60RfyC6ekrjxhDsX6lWPkxOCsCIYUTsuNOPdGLB1yq0V1aqc5eX8W1WsFmNjudPiI2IdgbFgCBOcIky47gRhwTxBT/toeoqWZakJdlPwq5nnVRnPPoSDCuBeQizvTW3iBQzhgAJoyoKZ4+zRlC3I6a+No3OA2vBTjhGm0v5LaoSpUghTzRFmqf2DKoSZnVcZtz8KijCTBGGmNMJMyy51qBe/TtBTa8pZdldE2uHDoi1ihP8S5BVs07SrGq7EbQ+NH3fntAv7f42ZtmBKHwElFa7br6qZObnPyjnc0AACpZUhbXGTRwTaR4BJdUgaRxhFplRINpmaMtLENQRKq/nm3PjVNNWqnsK5h3BAASx1BXy5+xGTwk5zKB12lzrXWVmByd4aQ6kID6iua7PMIopCiIESUxUQ35inqGoUYqDETHlzajkzNZjTaQ6l4zzckYDZ1q33mMLsnCVSZJOpK/1MuHuwv6r6oQELWbeGWi3dDP7f19iZxkdASZX2SCemafKqjCB1EVBSLT3S9e4rgjcAAak5oQMr5SvT3I8u2N3G4zshzKkMButJXk8LA+Lym0PYFN3KNqmKfBZJ2WEAvIKEJWndx8mqaatFJHEPgjB7k/jbmsdzL2SRtNPBfvII7Rp7scjmJmK36baPrk0S4/7wALtrw1+lPEKEjwDaLbm7vbyuGtAOxraLt1P0lVcKEk4B4OoPtUrhral74cgDTaoD0GjbOZXIDihkR3PnBeUtaryUjVI4jIwWKGS/u1fE9dx5/jh+2mEbjQ9qShgJF8vrOt+Xhosyb4/qOSjbd3YASxNKvI2RjXWdLbL3qBrrAyiM0rDk204v8wfzEeJ29RObODasyDrSZo89Fnd1H1/BZsS+XcxhmZ3se0Z/pB9f/bmcZa2xRwMQ3nXrGHbKJUZU6K5u2x98CdbP53nR7j74fZWwbg0YREIHXH30Jvdjx8yvbG57AJ/iYUCz1tR5VoDybd08Oq2UVIilaVeU7A+babWhZCS9RqW8WW15g4hWedmeFNVqFsO6iQJwS+Haao8/6OkoWd8sJoWZVsz61v7t8H3Lzc/L7NnJpR3xfWsMq2pcCH9zXWcL05r6W1asgJOxi4hNKS5JV6Ts396Ot6mKRzOLlzOMBPpCykFfvCZKvE88ZLRvhOgORO0155Asm1+NaeNVucD9Ralwq36yujPdmhu6W38DRItQmiCuVZ86SpNASZQKqAJLpakIqL7cNaZ+hA1Nt3305RehXWmwVgcSbDih9LYt1Fbv0MDVfl1XbRVrcAeKDrSmwlptrQ/EvA70jQBsK8dDIMAFKyUsWHtf93V7fP1tG8aUf0EFQ4JqhQQjCgmepkhwIZDguncDZf7uvwEuMXfo2JZvlLCe0rtZPJplyzZ/NJerRV5m5RTmjEEUxPfe/v/s2ZxWC3OZz+/bvJyDmAcwAF7mHbKcF9XPvJx3fZBTWPQ3IABWnqZbWGk8KwWzCrekfc5WTZNn5XGxqkGcIQDC6F2e/xJ9ntfG3nw0cbYGMMiDCe9s5WQyoaf95QfkBYvTPGpgS6m6wSS9NXPX22RZ5+3ObZFH3jcft1Om3qLhojWLq6x56J/f3Dwv14xbnzVtYmDPm+xjoj0fOA1Qvu+hk3XDbf9yRQy4Y+D9Ekwg4P2S/3IGe7Pplzo3ZZvZM8GYiAzCgEEhqdgzKMOs74wL7l8f2Mdcu/wSHaAdPQAj5d82HmfTh3ltbyL2FLS9A6ge/ySjj4BZLIusNbC02cQAc8Y/x4nJmQHKdyYMk93Bjn3z527F68wW46p+jg7MEBQYErFx931U5gsTM5QHQMCgCLJvdR3ifGdURH9xax9hDnkkOigDSGBMpHc6e/pcZot8ep2195d5GRWZrVBgfKTe93nvduZ3RknS7lzWvpId81F0xEZ6gUVPpYyHC6OYmAUAWKTs2+Y9IxXyvS8+1vrbTpB3puKQREdlEAuMBRZBLEhsLEh8LLB3rBEZC/KBscD9+ZZ9Rz7shX1isYkFxoJ4bul3HvT0d1MsTR33+H4bdnwroQRWA1vEiZ3a7ab6rGxru6m3dTt6SRvTGzCVhHffFZNKUWLemWcCd1tC+5VClHOj0y+mS2BWSm8zc/P717Oz+O8qAljURWN/L66U93DXTj+fTbUwbf28S0SRl+bAbQwYAtp7XGnBEzNf2FhGMYagGKOttZ3VmvLQ+/+3nZNRCU5biM3eYeMa+2pEDN8bJspiTbtabD/ccpT82ZjudLXLb9hTnNpk0/ZgCBh7LqoZFr0mLEY0/ZW39ye1GS8/29Wtu4CNTPuBSnBafVH+6L9xs0UL5qdNGPCFj/2eL/iWIH4D781TTr31e4t+S5MK+0lEKomwnxni/tsH+8uB54nH1dMH6h7qFOpQSVyHXlWPH+hQvzeoIo3d2v+1srPgx2kK+wOqsp+PBn7quz66a9o6m449cQX5yu8RqowwveGvj9U21CdUnX+hZIdY389HDNb+l/Eft2FqvwcmTN++vLz8B5wWCk4="
@@ -5,24 +5,24 @@
5
5
  --dark-hl-1: #D4D4D4;
6
6
  --light-hl-2: #0000FF;
7
7
  --dark-hl-2: #CE9178;
8
- --light-hl-3: #0000FF;
9
- --dark-hl-3: #569CD6;
10
- --light-hl-4: #0070C1;
11
- --dark-hl-4: #4FC1FF;
12
- --light-hl-5: #795E26;
13
- --dark-hl-5: #DCDCAA;
14
- --light-hl-6: #001080;
15
- --dark-hl-6: #9CDCFE;
16
- --light-hl-7: #267F99;
17
- --dark-hl-7: #4EC9B0;
18
- --light-hl-8: #008000;
19
- --dark-hl-8: #6A9955;
20
- --light-hl-9: #A31515;
21
- --dark-hl-9: #CE9178;
22
- --light-hl-10: #AF00DB;
23
- --dark-hl-10: #C586C0;
24
- --light-hl-11: #098658;
25
- --dark-hl-11: #B5CEA8;
8
+ --light-hl-3: #098658;
9
+ --dark-hl-3: #B5CEA8;
10
+ --light-hl-4: #795E26;
11
+ --dark-hl-4: #DCDCAA;
12
+ --light-hl-5: #001080;
13
+ --dark-hl-5: #9CDCFE;
14
+ --light-hl-6: #0070C1;
15
+ --dark-hl-6: #4FC1FF;
16
+ --light-hl-7: #008000;
17
+ --dark-hl-7: #6A9955;
18
+ --light-hl-8: #0000FF;
19
+ --dark-hl-8: #569CD6;
20
+ --light-hl-9: #267F99;
21
+ --dark-hl-9: #4EC9B0;
22
+ --light-hl-10: #A31515;
23
+ --dark-hl-10: #CE9178;
24
+ --light-hl-11: #AF00DB;
25
+ --dark-hl-11: #C586C0;
26
26
  --light-hl-12: #000000FF;
27
27
  --dark-hl-12: #D4D4D4;
28
28
  --light-hl-13: #000000;
@@ -1 +1 @@
1
- window.navigationData = "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"
1
+ window.navigationData = "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"