@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.
- package/dist/ArcgisTilesRenderer.d.ts +2 -2
- package/dist/TilesPlugin.d.ts +16 -0
- package/dist/index.d.ts +4 -16
- package/dist/index.esm.js +1430 -84
- package/dist/terrain-tiles-renderer/OverlayManager.d.ts +125 -0
- package/dist/terrain-tiles-renderer/ResourceManager.d.ts +78 -0
- package/dist/terrain-tiles-renderer/TerrainManager.d.ts +75 -0
- package/dist/terrain-tiles-renderer/TerrainTilesRenderer.d.ts +218 -0
- package/dist/terrain-tiles-renderer/index.d.ts +6 -0
- package/dist/terrain-tiles-renderer/plugins/TileCustomMaterialPlugin.d.ts +26 -0
- package/dist/terrain-tiles-renderer/plugins/index.d.ts +1 -0
- package/dist/terrain-tiles-renderer/types.d.ts +295 -0
- package/dist/tiles-renderer/TilesRenderer.d.ts +120 -0
- package/dist/tiles-renderer/TilesRendererManager.d.ts +51 -0
- package/docs/cesium-ion-terrain-white-spots.md +90 -0
- package/package.json +3 -3
|
@@ -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.
|
|
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.
|
|
20
|
-
"soonspacejs": "2.14.
|
|
19
|
+
"um-3d-tiles-renderer": "^0.4.21",
|
|
20
|
+
"soonspacejs": "2.14.30"
|
|
21
21
|
}
|
|
22
22
|
}
|