@soonspacejs/plugin-tiles 2.14.29 → 2.14.30

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.
@@ -0,0 +1,295 @@
1
+ import { WMTSTileMatrixSet, WMTSLayer } from 'um-3d-tiles-renderer/src/three/plugins/loaders/WMTSCapabilitiesLoader';
2
+ import { Matrix4 } from 'three';
3
+ /**
4
+ * Cesium Ion 地形配置
5
+ */
6
+ export interface ICesiumIonOptions {
7
+ /** Cesium Ion API Token */
8
+ apiToken: string;
9
+ /** Asset ID,默认 '1' (Cesium World Terrain) */
10
+ assetId?: string;
11
+ /** 是否自动刷新 Token,默认 true */
12
+ autoRefreshToken?: boolean;
13
+ }
14
+ /**
15
+ * 重定向配置(将地球某点移动到场景原点)
16
+ */
17
+ export interface IReorientationOptions {
18
+ /** 经度 */
19
+ lon: number;
20
+ /** 纬度 */
21
+ lat: number;
22
+ /** 高度,默认 0.1 */
23
+ height?: number;
24
+ }
25
+ /**
26
+ * Alpha 裁剪模式
27
+ * - alphaTest: 使用 alphaTest 进行硬边裁剪,不需要深度排序(推荐用于 mask)
28
+ * - transparent: 使用透明混合(可能需要深度排序)
29
+ * - alphaToCoverage: 使用 alphaToCoverage(需要 MSAA,效果较平滑)
30
+ */
31
+ export type AlphaClipMode = 'alphaTest' | 'transparent' | 'alphaToCoverage';
32
+ /**
33
+ * TerrainTilesRenderer 配置选项
34
+ */
35
+ export interface ITerrainTilesRendererOptions {
36
+ /**
37
+ * 基础地形 URL
38
+ * - 默认使用内置的地形服务
39
+ */
40
+ baseUrl?: string;
41
+ /**
42
+ * 影像叠加层 URL
43
+ * - 默认使用 OpenStreetMap
44
+ * - 设置为 false 可禁用影像叠加层
45
+ */
46
+ imageryUrl?: string | false;
47
+ /**
48
+ * 重定向配置
49
+ * - 将地球上指定经纬度的点移动到场景原点
50
+ * - 默认 { lon: 120, lat: 30 }
51
+ */
52
+ reorientation?: IReorientationOptions | false;
53
+ /**
54
+ * 是否使用自定义材质(MeshBasicMaterial)
55
+ * - 默认 true
56
+ */
57
+ useCustomMaterial?: boolean;
58
+ /**
59
+ * 最大深度,默认 20
60
+ */
61
+ maxDepth?: number;
62
+ /**
63
+ * 误差目标,默认 1
64
+ */
65
+ errorTarget?: number;
66
+ /**
67
+ * Alpha 裁剪模式
68
+ * - 用于支持 GeoJSON mask 功能
69
+ * - 默认 'alphaTest'
70
+ */
71
+ alphaClipMode?: AlphaClipMode;
72
+ }
73
+ /**
74
+ * Overlay 基础配置
75
+ */
76
+ export interface IOverlayBaseOptions {
77
+ /** 唯一标识符 */
78
+ id: string;
79
+ /** 颜色 */
80
+ color?: number | string;
81
+ /** 透明度 */
82
+ opacity?: number;
83
+ /** 层级顺序(数值越大越靠上),默认按添加顺序 */
84
+ order?: number;
85
+ }
86
+ /**
87
+ * GeoJSON Overlay 配置
88
+ */
89
+ export interface IGeoJSONOverlayOptions extends IOverlayBaseOptions {
90
+ /** GeoJSON 文件 URL 或 GeoJSON 数据对象 */
91
+ url?: string;
92
+ geojson?: object;
93
+ /** 填充样式 */
94
+ fillStyle?: string;
95
+ /** 描边样式: 颜色设置参考 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle*/
96
+ strokeStyle?: string;
97
+ /** 描边宽度 */
98
+ strokeWidth?: number;
99
+ }
100
+ /**
101
+ * Cesium Ion Overlay 配置
102
+ */
103
+ export interface ICesiumIonOverlayOptions extends IOverlayBaseOptions {
104
+ /** Cesium Ion 资源 ID */
105
+ assetId: string;
106
+ /** Cesium Ion API Token */
107
+ apiToken: string;
108
+ /** 是否自动刷新 Token */
109
+ autoRefreshToken?: boolean;
110
+ }
111
+ /**
112
+ * TMS Tiles Overlay 配置
113
+ */
114
+ export interface ITMSTilesOverlayOptions extends IOverlayBaseOptions {
115
+ /** TMS 服务 URL */
116
+ url: string;
117
+ }
118
+ /**
119
+ * XYZ Tiles Overlay 配置
120
+ */
121
+ export interface IXYZTilesOverlayOptions extends IOverlayBaseOptions {
122
+ /** XYZ 服务 URL */
123
+ url: string;
124
+ }
125
+ /**
126
+ * URL Template Overlay 配置
127
+ *
128
+ * 支持的 URL 模板变量:
129
+ * - `{z}` - 缩放级别
130
+ * - `{x}` - 瓦片 X 坐标
131
+ * - `{y}` - 瓦片 Y 坐标
132
+ * - `{s}` - 子域名(从 subdomains 列表轮换)
133
+ * - `{reverseX}` - 从东向西的瓦片 X
134
+ * - `{reverseY}` - 从底部向上的瓦片 Y(TMS 风格)
135
+ * - `{reverseZ}` - 反转的缩放级别
136
+ * - `{westDegrees}`, `{southDegrees}`, `{eastDegrees}`, `{northDegrees}` - 瓦片边界框(度)
137
+ * - `{westProjected}`, `{southProjected}`, `{eastProjected}`, `{northProjected}` - 瓦片边界框(投影坐标)
138
+ * - `{width}`, `{height}` - 瓦片像素尺寸
139
+ */
140
+ export interface IUrlTemplateOverlayOptions extends IOverlayBaseOptions {
141
+ /**
142
+ * URL 模板,支持上述变量
143
+ * 例如: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
144
+ */
145
+ url: string;
146
+ /**
147
+ * 子域名列表,用于 {s} 占位符轮换
148
+ * 可以是字符串(每个字符是一个子域)或字符串数组
149
+ * 默认: 'abc'
150
+ */
151
+ subdomains?: string | string[];
152
+ /**
153
+ * 缩放级别数量,或每级配置对象数组
154
+ * 默认: 20
155
+ */
156
+ levels?: number | object[];
157
+ /**
158
+ * 瓦片像素尺寸
159
+ * 默认: 256
160
+ */
161
+ tileDimension?: number;
162
+ /**
163
+ * 投影标识符
164
+ * 支持: 'EPSG:3857' (Web Mercator) 或 'EPSG:4326' (WGS84)
165
+ * 默认: 'EPSG:3857'
166
+ */
167
+ projection?: 'EPSG:3857' | 'EPSG:4326';
168
+ /**
169
+ * 内容边界框(度)[west, south, east, north]
170
+ * 如果为 null,则使用完整投影范围
171
+ */
172
+ contentBoundingBox?: [number, number, number, number] | null;
173
+ /**
174
+ * 自定义模板变量
175
+ * 每个键映射到静态字符串或函数 (x, y, level) => value
176
+ */
177
+ customTags?: Record<string, string | ((x: number, y: number, level: number) => string)> | null;
178
+ }
179
+ /**
180
+ * WMS Tiles Overlay 配置
181
+ */
182
+ export interface IWMSTilesOverlayOptions extends IOverlayBaseOptions {
183
+ /** WMS 服务基础 URL */
184
+ url: string;
185
+ /** 图层名称 */
186
+ layer: string;
187
+ /** 样式 */
188
+ styles?: string;
189
+ /** 坐标系 */
190
+ crs?: string;
191
+ /** 图片格式 */
192
+ format?: string;
193
+ /** 瓦片尺寸 */
194
+ tileDimension?: number;
195
+ }
196
+ /**
197
+ * WMTS Tiles Overlay 配置
198
+ */
199
+ export interface IWMTSTilesOverlayOptions extends IOverlayBaseOptions {
200
+ /** WMTS 服务 URL */
201
+ url: string;
202
+ /** 图层标识符 */
203
+ layer?: WMTSLayer | string | null;
204
+ /** 维度 */
205
+ dimensions?: {
206
+ [key: string]: any;
207
+ } | null;
208
+ /** 瓦片矩阵集 */
209
+ tileMatrixSet?: WMTSTileMatrixSet | string | null;
210
+ /** 样式 */
211
+ style?: string;
212
+ /** 帧 */
213
+ frame?: Matrix4 | null;
214
+ }
215
+ /**
216
+ * Overlay 类型枚举
217
+ */
218
+ export declare enum OverlayType {
219
+ GEOJSON = "geojson",
220
+ CESIUM_ION = "cesiumIon",
221
+ TMS = "tms",
222
+ XYZ = "xyz",
223
+ WMS = "wms",
224
+ WMTS = "wmts",
225
+ URL_TEMPLATE = "urlTemplate"
226
+ }
227
+ /**
228
+ * Overlay 存储项
229
+ */
230
+ export interface IOverlayItem<T = any> {
231
+ id: string;
232
+ type: OverlayType;
233
+ options: T;
234
+ instance: any;
235
+ }
236
+ /**
237
+ * 地形源类型
238
+ */
239
+ export declare enum TerrainType {
240
+ /** 量化网格地形(layer.json 格式) */
241
+ QUANTIZED_MESH = "quantizedMesh",
242
+ /** Cesium Ion 地形 */
243
+ CESIUM_ION = "cesiumIon"
244
+ }
245
+ /**
246
+ * 量化网格地形配置
247
+ */
248
+ export interface IQuantizedMeshTerrainOptions {
249
+ /** 地形服务 URL */
250
+ url: string;
251
+ }
252
+ /**
253
+ * 地形源基础配置
254
+ */
255
+ export interface ITerrainSourceBase {
256
+ /** 唯一标识符 */
257
+ id: string;
258
+ }
259
+ /**
260
+ * 量化网格地形源
261
+ */
262
+ export interface IQuantizedMeshTerrainSource extends ITerrainSourceBase {
263
+ type: TerrainType.QUANTIZED_MESH;
264
+ options: IQuantizedMeshTerrainOptions;
265
+ }
266
+ /**
267
+ * Cesium Ion 地形源
268
+ */
269
+ export interface ICesiumIonTerrainSource extends ITerrainSourceBase {
270
+ type: TerrainType.CESIUM_ION;
271
+ options: ICesiumIonOptions;
272
+ }
273
+ /**
274
+ * 地形源联合类型
275
+ */
276
+ export type ITerrainSource = IQuantizedMeshTerrainSource | ICesiumIonTerrainSource;
277
+ /**
278
+ * 地形源存储项
279
+ */
280
+ export interface ITerrainItem {
281
+ id: string;
282
+ type: TerrainType;
283
+ source: ITerrainSource;
284
+ }
285
+ /**
286
+ * 地形配置(用于 setTerrain)
287
+ */
288
+ export type ITerrainConfig = {
289
+ id: string;
290
+ type: TerrainType.QUANTIZED_MESH;
291
+ url: string;
292
+ } | {
293
+ id: string;
294
+ type: TerrainType.CESIUM_ION;
295
+ } & ICesiumIonOptions;
@@ -0,0 +1,120 @@
1
+ import { Object3D } from 'three';
2
+ import { TilesRenderer as TilesInstance } from 'um-3d-tiles-renderer';
3
+ import { TilesFadePlugin, UpdateOnChangePlugin, ReorientationPlugin } from 'um-3d-tiles-renderer/plugins';
4
+ import { default as SoonSpace } from 'soonspacejs';
5
+ import { IReorientationOptions } from '..';
6
+ export declare const MaterialType: {
7
+ readonly DEFAULT: 0;
8
+ readonly GRADIENT: 1;
9
+ readonly TOPOGRAPHIC_LINES: 2;
10
+ readonly LIGHTING: 3;
11
+ };
12
+ export type MaterialTypeValue = (typeof MaterialType)[keyof typeof MaterialType];
13
+ export interface ITilesRendererBaseOptions {
14
+ /** 重定向配置 */
15
+ reorientation?: IReorientationOptions;
16
+ /**
17
+ * 是否使用自定义材质(MeshBasicMaterial)
18
+ * - 默认 false
19
+ */
20
+ useCustomMaterial?: boolean;
21
+ /**
22
+ * 是否自动将模型居中到原点
23
+ * - 默认 true
24
+ */
25
+ autoCenter?: boolean;
26
+ /**
27
+ * 最大深度,默认 20
28
+ */
29
+ maxDepth?: number;
30
+ /**
31
+ * 误差目标,默认 2
32
+ */
33
+ errorTarget?: number;
34
+ /**
35
+ * 内部使用:由 TilesRendererManager 管理时设为 true
36
+ * @internal
37
+ */
38
+ _managedByPlugin?: boolean;
39
+ }
40
+ export interface ITilesRendererOptions extends ITilesRendererBaseOptions {
41
+ /** 3D Tiles 地址 */
42
+ url: string;
43
+ }
44
+ export interface ICesiumIonOptions extends ITilesRendererBaseOptions {
45
+ /** Cesium Ion API Token */
46
+ apiToken: string;
47
+ /** Asset ID*/
48
+ assetId: string;
49
+ /** 是否自动刷新 Token,默认 true */
50
+ autoRefreshToken?: boolean;
51
+ }
52
+ export declare class TilesRenderer {
53
+ readonly ssp: SoonSpace;
54
+ tiles: TilesInstance;
55
+ tilesFadePlugin: TilesFadePlugin;
56
+ updateOnChangePlugin: UpdateOnChangePlugin;
57
+ reorientationPlugin?: ReorientationPlugin;
58
+ options: ITilesRendererOptions | ICesiumIonOptions;
59
+ private _box;
60
+ private _sphere;
61
+ private _materialType;
62
+ private _needsUpdate;
63
+ private _cameraTransitionStart;
64
+ loedTilesSets: Set<() => void>;
65
+ constructor(ssp: SoonSpace, options: ITilesRendererOptions | ICesiumIonOptions);
66
+ /**
67
+ * 初始化 Cesium Ion 插件
68
+ */
69
+ private _initCesiumIon;
70
+ /**
71
+ * 初始化基础插件
72
+ */
73
+ private _initBasePlugins;
74
+ /**
75
+ * 设置 GLTF Loader
76
+ */
77
+ private _setupGLTFLoader;
78
+ /**
79
+ * 设置相机过渡事件监听
80
+ */
81
+ private _setupCameraTransitionEvents;
82
+ /**
83
+ * 按需渲染回调
84
+ */
85
+ private _onNeedsRender;
86
+ /**
87
+ * 获取当前材质类型
88
+ */
89
+ get materialType(): MaterialTypeValue;
90
+ /**
91
+ * 设置材质类型
92
+ */
93
+ set materialType(value: MaterialTypeValue);
94
+ /**
95
+ * 模型加载时保存原始材质
96
+ */
97
+ onLoadModel: ({ scene, }: {
98
+ scene: Object3D;
99
+ }) => void;
100
+ /**
101
+ * 更新场景中所有网格的材质(参考 customMaterial.js)
102
+ */
103
+ updateMaterial: (scene: Object3D) => void;
104
+ onDisposeModel: ({ scene, }: {
105
+ scene: Object3D;
106
+ }) => void;
107
+ /**
108
+ * 应用自动居中逻辑
109
+ */
110
+ applyAutoCenter(): void;
111
+ /**
112
+ * 每帧渲染前的处理
113
+ */
114
+ beforeRenderHandler: () => void;
115
+ render: () => void;
116
+ enable(): void;
117
+ disable(): void;
118
+ invalidate(lon: number, lat: number, alt: number): () => void;
119
+ dispose(): void;
120
+ }
@@ -0,0 +1,51 @@
1
+ import { default as SoonSpace } from 'soonspacejs';
2
+ import { TilesRenderer, ITilesRendererOptions, ICesiumIonOptions } from './TilesRenderer';
3
+ /**
4
+ * TilesRendererManager - 管理多个 TilesRenderer 实例
5
+ * 参考 TilesPlugin 的设计
6
+ */
7
+ export declare class TilesRendererManager {
8
+ readonly ssp: SoonSpace;
9
+ /** 存储多个 tiles 实例,key 为 url */
10
+ tilesMap: Map<string, TilesRenderer>;
11
+ /** 按需渲染标志 */
12
+ needsUpdate: boolean;
13
+ cameraTransitionStart: boolean;
14
+ private _tilesCamera;
15
+ private _lruCache;
16
+ private _parseQueue;
17
+ private _downloadQueue;
18
+ constructor(ssp: SoonSpace);
19
+ private _beforeRenderHandler;
20
+ private _onCameraObjectChange;
21
+ /**
22
+ * 加载 3D Tiles
23
+ * @param url - tileset.json 地址
24
+ * @param options - 配置项
25
+ * @returns Promise<ThreeDTilesRenderer>
26
+ */
27
+ loadTiles(options: ITilesRendererOptions | ICesiumIonOptions): Promise<TilesRenderer | undefined>;
28
+ /**
29
+ * 移除 3D Tiles
30
+ * @param url - tileset.json 地址
31
+ * @returns boolean
32
+ */
33
+ removeTiles(url: string): boolean;
34
+ /**
35
+ * 获取指定 url 的 renderer
36
+ */
37
+ getTiles(url: string): TilesRenderer | undefined;
38
+ /**
39
+ * 获取所有已加载的 renderer
40
+ */
41
+ getAllTiles(): TilesRenderer[];
42
+ /**
43
+ * 清除所有 tiles
44
+ */
45
+ clear(): void;
46
+ invalidate(lon: number, lat: number, alt: number): void;
47
+ /**
48
+ * 销毁插件
49
+ */
50
+ dispose(): void;
51
+ }
@@ -0,0 +1,90 @@
1
+ # Cesium Ion 地形渲染白色斑点问题
2
+
3
+ ## 问题描述
4
+
5
+ 使用 Cesium Ion 地形(assetId: '1')时,渲染结果出现白色高光斑点,类似 Phong 材质的镜面反射效果。而使用自定义 QuantizedMesh 地形时没有此问题。
6
+
7
+ ## 原因分析
8
+
9
+ Cesium Ion World Terrain 返回的地形网格使用了 PBR 材质(`MeshStandardMaterial`),其中包含金属度(metalness)属性。当场景没有正确的环境贴图时,PBR 材质的光照计算会产生异常的高光反射。
10
+
11
+ 自定义地形服务通常使用更简单的材质设置(metalness = 0),因此不会出现此问题。
12
+
13
+ ## 解决方案
14
+
15
+ ### 方案一:设置场景环境贴图(推荐)
16
+
17
+ 为场景添加一个简单的白色环境贴图,使 PBR 材质能正确计算光照:
18
+
19
+ ```typescript
20
+ import { DataTexture, EquirectangularReflectionMapping } from 'three'
21
+
22
+ // 在初始化时设置
23
+ const env = new DataTexture(new Uint8Array(64 * 64 * 4).fill(255), 64, 64)
24
+ env.mapping = EquirectangularReflectionMapping
25
+ env.needsUpdate = true
26
+ scene.environment = env
27
+ ```
28
+
29
+ 在 soonspacejs 中:
30
+
31
+ ```typescript
32
+ const env = new DataTexture(new Uint8Array(64 * 64 * 4).fill(255), 64, 64)
33
+ env.mapping = EquirectangularReflectionMapping
34
+ env.needsUpdate = true
35
+ this.ssp.scene.environment = env
36
+ ```
37
+
38
+ ### 方案二:重置材质金属度
39
+
40
+ 在模型加载回调中强制重置材质的金属度和粗糙度:
41
+
42
+ ```typescript
43
+ tiles.addEventListener('load-model', (event) => {
44
+ event.scene.traverse((c) => {
45
+ if (c.material) {
46
+ // 消除金属反射
47
+ if (c.material.metalness !== undefined) {
48
+ c.material.metalness = 0
49
+ c.material.roughness = 1
50
+ c.material.needsUpdate = true
51
+ }
52
+ }
53
+ })
54
+ })
55
+ ```
56
+
57
+ ## 方案对比
58
+
59
+ | 方案 | 优点 | 缺点 |
60
+ |------|------|------|
61
+ | 环境贴图 | 保留 PBR 材质效果,渲染更自然 | 需要额外设置 |
62
+ | 重置金属度 | 简单直接 | 失去 PBR 材质的真实感 |
63
+
64
+ ## 调试方法
65
+
66
+ 打印材质属性以确认问题:
67
+
68
+ ```typescript
69
+ tiles.addEventListener('load-model', (event) => {
70
+ event.scene.traverse((c) => {
71
+ if (c.material) {
72
+ console.log('Material:', {
73
+ type: c.material.type,
74
+ metalness: c.material.metalness,
75
+ roughness: c.material.roughness,
76
+ })
77
+ }
78
+ })
79
+ })
80
+ ```
81
+
82
+ ## 相关文件
83
+
84
+ - `TilesRenderer.ts` - 主渲染器类
85
+ - `TileCustomMaterialPlugin.ts` - 自定义材质插件
86
+
87
+ ## 参考
88
+
89
+ - [um-3d-tiles-renderer ionExample.js](https://github.com/NASA-AMMOS/3DTilesRendererJS/blob/main/example/ionExample.js)
90
+ - [Three.js MeshStandardMaterial](https://threejs.org/docs/#api/en/materials/MeshStandardMaterial)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@soonspacejs/plugin-tiles",
3
3
  "pluginName": "TilesPlugin",
4
- "version": "2.14.29",
4
+ "version": "2.14.30",
5
5
  "description": "3D Tiles plugin for SoonSpace.js",
6
6
  "main": "dist/index.esm.js",
7
7
  "module": "dist/index.esm.js",
@@ -16,7 +16,7 @@
16
16
  "license": "UNLICENSED",
17
17
  "gitHead": "4a87dd85050651088e11c3da777c49fab3db7e5d",
18
18
  "peerDependencies": {
19
- "3d-tiles-renderer": "0.4.19",
20
- "soonspacejs": "2.14.29"
19
+ "um-3d-tiles-renderer": "^0.4.21",
20
+ "soonspacejs": "2.14.30"
21
21
  }
22
22
  }