mapv-cloudrenderengine 2.7.9 → 2.8.0
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/README.md +230 -81
- package/dist/cloudrenderengine.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,133 +1,282 @@
|
|
|
1
|
-
# CloudRenderEngine
|
|
1
|
+
# CloudRenderEngine 🌐
|
|
2
2
|
|
|
3
|
-
CloudRenderEngine
|
|
3
|
+
CloudRenderEngine 是百度地图开放平台推出的 UE5 像素流三维数字孪生前端 SDK。
|
|
4
|
+
它通过 WebRTC 将 Unreal Engine 5 场景实时推流到浏览器,并提供统一 JavaScript API 完成场景渲染、交互控制、对象管理和行业可视化能力接入。
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
适用场景包括智慧城市、智慧交通、园区管理、文旅展陈、BIM 可视化、实时监控和数字底座应用。
|
|
6
7
|
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
##
|
|
10
|
+
## 产品能力 ✨
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
- **云渲染交互**:浏览器低门槛接入 UE5 高保真场景,支持鼠标/触控/键盘交互。
|
|
13
|
+
- **地图级可视化**:支持点、线、面、热力、雷达、粒子、轨迹、标签等对象体系。
|
|
14
|
+
- **行业对象能力**:支持交通、资产、路况、监控、信息牌等业务对象挂接。
|
|
15
|
+
- **相机与动画系统**:支持飞行、巡航、关键帧导航、场景切换。
|
|
16
|
+
- **环境控制能力**:支持天气、时间、光照等全局场景调度。
|
|
17
|
+
- **WebRTC 监控诊断**:可监控连接质量、码率、丢包与延迟指标。
|
|
16
18
|
|
|
17
19
|
---
|
|
18
20
|
|
|
19
|
-
##
|
|
21
|
+
## 安装与引入 📦
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
包名:`mapv-cloudrenderengine`
|
|
22
24
|
|
|
23
|
-
#### 通过 npm 引入
|
|
24
25
|
```bash
|
|
25
26
|
npm install mapv-cloudrenderengine
|
|
26
27
|
```
|
|
27
28
|
|
|
29
|
+
```javascript
|
|
30
|
+
import * as Engine from 'mapv-cloudrenderengine';
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 必备前提 ✅
|
|
36
|
+
|
|
37
|
+
云渲染模式下,页面必须提供 `id="player"` 的容器作为视频输出目标:
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<div id="player" style="width: 100vw; height: 100vh;"></div>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
建议 `player` 全屏铺设,并将业务 UI 通过更高 `z-index` 叠加显示。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 最小可运行示例(React) 🚀
|
|
48
|
+
|
|
49
|
+
```jsx
|
|
50
|
+
import { useEffect } from 'react';
|
|
51
|
+
import * as Engine from 'mapv-cloudrenderengine';
|
|
52
|
+
|
|
53
|
+
export default function App() {
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
Engine.CloudRenderEngine.DispatchServer.host = 'http://your-dispatch-host:8017';
|
|
56
|
+
|
|
57
|
+
const engine = new Engine.CloudRenderEngine({
|
|
58
|
+
projectName: 'your-project-name',
|
|
59
|
+
connectOnLoad: true,
|
|
60
|
+
shouldShowPlayOverlay: false,
|
|
61
|
+
matchViewportResolution: true,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
engine.load(
|
|
65
|
+
() => console.log('connected'),
|
|
66
|
+
err => console.error('load error', err)
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
engine.addEventListener('videoInitialised', () => {
|
|
70
|
+
console.log('video ready');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return () => {
|
|
74
|
+
// 业务侧可在此处补充销毁逻辑
|
|
75
|
+
};
|
|
76
|
+
}, []);
|
|
77
|
+
|
|
78
|
+
return <div id="player" style={{ width: '100vw', height: '100vh' }} />;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
28
82
|
---
|
|
29
83
|
|
|
30
|
-
|
|
84
|
+
## 快速开始 🧭
|
|
85
|
+
|
|
86
|
+
CloudRenderEngine 支持两种接入模式:
|
|
87
|
+
|
|
88
|
+
1. **调度服务模式(推荐)**:通过调度服务分配 UE5 渲染实例,适合生产环境。
|
|
89
|
+
2. **单机像素流模式**:直连单实例流服务,适合本地调试或固定部署场景。
|
|
90
|
+
|
|
91
|
+
### 1) 调度服务模式(推荐) ☁️
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
import * as Engine from 'mapv-cloudrenderengine';
|
|
95
|
+
|
|
96
|
+
// 1. 配置调度服务
|
|
97
|
+
Engine.CloudRenderEngine.DispatchServer.host = 'http://your-dispatch-host:8017';
|
|
98
|
+
Engine.CloudRenderEngine.DispatchServer.tag = 'all'; // 可选
|
|
99
|
+
Engine.CloudRenderEngine.DispatchServer.username = 'admin'; // 可选
|
|
100
|
+
Engine.CloudRenderEngine.DispatchServer.password = 'admin'; // 可选
|
|
101
|
+
|
|
102
|
+
// 2. 检查可用容量(建议)
|
|
103
|
+
const capacity = await Engine.CloudRenderEngine.DispatchServer.GetAllCapacityInfo();
|
|
104
|
+
if (!capacity || capacity.all <= 0) {
|
|
105
|
+
throw new Error('服务器暂无可用渲染容量');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 3. 初始化引擎
|
|
109
|
+
const engine = new Engine.CloudRenderEngine({
|
|
110
|
+
projectName: 'your-project-name',
|
|
111
|
+
connectOnLoad: true,
|
|
112
|
+
shouldShowPlayOverlay: false,
|
|
113
|
+
matchViewportResolution: true,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// 4. 连接并监听状态
|
|
117
|
+
engine.load(
|
|
118
|
+
() => console.log('调度成功'),
|
|
119
|
+
err => console.error('调度失败', err)
|
|
120
|
+
);
|
|
31
121
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
122
|
+
engine.addEventListener('videoInitialised', () => {
|
|
123
|
+
console.log('画面就绪,可以安全调用场景 API');
|
|
124
|
+
});
|
|
35
125
|
|
|
36
|
-
|
|
126
|
+
engine.addEventListener('signalingServerError', () => {
|
|
127
|
+
console.error('信令服务连接异常');
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 2) 单机像素流模式 🖥️
|
|
37
132
|
|
|
38
133
|
```javascript
|
|
39
|
-
|
|
134
|
+
import * as Engine from 'mapv-cloudrenderengine';
|
|
135
|
+
|
|
40
136
|
const engine = new Engine.CloudRenderEngine({
|
|
41
|
-
wsUrl:
|
|
42
|
-
isShowTestUI: false,
|
|
137
|
+
wsUrl: 'ws://your-pixel-streaming-signaling',
|
|
43
138
|
connectOnLoad: true,
|
|
44
139
|
shouldShowPlayOverlay: false,
|
|
45
140
|
matchViewportResolution: true,
|
|
46
141
|
});
|
|
47
142
|
|
|
48
|
-
// 渲染场景。 此时可以开启一个加载动画
|
|
49
143
|
engine.load();
|
|
144
|
+
engine.addEventListener('videoInitialised', () => {
|
|
145
|
+
console.log('画面就绪');
|
|
146
|
+
});
|
|
147
|
+
```
|
|
50
148
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 常用 API 模式 🛠️
|
|
152
|
+
|
|
153
|
+
### 场景对象增删 🧱
|
|
56
154
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
155
|
+
```javascript
|
|
156
|
+
const line = new Engine.Line({ color: { r: 0, g: 1, b: 0 }, width: 5 });
|
|
157
|
+
line.setData(geojsonData);
|
|
158
|
+
engine.addToScene(line);
|
|
60
159
|
|
|
61
|
-
|
|
62
|
-
engine.
|
|
160
|
+
// 资源释放
|
|
161
|
+
engine.destoryObject(line);
|
|
63
162
|
```
|
|
64
163
|
|
|
65
|
-
|
|
164
|
+
### 相机飞行与巡航 🎥
|
|
66
165
|
|
|
67
|
-
|
|
166
|
+
```javascript
|
|
167
|
+
engine.moveTo(
|
|
168
|
+
{ x: 116.404, y: 39.915, z: 500 },
|
|
169
|
+
{ roll: 0, pitch: -45, yaw: 0 },
|
|
170
|
+
{ duration: 2.0, zoom: 1500 }
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
engine.navigateByKeypoints(
|
|
174
|
+
[[116.40, 39.91, 20, 0, -30, 160], [116.41, 39.92, 30, 0, -40, 130]],
|
|
175
|
+
{ speed: 36, lockAll: true }
|
|
176
|
+
);
|
|
177
|
+
```
|
|
68
178
|
|
|
69
|
-
|
|
179
|
+
### 环境控制(天气/时间) 🌤️
|
|
70
180
|
|
|
71
181
|
```javascript
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
.then(capacity => {
|
|
85
|
-
if (capacity > 0) {
|
|
86
|
-
// 可以连接了
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
const engine = new CloudRenderEngine({
|
|
91
|
-
isShowTestUI: false,
|
|
92
|
-
connectOnLoad: true,
|
|
93
|
-
shouldShowPlayOverlay: false,
|
|
94
|
-
// consul 里配置的英文项目名称
|
|
95
|
-
projectName: 'beijing',
|
|
182
|
+
engine.UDS.changeWeather('clearSkies');
|
|
183
|
+
engine.UDS.changeTime(14, 30);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 获取点击坐标 📍
|
|
187
|
+
|
|
188
|
+
```javascript
|
|
189
|
+
engine.camera.addEventListener('clickLocation', event => {
|
|
190
|
+
const loc = event?.content?.Location;
|
|
191
|
+
if (loc) {
|
|
192
|
+
console.log(loc.longitude, loc.latitude, loc.altitude);
|
|
193
|
+
}
|
|
96
194
|
});
|
|
195
|
+
```
|
|
97
196
|
|
|
98
|
-
const onSuccessed = message => {
|
|
99
|
-
// 调度成功
|
|
100
|
-
};
|
|
101
197
|
|
|
102
|
-
|
|
103
|
-
// 调度失败,此处会给出具体原因,比如权限不足、可用调度容量不足、用户名或者密码错误、已达到该用户的最大连接数等。
|
|
104
|
-
};
|
|
198
|
+
---
|
|
105
199
|
|
|
106
|
-
|
|
107
|
-
engine.load(onSuccessed, onLoadError);
|
|
200
|
+
## AssetLayer 使用要求(重点) 📌
|
|
108
201
|
|
|
109
|
-
|
|
110
|
-
// 执行这个事件后代表资源加载完
|
|
111
|
-
// 加载完成才可以使用 engine 的一系列方法
|
|
112
|
-
};
|
|
202
|
+
`AssetLayer` 依赖模型信息初始化,必须遵循顺序:
|
|
113
203
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
204
|
+
1. 在 `videoInitialised` 中调用一次 `engine.setupModelInfo(...)`
|
|
205
|
+
2. 再创建 `new Engine.AssetLayer(...)`
|
|
206
|
+
3. 最后 `engine.addToScene(assetLayer)`
|
|
117
207
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
208
|
+
如果跳过第 1 步,`AssetLayer` 将无法正常工作。
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 数据格式约定 📐
|
|
213
|
+
|
|
214
|
+
- 坐标系:WGS84 经纬度
|
|
215
|
+
- 位置结构:`{ x: 经度, y: 纬度, z: 高度(米) }`
|
|
216
|
+
- 旋转结构:`{ roll, pitch, yaw }`
|
|
217
|
+
- 颜色结构:`{ r, g, b }`,范围 `0~1`
|
|
218
|
+
- 可视化对象数据:GeoJSON
|
|
219
|
+
|
|
220
|
+
---
|
|
121
221
|
|
|
122
|
-
|
|
222
|
+
## 连接与性能诊断建议 📊
|
|
223
|
+
|
|
224
|
+
- 使用 `videoInitialised` 作为“可操作场景”的唯一就绪信号。
|
|
225
|
+
- 连接前先检查调度容量,避免无效重试。
|
|
226
|
+
- 通过 `engine.onWebRtcConnectionStats()` 监控 RTT、丢包、码率等指标。
|
|
227
|
+
- 对于大量对象场景,及时调用 `engine.destoryObject()` 回收资源。
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 版本与发布 🏷️
|
|
232
|
+
|
|
233
|
+
- npm 包名:`mapv-cloudrenderengine`
|
|
234
|
+
- 当前版本可在 `package.open.json` 中查看
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 文档与资源 📚
|
|
239
|
+
|
|
240
|
+
- API 文档:[https://mapv.baidu.com/mapvunreal/docs/AssetLayer.html](https://mapv.baidu.com/mapvunreal/docs/AssetLayer.html)
|
|
241
|
+
- 调度服务接入说明:[https://mapv.baidu.com/mapvunreal/docs/schServer.html](https://mapv.baidu.com/mapvunreal/docs/schServer.html)
|
|
242
|
+
- 单机像素流说明:[https://mapv.baidu.com/mapvunreal/docs/singlePixel.html](https://mapv.baidu.com/mapvunreal/docs/singlePixel.html)
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Skill 介绍 🤖
|
|
247
|
+
|
|
248
|
+
为方便开发者和 AI 助手快速接入,本 SDK 提供配套 Skill 知识库,覆盖以下能力:
|
|
249
|
+
|
|
250
|
+
- 引擎初始化与调度服务接入
|
|
251
|
+
- 点线面与行业对象可视化代码生成
|
|
252
|
+
- 相机控制、事件处理、天气时间控制
|
|
253
|
+
- AssetLayer 使用规范与常见问题排障
|
|
254
|
+
|
|
255
|
+
Skill 仓库地址:
|
|
256
|
+
[https://github.com/baidu-maps/unreal-sdk-skills](https://github.com/baidu-maps/unreal-sdk-skills)
|
|
123
257
|
|
|
124
258
|
---
|
|
125
259
|
|
|
126
|
-
## 🛠️ 常见问题
|
|
127
260
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
261
|
+
## 常见问题 ❓
|
|
262
|
+
|
|
263
|
+
**Q1:页面无画面输出?**
|
|
264
|
+
优先检查:`#player` 容器是否存在、调度服务配置是否正确、项目容量是否充足。
|
|
265
|
+
|
|
266
|
+
**Q2:对象已创建但不显示?**
|
|
267
|
+
检查数据坐标、GeoJSON 结构、`visible` 状态、相机位置和高度。
|
|
268
|
+
|
|
269
|
+
**Q3:点击无法获取坐标?**
|
|
270
|
+
使用 `engine.camera.addEventListener('clickLocation', ...)` 并确认画面已 `videoInitialised`。
|
|
271
|
+
|
|
272
|
+
**Q4:连接卡顿或延迟高?**
|
|
273
|
+
查看 WebRTC 统计指标(RTT/丢包/码率),并优先排查网络与服务端资源瓶颈。
|
|
131
274
|
|
|
132
275
|
---
|
|
133
276
|
|
|
277
|
+
|
|
278
|
+
## 如何获取更多支持 📮
|
|
279
|
+
|
|
280
|
+
- 技术支持:联系百度地图开放平台技术支持团队
|
|
281
|
+
- 商务合作:[百度地图开放平台](https://jiaotong.baidu.com/contactus/)
|
|
282
|
+
|