first commit
This commit is contained in:
16
unreal/Config/PlanetConfig.ini
Normal file
16
unreal/Config/PlanetConfig.ini
Normal file
@@ -0,0 +1,16 @@
|
||||
# UE5 项目配置文件
|
||||
# Cesium ion 访问令牌
|
||||
|
||||
# Cesium ion Token (用户提供的 token)
|
||||
CESIUM_ION_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI4YWFhYTQ5Zi02YTBlLTRhNmYtOTYyZC02NjgyYzQwMWY1YmMiLCJpZCI6Mzg5NDMzLCJpYXQiOjE3NzA3ODE1ODN9.yF-06K39B_8SkwMCQVuztAwdXDlRlumT33TVOYhQGqs
|
||||
|
||||
# Cesium ion 默认服务器
|
||||
CESIUM_ION_DEFAULT_SERVER=https://ion.cesium.com
|
||||
|
||||
# 后端 API 地址 (开发环境)
|
||||
BACKEND_API_URL=http://localhost:8000
|
||||
BACKEND_WS_URL=ws://localhost:8000
|
||||
|
||||
# 后端 API 地址 (生产环境)
|
||||
# BACKEND_API_URL=http://your-backend-domain.com
|
||||
# BACKEND_WS_URL=ws://your-backend-domain.com
|
||||
290
unreal/Content/Blueprints/BP_DataFlow_Spec.md
Normal file
290
unreal/Content/Blueprints/BP_DataFlow_Spec.md
Normal file
@@ -0,0 +1,290 @@
|
||||
# BP_DataFlow 数据流向蓝图详细规格
|
||||
|
||||
## 蓝图信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 蓝图类型 | Actor |
|
||||
| 父类 | `Actor` |
|
||||
| 路径 | `Content/Blueprints/BP_DataFlow.uasset` |
|
||||
|
||||
## 组件列表
|
||||
|
||||
```
|
||||
BP_DataFlow
|
||||
├── SceneRoot (场景根)
|
||||
│ ├── SourceMarker (源点标记)
|
||||
│ │ └── StaticMesh: Sphere
|
||||
│ │ └── Material: M_DataFlow_Source
|
||||
│ ├── DestinationMarker (目标点标记)
|
||||
│ │ └── StaticMesh: Sphere
|
||||
│ │ └── Material: M_DataFlow_Destination
|
||||
│ ├── PathSpline (路径样条)
|
||||
│ │ └── SplineMeshComponent
|
||||
│ │ └── Material: M_DataFlow_Path
|
||||
│ └── FlowParticles (流向粒子)
|
||||
│ └── NiagaraComponent
|
||||
│ └── NS_DataFlow_Directional
|
||||
```
|
||||
|
||||
## 变量列表
|
||||
|
||||
| 变量名 | 类型 | 默认值 | 说明 |
|
||||
|--------|------|--------|------|
|
||||
| `FlowId` | String | `""` | 流向唯一标识 |
|
||||
| `SourceLocation` | GeographicPoint | - | 源位置 |
|
||||
| `DestinationLocation` | GeographicPoint | - | 目标位置 |
|
||||
| `DataRate` | Float | `1000.0` | 数据速率 (Gbps) |
|
||||
| `DataType` | EDataFlowType | `Internet` | 数据类型 |
|
||||
| `IsActive` | Boolean | `true` | 是否激活 |
|
||||
| `FlowColor` | LinearColor | (0.2, 0.6, 1.0, 1) | 流向颜色 |
|
||||
| `Duration` | Float | `3.0` | 粒子生命周期(秒) |
|
||||
|
||||
## 枚举定义
|
||||
|
||||
### EDataFlowType
|
||||
|
||||
| 枚举值 | 说明 | 颜色 |
|
||||
|--------|------|------|
|
||||
| `Internet` | 互联网流量 | 蓝色 |
|
||||
| `Backbone` | 骨干网 | 青色 |
|
||||
| `Cloud` | 云服务 | 紫色 |
|
||||
| `AI_Training` | AI 训练数据 | 橙色 |
|
||||
| `CDN` | CDN 分发 | 绿色 |
|
||||
|
||||
## 材质规格
|
||||
|
||||
### M_DataFlow_Source (源点)
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `BaseColor` | Vector3 | (0.2, 0.6, 1.0) | 蓝色 |
|
||||
| `EmissiveStrength` | Float | `10.0` | 自发光强度 |
|
||||
| `PulseSpeed` | Float | `2.0` | 脉冲速度 |
|
||||
| `Radius` | Float | `10000.0` | 脉冲半径 |
|
||||
|
||||
### M_DataFlow_Destination (目标点)
|
||||
|
||||
```
|
||||
与 M_DataFlow_Source 相同,但:
|
||||
├─ BaseColor: 稍暗
|
||||
└─ PulseSpeed: 稍慢
|
||||
```
|
||||
|
||||
### M_DataFlow_Path (路径线)
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `LineColor` | Vector4 | (0.2, 0.6, 1.0, 0.5) | 半透明蓝 |
|
||||
| `LineWidth` | Float | `100.0` | 线宽度 |
|
||||
| `FlowSpeed` | Float | `1.0` | 流动速度 |
|
||||
| `FlowIntensity` | Float | `0.8` | 流动强度 |
|
||||
|
||||
## 粒子系统 (NS_DataFlow_Directional)
|
||||
|
||||
### Niagara 参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `User.Color` | LinearColor | (0.2, 0.6, 1.0, 1.0) | 粒子颜色 |
|
||||
| `User.Speed` | Float | `100.0` | 粒子速度 |
|
||||
| `User.Lifetime` | Float | `3.0` | 粒子寿命 |
|
||||
| `User.Size` | Float | `50.0` | 粒子大小 |
|
||||
| `User.Density` | Float | `1.0` | 粒子密度 |
|
||||
|
||||
### 粒子行为
|
||||
|
||||
```
|
||||
1. 发射器类型: 沿样条路径
|
||||
2. 发射速率: DataRate / 100 (归一化)
|
||||
3. 粒子寿命: Duration
|
||||
4. 粒子速度: 路径长度 / Duration
|
||||
5. 颜色渐变:
|
||||
├─ 起点: 高亮度
|
||||
├─ 中点: 正常亮度
|
||||
└─ 终点: 渐隐
|
||||
```
|
||||
|
||||
## 函数
|
||||
|
||||
### Initialize (Struct FlowData)
|
||||
|
||||
```
|
||||
1. [解析] FlowData
|
||||
2. [设置] FlowId = FlowData["id"]
|
||||
3. [设置] SourceLocation = FlowData["source"]
|
||||
4. [设置] DestinationLocation = FlowData["destination"]
|
||||
5. [设置] DataRate = FlowData["data_rate"]
|
||||
6. [设置] DataType = FlowData["data_type"]
|
||||
7. [计算] PathPoints
|
||||
8. [调用] BuildPath()
|
||||
9. [调用] UpdateParticles()
|
||||
10. [调用] SetFlowColorByType()
|
||||
```
|
||||
|
||||
### BuildPath
|
||||
|
||||
```
|
||||
1. [计算] SourceUE = GeoUtils.LatLonToUE(SourceLocation)
|
||||
2. [计算] DestUE = GeoUtils.LatLonToUE(DestinationLocation)
|
||||
3. [设置] SourceMarker.SetRelativeLocation(SourceUE)
|
||||
4. [设置] DestinationMarker.SetRelativeLocation(DestUE)
|
||||
5. [计算] MidPoints (插值路径)
|
||||
6. [构建] SplineComponent from Source to Destination
|
||||
7. [设置] SplineMeshComponent.Start/End
|
||||
```
|
||||
|
||||
### UpdateParticles
|
||||
|
||||
```
|
||||
1. [计算] ParticleSpeed = PathLength / Duration
|
||||
2. [获取] NiagaraComponent
|
||||
3. [设置] User.Speed = ParticleSpeed
|
||||
4. [计算] EmissionRate = DataRate / 10
|
||||
5. [设置] User.EmissionRate = EmissionRate
|
||||
6. [调用] NiagaraComponent.Activate()
|
||||
```
|
||||
|
||||
### SetFlowColorByType
|
||||
|
||||
```
|
||||
1. [分支] DataType
|
||||
├─ "internet": [设置] FlowColor = (0.2, 0.6, 1.0, 1) 蓝色
|
||||
├─ "backbone": [设置] FlowColor = (0.0, 1.0, 1.0, 1) 青色
|
||||
├─ "cloud": [设置] FlowColor = (0.6, 0.2, 1.0, 1) 紫色
|
||||
├─ "ai_training": [设置] FlowColor = (1.0, 0.5, 0.0, 1) 橙色
|
||||
├─ "cdn": [设置] FlowColor = (0.2, 1.0, 0.4, 1) 绿色
|
||||
└─ [默认]: [设置] FlowColor = (0.5, 0.5, 0.5, 1) 灰色
|
||||
|
||||
2. [设置] Material.LineColor = FlowColor
|
||||
3. [设置] NiagaraComponent.User.Color = FlowColor
|
||||
```
|
||||
|
||||
## 数据格式
|
||||
|
||||
### 输入数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "flow_1",
|
||||
"source": {
|
||||
"latitude": 37.7749,
|
||||
"longitude": -122.4194,
|
||||
"name": "San Francisco"
|
||||
},
|
||||
"destination": {
|
||||
"latitude": 1.3521,
|
||||
"longitude": 103.8198,
|
||||
"name": "Singapore"
|
||||
},
|
||||
"data_rate": 5000.0,
|
||||
"data_type": "internet",
|
||||
"status": "active"
|
||||
}
|
||||
```
|
||||
|
||||
## 视觉效果规格
|
||||
|
||||
### 粒子外观
|
||||
|
||||
| 数据类型 | 粒子形状 | 颜色 | 尾迹 |
|
||||
|----------|----------|------|------|
|
||||
| Internet | 圆形光点 | 蓝色 | 短 |
|
||||
| Backbone | 方形光块 | 青色 | 中 |
|
||||
| Cloud | 菱形 | 紫色 | 长 |
|
||||
| AI_Training | 三角形 | 橙色 | 短 |
|
||||
| CDN | 六边形 | 绿色 | 无 |
|
||||
|
||||
### 带宽可视化
|
||||
|
||||
| 带宽范围 | 粒子密度 | 粒子大小 | 速度 |
|
||||
|----------|----------|----------|------|
|
||||
| > 10 Tbps | 高 | 大 | 快 |
|
||||
| 1-10 Tbps | 中 | 中 | 中 |
|
||||
| < 1 Tbps | 低 | 小 | 慢 |
|
||||
|
||||
## 交互效果
|
||||
|
||||
### 悬停效果
|
||||
|
||||
```
|
||||
1. [高亮] 路径线
|
||||
└─ LineWidth: 200 → 300
|
||||
2. [显示] Tooltip
|
||||
└─ 显示: 源、目标、数据速率、类型
|
||||
3. [暂停] 粒子 (可选)
|
||||
```
|
||||
|
||||
### 点击效果
|
||||
|
||||
```
|
||||
1. [聚焦] 相机到流向中心
|
||||
2. [显示] 详细信息面板
|
||||
3. [播放] Sound Effect
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 视距设置
|
||||
|
||||
```
|
||||
├─ 显示距离: 50000 km
|
||||
├─ 粒子剔除距离: 20000 km
|
||||
└─ 简化粒子距离: 10000 km
|
||||
```
|
||||
|
||||
### 批处理
|
||||
|
||||
```
|
||||
├─ 多个相近流向合并显示
|
||||
├─ 远距离流向使用简化的粒子
|
||||
└─ 禁用低优先级流向的粒子
|
||||
```
|
||||
|
||||
## 使用场景
|
||||
|
||||
### 场景 1: 全球互联网流量
|
||||
|
||||
```
|
||||
DataType: Internet
|
||||
├─ Source: 主要互联网交换中心
|
||||
├─ Destination: 其他地区
|
||||
└─ Visual: 蓝色粒子流
|
||||
```
|
||||
|
||||
### 场景 2: AI 训练数据传输
|
||||
|
||||
```
|
||||
DataType: AI_Training
|
||||
├─ Source: GPU 集群
|
||||
├─ Destination: 数据中心
|
||||
└─ Visual: 橙色高速粒子
|
||||
```
|
||||
|
||||
### 场景 3: CDN 内容分发
|
||||
|
||||
```
|
||||
DataType: CDN
|
||||
├─ Source: 源站
|
||||
├─ Destination: 边缘节点
|
||||
└─ Visual: 绿色扩散粒子
|
||||
```
|
||||
|
||||
## 后端数据映射
|
||||
|
||||
### API 响应格式
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "data_flow",
|
||||
"data": [
|
||||
{
|
||||
"id": "flow_1",
|
||||
"source": {"latitude": 37.77, "longitude": -122.41},
|
||||
"destination": {"latitude": 1.35, "longitude": 103.81},
|
||||
"data_rate": 5000.0,
|
||||
"data_type": "internet"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
287
unreal/Content/Blueprints/BP_DataPoint_Spec.md
Normal file
287
unreal/Content/Blueprints/BP_DataPoint_Spec.md
Normal file
@@ -0,0 +1,287 @@
|
||||
# BP_DataPoint 基类蓝图详细规格
|
||||
|
||||
## 蓝图信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 蓝图类型 | Actor |
|
||||
| 父类 | `Actor` |
|
||||
| 路径 | `Content/Blueprints/BP_DataPoint.uasset` |
|
||||
|
||||
## 组件列表
|
||||
|
||||
```
|
||||
BP_DataPoint
|
||||
├── SceneRoot (场景根)
|
||||
│ ├── StaticMesh (基础网格 - 球体)
|
||||
│ │ └── Material: M_DataPoint_Base
|
||||
│ ├── NiagaraComponent (粒子光晕)
|
||||
│ │ └── Niagara System: NS_DataPoint_Glow
|
||||
│ ├── WidgetComponent (3D 标签)
|
||||
│ │ └── User Widget: W_DataLabel
|
||||
│ └── SpringArm (弹簧臂 - 用于相机聚焦)
|
||||
│ └── CameraComponent
|
||||
```
|
||||
|
||||
## 变量列表
|
||||
|
||||
| 变量名 | 类型 | 默认值 | 说明 |
|
||||
|--------|------|--------|------|
|
||||
| `DataId` | String | `""` | 唯一标识 |
|
||||
| `Name` | String | `"Unknown"` | 显示名称 |
|
||||
| `Source` | String | `"unknown"` | 数据源 |
|
||||
| `DataType` | String | `"point"` | 数据类型 |
|
||||
| `Latitude` | Float | `0.0` | 纬度 |
|
||||
| `Longitude` | Float | `0.0` | 经度 |
|
||||
| `Altitude` | Float | `100000.0` | 高度 (厘米) |
|
||||
| `Country` | String | `""` | 国家 |
|
||||
| `City` | String | `""` | 城市 |
|
||||
| `Performance` | Float | `0.0` | 性能值 |
|
||||
| `Metadata` | JsonObject | `{}` | 元数据 |
|
||||
| `IsSelected` | Boolean | `false` | 是否选中 |
|
||||
| `IsHovered` | Boolean | `false` | 是否悬停 |
|
||||
| `BaseColor` | LinearColor | (1,1,1,1) | 基础颜色 |
|
||||
| `HighlightColor` | LinearColor | (0,1,1,1) | 高亮颜色 |
|
||||
|
||||
## 材质参数
|
||||
|
||||
### M_DataPoint_Base
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `BaseColor` | Vector3 | (1,0,0) | 基础颜色 |
|
||||
| `EmissiveStrength` | Float | `5.0` | 自发光强度 |
|
||||
| `PulseSpeed` | Float | `1.0` | 脉冲速度 |
|
||||
| `PulseIntensity` | Float | `0.5` | 脉冲强度 |
|
||||
| `FresnelPower` | Float | `2.0` | 菲涅尔边缘强度 |
|
||||
|
||||
### NS_DataPoint_Glow (Niagara 参数)
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `User.Color` | LinearColor | (1,0,0,1) | 粒子颜色 |
|
||||
| `User.Size` | Float | `1.0` | 粒子大小 |
|
||||
| `User.Lifetime` | Float | `1.5` | 粒子寿命 |
|
||||
|
||||
## 函数
|
||||
|
||||
### Initialize (String InId, String InName, Float InLat, Float InLon)
|
||||
|
||||
```
|
||||
1. [设置] DataId = InId
|
||||
2. [设置] Name = InName
|
||||
3. [设置] Latitude = InLat
|
||||
4. [设置] Longitude = InLon
|
||||
5. [调用] UpdatePosition()
|
||||
6. [调用] UpdateLabel()
|
||||
```
|
||||
|
||||
### UpdatePosition
|
||||
|
||||
```
|
||||
1. [创建] FGeographicPoint (Latitude, Longitude, Altitude)
|
||||
2. [调用] GeoUtils.LatLonToUEPosition(Point)
|
||||
└─ 返回: UELocation (Vector3)
|
||||
3. [设置] StaticMesh.SetRelativeLocation(UELocation)
|
||||
4. [设置] NiagaraComponent.SetRelativeLocation(UELocation)
|
||||
5. [设置] WidgetComponent.SetRelativeLocation(UELocation + (0,0,200))
|
||||
```
|
||||
|
||||
### UpdateData (Struct NewData)
|
||||
|
||||
```
|
||||
1. [解析] NewData
|
||||
2. [设置] DataId = NewData["id"]
|
||||
3. [设置] Name = NewData["name"]
|
||||
4. [设置] Latitude = NewData["location"]["latitude"]
|
||||
5. [设置] Longitude = NewData["location"]["longitude"]
|
||||
6. [可选] [设置] Performance = NewData["performance"]
|
||||
7. [可选] [设置] Country = NewData["country"]
|
||||
8. [调用] UpdatePosition()
|
||||
9. [调用] UpdateLabel()
|
||||
10. [调用] UpdateMaterial()
|
||||
```
|
||||
|
||||
### UpdateLabel
|
||||
|
||||
```
|
||||
1. [获取] W_DataLabel Widget Reference
|
||||
2. [设置] NameText = Name
|
||||
3. [设置] CountryText = Country
|
||||
4. [设置] PerformanceText = FormatPerformance(Performance)
|
||||
```
|
||||
|
||||
### UpdateMaterial
|
||||
|
||||
```
|
||||
1. [获取] StaticMesh.Material
|
||||
2. [分支] Source
|
||||
├─ "top500":
|
||||
│ └─ [设置] BaseColor = (1, 0.2, 0.2, 1) 红色
|
||||
├─ "epoch_ai_gpu":
|
||||
│ └─ [设置] BaseColor = (1, 0.5, 0, 1) 橙色
|
||||
├─ "huggingface_models":
|
||||
│ └─ [设置] BaseColor = (0.2, 0.5, 1, 1) 蓝色
|
||||
├─ "peeringdb_ixp":
|
||||
│ └─ [设置] BaseColor = (0, 1, 0.5, 1) 青色
|
||||
├─ "peeringdb_network":
|
||||
│ └─ [设置] BaseColor = (0.5, 0, 1, 1) 紫色
|
||||
└─ [默认]:
|
||||
└─ [设置] BaseColor = (1, 1, 1, 1) 白色
|
||||
```
|
||||
|
||||
### FormatPerformance (Float Value) → String
|
||||
|
||||
```
|
||||
1. [分支] Value >= 1000000
|
||||
├─ [是]: 返回 = FString::Printf(TEXT("%.1f EFLOPS"), Value / 1000000)
|
||||
└─ [否]: [分支] Value >= 1000
|
||||
├─ [是]: 返回 = FString::Printf(TEXT("%.1f PFLOPS"), Value / 1000)
|
||||
└─ [否]: 返回 = FString::Printf(TEXT("%.1f TFLOPS"), Value)
|
||||
```
|
||||
|
||||
## 事件
|
||||
|
||||
### OnBeginCursorOver
|
||||
|
||||
```
|
||||
1. [设置] IsHovered = true
|
||||
2. [调用] SetHighlight(true)
|
||||
3. [调用] PlayHoverEffect()
|
||||
```
|
||||
|
||||
### OnEndCursorOver
|
||||
|
||||
```
|
||||
1. [设置] IsHovered = false
|
||||
2. [分支] IsSelected == false
|
||||
└─ [调用] SetHighlight(false)
|
||||
```
|
||||
|
||||
### OnClicked
|
||||
|
||||
```
|
||||
1. [调用] SetSelected(true)
|
||||
2. [调用] BP_GlobeController.OnDataPointSelected(Self)
|
||||
3. [调用] PlayClickEffect()
|
||||
```
|
||||
|
||||
### SetHighlight (Boolean bHighlight)
|
||||
|
||||
```
|
||||
1. [获取] NiagaraComponent
|
||||
2. [分支] bHighlight == true
|
||||
├─ [设置] User.Color = HighlightColor
|
||||
└─ [否则]:
|
||||
├─ [设置] User.Color = BaseColor
|
||||
3. [调用] NiagaraComponent.Activate(bHighlight)
|
||||
```
|
||||
|
||||
### SetSelected (Boolean bSelected)
|
||||
|
||||
```
|
||||
1. [设置] IsSelected = bSelected
|
||||
2. [分支] bSelected == true
|
||||
├─ [设置] StaticMesh.Scale = (1.5, 1.5, 1.5)
|
||||
├─ [调用] SetHighlight(true)
|
||||
└─ [设置] SelectedRing.Visible = true
|
||||
└─ [否则]:
|
||||
├─ [设置] StaticMesh.Scale = (1.0, 1.0, 1.0)
|
||||
├─ [分支] IsHovered == true
|
||||
│ └─ [调用] SetHighlight(true)
|
||||
└─ [设置] SelectedRing.Visible = false
|
||||
```
|
||||
|
||||
### PlayHoverEffect
|
||||
|
||||
```
|
||||
1. [播放] Niagara Particle Burst
|
||||
└─ 粒子数量: 20
|
||||
```
|
||||
|
||||
### PlayClickEffect
|
||||
|
||||
```
|
||||
1. [播放] Sound Effect "DataPoint_Click"
|
||||
2. [播放] Timeline "PulseEffect"
|
||||
└─ 持续时间: 0.5秒
|
||||
```
|
||||
|
||||
## 事件调度器
|
||||
|
||||
| 事件调度器 | 参数 | 说明 |
|
||||
|------------|------|------|
|
||||
| `OnPointSelected` | BP_DataPoint | 点被选中 |
|
||||
| `OnPointHovered` | BP_DataPoint | 鼠标悬停 |
|
||||
| `OnPointClicked` | BP_DataPoint | 点击 |
|
||||
|
||||
## 数据格式
|
||||
|
||||
### 输入数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "top500_1",
|
||||
"name": "Frontier",
|
||||
"source": "top500",
|
||||
"data_type": "supercomputer",
|
||||
"location": {
|
||||
"latitude": 33.7756,
|
||||
"longitude": -84.3962,
|
||||
"altitude": 0
|
||||
},
|
||||
"country": "US",
|
||||
"city": "Atlanta",
|
||||
"performance": 1682.65,
|
||||
"metadata": {
|
||||
"cores": 8730112,
|
||||
"memory": "5.67 PB",
|
||||
"power": "29.0 MW"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 颜色编码
|
||||
|
||||
| 数据源 | 颜色 | RGB | 说明 |
|
||||
|--------|------|-----|------|
|
||||
| top500 | 🔴 红色 | (1.0, 0.2, 0.2) | TOP500 超算 |
|
||||
| epoch_ai_gpu | 🟠 橙色 | (1.0, 0.5, 0.0) | GPU 集群 |
|
||||
| huggingface_models | 🔵 蓝色 | (0.2, 0.5, 1.0) | HuggingFace 模型 |
|
||||
| peeringdb_ixp | 🩵 青色 | (0.0, 1.0, 0.8) | IXP 互联网交换中心 |
|
||||
| peeringdb_network | 🟣 紫色 | (0.6, 0.0, 1.0) | 网络运营商 |
|
||||
| peeringdb_facility | 🟤 棕色 | (0.6, 0.4, 0.2) | 数据中心 |
|
||||
| teleegeography_cables | 🟡 黄色 | (1.0, 0.8, 0.0) | 海底光缆 |
|
||||
|
||||
## 缩放比例
|
||||
|
||||
| 性能范围 | 缩放 | 说明 |
|
||||
|----------|------|------|
|
||||
| < 1 PFLOPS | 0.5x | 小型系统 |
|
||||
| 1-100 PFLOPS | 1.0x | 中型系统 |
|
||||
| 100-1000 PFLOPS | 1.5x | 大型系统 |
|
||||
| > 1 EFLOPS | 2.0x | 超大规模 |
|
||||
|
||||
## 粒子效果 (Niagara)
|
||||
|
||||
### NS_DataPoint_Glow
|
||||
|
||||
```
|
||||
发射器设置:
|
||||
├─ 发射器类型: 粒子系统
|
||||
├─ 发射模式: 循环
|
||||
├─ 发射速率: 30 粒子/秒
|
||||
├─ 粒子寿命: 1.5 秒
|
||||
└─ 粒子大小: 渐变 (小 → 大)
|
||||
|
||||
渲染设置:
|
||||
├─ 渲染组件: Niagara 粒子
|
||||
├─ 材质: M_Particle_Glow
|
||||
├─ 混合模式: Additive
|
||||
└─ 排序: 无
|
||||
|
||||
颜色渐变:
|
||||
├─ 0%: (1, 1, 1, 1)
|
||||
├─ 50%: (1, 1, 1, 0.8)
|
||||
└─ 100%: (1, 1, 1, 0)
|
||||
```
|
||||
301
unreal/Content/Blueprints/BP_GlobeController_Spec.md
Normal file
301
unreal/Content/Blueprints/BP_GlobeController_Spec.md
Normal file
@@ -0,0 +1,301 @@
|
||||
# BP_GlobeController 蓝图详细规格
|
||||
|
||||
## 蓝图信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 蓝图类型 | Actor |
|
||||
| 父类 | `CesiumGeoreference` |
|
||||
| 路径 | `Content/Blueprints/BP_GlobeController.uasset` |
|
||||
|
||||
## 组件列表
|
||||
|
||||
```
|
||||
BP_GlobeController
|
||||
├── CesiumGeoreference (场景根组件)
|
||||
│ └── Cesium3DTileset (地球地形)
|
||||
│ └── CesiumSunSky (太阳光照)
|
||||
│ └── BP_DataPointManager (数据点管理器)
|
||||
│ └── BP_CableManager (海缆管理器)
|
||||
│ └── BP_DataFlowManager (数据流管理器)
|
||||
└── CameraRig (相机支架)
|
||||
```
|
||||
|
||||
## 变量列表
|
||||
|
||||
| 变量名 | 类型 | 默认值 | 说明 |
|
||||
|--------|------|--------|------|
|
||||
| `API_URL` | String | `http://localhost:8000` | 后端 API 地址 |
|
||||
| `WS_URL` | String | `ws://localhost:8000/ws` | WebSocket 地址 |
|
||||
| `bAutoRotate` | Boolean | `true` | 自动旋转 |
|
||||
| `RotateSpeed` | Float | `0.5` | 旋转速度 |
|
||||
| `SelectedPoint` | BP_DataPoint (Weak) | `None` | 当前选中点 |
|
||||
| `AllDataPoints` | Map<String, BP_DataPoint> | `Empty` | 所有数据点映射 |
|
||||
| `UpdateInterval` | Float | `30.0` | 数据更新间隔(秒) |
|
||||
|
||||
## 事件
|
||||
|
||||
### Event BeginPlay
|
||||
|
||||
```
|
||||
1. [调用] InitializeCesium()
|
||||
└─ 设置 Cesium ion Token (从配置读取)
|
||||
|
||||
2. [调用] ConnectWebSocket()
|
||||
└─ 创建 WebSocket 连接
|
||||
└─ 绑定回调:
|
||||
├─ OnConnected: [调用] HandleConnected()
|
||||
├─ OnMessage: [调用] HandleMessage()
|
||||
└─ OnError: [调用] HandleError()
|
||||
|
||||
3. [设置] Timer by Event
|
||||
└─ 事件: UpdateAllData
|
||||
└─ 时间: UpdateInterval (30秒)
|
||||
```
|
||||
|
||||
### Event Tick
|
||||
|
||||
```
|
||||
1. [分支] bAutoRotate == true?
|
||||
├─ [是]: [调用] RotateGlobe(DeltaSeconds * RotateSpeed)
|
||||
└─ [否]: 跳过
|
||||
```
|
||||
|
||||
## 自定义事件
|
||||
|
||||
### InitializeCesium
|
||||
|
||||
```
|
||||
1. [获取] Get UCesiumRuntimeSettings (来自 Project Settings)
|
||||
2. [设置] Cesium ion Token
|
||||
3. [调用] RefreshTileset()
|
||||
```
|
||||
|
||||
### ConnectWebSocket
|
||||
|
||||
```
|
||||
1. [创建] WebSocket 对象 (WS_URL)
|
||||
2. [绑定] OnConnected → HandleConnected
|
||||
3. [绑定] OnMessage → HandleMessage
|
||||
4. [绑定] OnError → HandleError
|
||||
5. [调用] Connect()
|
||||
```
|
||||
|
||||
### HandleConnected
|
||||
|
||||
```
|
||||
1. [打印] "WebSocket Connected!" (绿色)
|
||||
2. [调用] RequestAllData()
|
||||
```
|
||||
|
||||
### HandleMessage (String Message)
|
||||
|
||||
```
|
||||
1. [解析] JSON Parse String → MessageData
|
||||
2. [获取] MessageData["type"] → Type
|
||||
|
||||
3. [分支] Type
|
||||
├─ "update":
|
||||
│ ├─ [获取] MessageData["data"] → Data
|
||||
│ ├─ [获取] Data["source"] → Source
|
||||
│ ├─ [获取] Data["action"] → Action
|
||||
│ └─ [调用] ProcessDataUpdate(Source, Action, Data)
|
||||
│
|
||||
├─ "alarm":
|
||||
│ └─ [调用] ShowAlarm(Data)
|
||||
│
|
||||
└─ [默认]:
|
||||
└─ [打印] "Unknown message type" (黄色)
|
||||
```
|
||||
|
||||
### ProcessDataUpdate (String Source, String Action, Struct Data)
|
||||
|
||||
```
|
||||
1. [分支] Source
|
||||
├─ "top500":
|
||||
│ └─ [调用] UpdateSupercomputer(Action, Data)
|
||||
│
|
||||
├─ "peeringdb_ixp":
|
||||
│ └─ [调用] UpdateIXPNode(Action, Data)
|
||||
│
|
||||
├─ "peeringdb_network":
|
||||
│ └─ [调用] UpdateNetworkNode(Action, Data)
|
||||
│
|
||||
├─ "telegeography_cables":
|
||||
│ └─ [调用] UpdateSubmarineCable(Action, Data)
|
||||
│
|
||||
└─ [默认]:
|
||||
└─ [打印] Unknown source (黄色)
|
||||
```
|
||||
|
||||
### UpdateSupercomputer (String Action, Struct Data)
|
||||
|
||||
```
|
||||
1. [获取] Data["id"] → PointId
|
||||
|
||||
2. [分支] Action
|
||||
├─ "add":
|
||||
│ ├─ [调用] BP_DataPointManager.CreateDataPoint(Data)
|
||||
│ │ └─ 返回: NewPoint
|
||||
│ ├─ [获取] NewPoint.Id → Key
|
||||
│ └─ [设置] AllDataPoints[Key] = NewPoint
|
||||
│
|
||||
├─ "update":
|
||||
│ ├─ [获取] AllDataPoints[PointId] → ExistingPoint
|
||||
│ ├─ [分支] ExistingPoint != None
|
||||
│ │ └─ [调用] ExistingPoint.UpdateData(Data)
|
||||
│ └─ [否则]:
|
||||
│ └─ [调用] UpdateSupercomputer("add", Data)
|
||||
│
|
||||
└─ "remove":
|
||||
├─ [获取] AllDataPoints[PointId] → ExistingPoint
|
||||
├─ [分支] ExistingPoint != None
|
||||
│ └─ [调用] ExistingPoint.Destroy()
|
||||
└─ [设置] AllDataPoints.Remove(PointId)
|
||||
```
|
||||
|
||||
### UpdateSubmarineCable (String Action, Struct Data)
|
||||
|
||||
```
|
||||
1. [获取] Data["id"] → CableId
|
||||
|
||||
2. [分支] Action
|
||||
├─ "add":
|
||||
│ ├─ [调用] BP_CableManager.CreateCable(Data)
|
||||
│ │ └─ 返回: NewCable
|
||||
│ ├─ [获取] NewCable.Id → Key
|
||||
│ └─ [设置] AllCables[Key] = NewCable
|
||||
│
|
||||
├─ "update":
|
||||
│ ├─ [获取] AllCables[CableId] → ExistingCable
|
||||
│ └─ [分支] ExistingCable != None
|
||||
│ └─ [调用] ExistingCable.UpdateData(Data)
|
||||
│
|
||||
└─ "remove":
|
||||
├─ [获取] AllCables[CableId] → ExistingCable
|
||||
├─ [分支] ExistingCable != None
|
||||
│ └─ [调用] ExistingCable.Destroy()
|
||||
└─ [设置] AllCables.Remove(CableId)
|
||||
```
|
||||
|
||||
### UpdateAllData
|
||||
|
||||
```
|
||||
1. [调用] HTTP Request (GET /api/v1/collected/summary)
|
||||
2. [解析] JSON Response
|
||||
3. [打印] "Data Updated: {Total} records"
|
||||
```
|
||||
|
||||
### RequestAllData
|
||||
|
||||
```
|
||||
1. [调用] HTTP Request (GET /api/v1/collected?limit=10000)
|
||||
2. [解析] JSON Response → DataArray
|
||||
3. [循环] For Each Data in DataArray
|
||||
├─ [获取] Data["source"] → Source
|
||||
└─ [调用] ProcessDataUpdate(Source, "add", Data)
|
||||
```
|
||||
|
||||
## 辅助函数
|
||||
|
||||
### RotateGlobe (Float Delta)
|
||||
|
||||
```
|
||||
1. [获取] Self.ActorRotation → CurrentRotation
|
||||
2. [计算] NewRotation = CurrentRotation + (0, Delta * 10, 0)
|
||||
3. [设置] Self.ActorRotation = NewRotation
|
||||
```
|
||||
|
||||
### FocusOnPoint (BP_DataPoint Target)
|
||||
|
||||
```
|
||||
1. [分支] Target != None
|
||||
├─ [获取] Target.Location → PointLocation
|
||||
├─ [获取] CameraRig.Camera → MainCamera
|
||||
├─ [获取] PointLocation.Latitude → Lat
|
||||
├─ [获取] PointLocation.Longitude → Lon
|
||||
├─ [调用] CesiumGeoreference.SetView(Lat, Lon, 500000)
|
||||
└─ [设置] SelectedPoint = Target
|
||||
```
|
||||
|
||||
### ShowAlarm (Struct AlarmData)
|
||||
|
||||
```
|
||||
1. [创建] Widget W_AlarmPanel
|
||||
2. [设置] W_AlarmPanel.Data = AlarmData
|
||||
3. [添加到视口] Add to Viewport
|
||||
4. [播放动画] W_AlarmPanel.FadeIn
|
||||
5. [设置计时器] 5秒后调用 HideAlarm()
|
||||
```
|
||||
|
||||
## 接口实现
|
||||
|
||||
### IWebSocketCallback
|
||||
|
||||
```
|
||||
OnConnected:
|
||||
└─ [调用] HandleConnected()
|
||||
|
||||
OnMessage (String Message):
|
||||
└─ [调用] HandleMessage(Message)
|
||||
|
||||
OnError (String Error):
|
||||
└─ [打印] "WebSocket Error: {Error}" (红色)
|
||||
|
||||
OnClosed (Int32 Code, String Reason):
|
||||
└─ [打印] "WebSocket Closed: {Code} - {Reason}" (黄色)
|
||||
└─ [设置计时器] 5秒后调用 Reconnect()
|
||||
```
|
||||
|
||||
## 事件调度器
|
||||
|
||||
| 事件调度器 | 参数 | 说明 |
|
||||
|------------|------|------|
|
||||
| `OnDataPointSelected` | BP_DataPoint | 数据点被选中 |
|
||||
| `OnAlarmReceived` | Struct AlarmData | 收到告警 |
|
||||
| `OnConnectionStatus` | Boolean | 连接状态变化 |
|
||||
|
||||
## 后端 API 对接
|
||||
|
||||
### HTTP 请求
|
||||
|
||||
| 操作 | 方法 | 端点 | 说明 |
|
||||
|------|------|------|------|
|
||||
| 获取汇总 | GET | `/api/v1/collected/summary` | 获取数据统计 |
|
||||
| 获取TOP500 | GET | `/api/v1/collected?source=top500` | 获取超算数据 |
|
||||
| 获取海缆 | GET | `/api/v1/collected?source=telegeography_cables` | 获取海缆数据 |
|
||||
| 获取全部 | GET | `/api/v1/collected?limit=10000` | 获取所有数据 |
|
||||
|
||||
### WebSocket 消息
|
||||
|
||||
**订阅:**
|
||||
```json
|
||||
{
|
||||
"action": "subscribe",
|
||||
"channels": ["updates", "alarms"]
|
||||
}
|
||||
```
|
||||
|
||||
**更新:**
|
||||
```json
|
||||
{
|
||||
"type": "update",
|
||||
"data": {
|
||||
"source": "top500",
|
||||
"action": "add",
|
||||
"payload": { ... }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**告警:**
|
||||
```json
|
||||
{
|
||||
"type": "alarm",
|
||||
"data": {
|
||||
"severity": "high",
|
||||
"message": "数据采集失败",
|
||||
"source": "peeringdb_ixp"
|
||||
}
|
||||
}
|
||||
```
|
||||
314
unreal/Content/Blueprints/BP_SubmarineCable_Spec.md
Normal file
314
unreal/Content/Blueprints/BP_SubmarineCable_Spec.md
Normal file
@@ -0,0 +1,314 @@
|
||||
# BP_SubmarineCable 海底光缆蓝图详细规格
|
||||
|
||||
## 蓝图信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 蓝图类型 | Actor |
|
||||
| 父类 | `Actor` |
|
||||
| 路径 | `Content/Blueprints/BP_SubmarineCable.uasset` |
|
||||
|
||||
## 组件列表
|
||||
|
||||
```
|
||||
BP_SubmarineCable
|
||||
├── SceneRoot (场景根)
|
||||
│ ├── SplineComponent (路径样条)
|
||||
│ │ └── [动态] 点数量根据路径数据动态创建
|
||||
│ ├── CableMesh (光缆几何体)
|
||||
│ │ └── SplineMeshComponent × N (多个样条网格)
|
||||
│ │ └── Material: M_Cable
|
||||
│ ├── FlowParticles (流向粒子)
|
||||
│ │ └── NiagaraComponent
|
||||
│ │ └── NS_DataFlow (粒子系统)
|
||||
│ └── EndPointMarkers (端点标记)
|
||||
│ ├── BP_DataPoint (起点标记)
|
||||
│ └── BP_DataPoint (终点标记)
|
||||
```
|
||||
|
||||
## 变量列表
|
||||
|
||||
| 变量名 | 类型 | 默认值 | 说明 |
|
||||
|--------|------|--------|------|
|
||||
| `CableId` | String | `""` | 光缆唯一标识 |
|
||||
| `Name` | String | `"Unknown Cable"` | 光缆名称 |
|
||||
| `CableType` | ESubmarineCableType | `Main` | 光缆类型 |
|
||||
| `Bandwidth` | Float | `1000.0` | 带宽 (Tbps) |
|
||||
| `Length` | Float | `0.0` | 长度 (公里) |
|
||||
| `Owner` | String | `""` | 运营商 |
|
||||
| `IsActive` | Boolean | `true` | 是否激活 |
|
||||
| `PathPoints` | Array<GeographicPoint> | `[]` | 路径点数组 |
|
||||
| `StartPoint` | GeographicPoint | - | 起点 |
|
||||
| `EndPoint` | GeographicPoint | - | 终点 |
|
||||
| `CableColor` | LinearColor | (1.0, 0.8, 0.0, 1) | 光缆颜色 |
|
||||
|
||||
## 枚举定义
|
||||
|
||||
### ESubmarineCableType
|
||||
|
||||
| 枚举值 | 说明 |
|
||||
|--------|------|
|
||||
| `Main` | 主干光缆 |
|
||||
| `Branch` | 分支光缆 |
|
||||
| `Regional` | 区域光缆 |
|
||||
| `Private` | 私有光缆 |
|
||||
|
||||
## 组件详情
|
||||
|
||||
### SplineComponent
|
||||
|
||||
```
|
||||
设置:
|
||||
├─ 闭合: false (光缆通常不闭合)
|
||||
├─ 插值: 曲线插值
|
||||
└─ 点数: PathPoints.Length
|
||||
```
|
||||
|
||||
### SplineMeshComponent (用于渲染)
|
||||
|
||||
```
|
||||
每个段创建一个 SplineMeshComponent:
|
||||
├─ StartLocation: 样条点[i] 的 UE 坐标
|
||||
├─ EndLocation: 样条点[i+1] 的 UE 坐标
|
||||
├─ StartTangent: 样条切线
|
||||
├─ EndTangent: 样条切线
|
||||
└─ Material: M_Cable
|
||||
```
|
||||
|
||||
## 材质规格
|
||||
|
||||
### M_Cable (光缆材质)
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `BaseColor` | Vector3 | (1.0, 0.8, 0.0) | 金黄色 |
|
||||
| `Metallic` | Float | `0.8` | 金属度 |
|
||||
| `Roughness` | Float | `0.3` | 粗糙度 |
|
||||
| `EmissiveStrength` | Float | `2.0` | 自发光强度 |
|
||||
| `PulseSpeed` | Float | `0.5` | 脉冲速度 |
|
||||
| `FlowDirection` | Float | `1.0` | 流向 (1=正向, -1=反向) |
|
||||
|
||||
### M_Cable_Inactive (非激活状态)
|
||||
|
||||
```
|
||||
基于 M_Cable:
|
||||
├─ EmissiveStrength: 0.2
|
||||
├─ Saturation: 0.3
|
||||
└─ Color: 灰色
|
||||
```
|
||||
|
||||
## 粒子效果 (NS_DataFlow)
|
||||
|
||||
### 粒子系统参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `User.FlowColor` | LinearColor | (1.0, 0.8, 0.0, 1) | 粒子颜色 |
|
||||
| `User.FlowSpeed` | Float | `100.0` | 粒子速度 |
|
||||
| `User.FlowDensity` | Float | `1.0` | 粒子密度 |
|
||||
| `User.FlowDirection` | Float | `1.0` | 流向 |
|
||||
|
||||
### 粒子行为
|
||||
|
||||
```
|
||||
1. 粒子沿样条路径移动
|
||||
2. 速度 = Bandwidth / 1000 (归一化)
|
||||
3. 颜色根据带宽变化:
|
||||
├─ > 1000 Tbps: 绿色 (繁忙)
|
||||
├─ 500-1000 Tbps: 青色 (正常)
|
||||
├─ 100-500 Tbps: 黄色 (空闲)
|
||||
└─ < 100 Tbps: 红色 (低负载)
|
||||
```
|
||||
|
||||
## 函数
|
||||
|
||||
### Initialize (Struct CableData)
|
||||
|
||||
```
|
||||
1. [解析] CableData
|
||||
2. [设置] CableId = CableData["id"]
|
||||
3. [设置] Name = CableData["name"]
|
||||
4. [设置] Bandwidth = CableData["bandwidth"]
|
||||
5. [设置] Length = CableData["length"]
|
||||
6. [设置] Owner = CableData["owner"]
|
||||
7. [获取] CableData["path"] → PathArray
|
||||
8. [设置] PathPoints = ConvertToGeoPoints(PathArray)
|
||||
9. [调用] BuildSpline()
|
||||
10. [调用] UpdateMaterial()
|
||||
```
|
||||
|
||||
### BuildSpline
|
||||
|
||||
```
|
||||
1. [清空] SplineComponent.Points
|
||||
2. [循环] For Each Point in PathPoints
|
||||
├─ [计算] UEPosition = GeoUtils.LatLonToUE(Point)
|
||||
└─ [添加] SplineComponent.AddSplinePoint(UEPosition)
|
||||
|
||||
3. [循环] For i = 0 to PathPoints.Length - 2
|
||||
├─ [创建] SplineMeshComponent
|
||||
├─ [设置] StartLocation = SplinePoint[i]
|
||||
├─ [设置] EndLocation = SplinePoint[i+1]
|
||||
├─ [设置] StartTangent = SplineTangent[i]
|
||||
├─ [设置] EndTangent = SplineTangent[i+1]
|
||||
└─ [添加] 到 CableMeshComponents 数组
|
||||
```
|
||||
|
||||
### UpdateMaterial
|
||||
|
||||
```
|
||||
1. [计算] FlowSpeed = Bandwidth / 1000 * 50
|
||||
2. [获取] NiagaraComponent
|
||||
3. [设置] User.FlowSpeed = FlowSpeed
|
||||
4. [分支] Bandwidth
|
||||
├─ > 1000: [设置] FlowColor = (0, 1, 0, 1) 绿色
|
||||
├─ 500-1000: [设置] FlowColor = (0, 1, 1, 1) 青色
|
||||
├─ 100-500: [设置] FlowColor = (1, 1, 0, 1) 黄色
|
||||
└─ < 100: [设置] FlowColor = (1, 0, 0, 1) 红色
|
||||
5. [设置] Material.FlowColor = FlowColor
|
||||
```
|
||||
|
||||
### UpdateData (Struct NewData)
|
||||
|
||||
```
|
||||
1. [设置] Bandwidth = NewData["bandwidth"]
|
||||
2. [设置] IsActive = NewData["is_active"]
|
||||
3. [调用] UpdateMaterial()
|
||||
4. [调用] UpdateParticles()
|
||||
```
|
||||
|
||||
### SetFlowDirection (Float Direction)
|
||||
|
||||
```
|
||||
1. [设置] Material.FlowDirection = Direction
|
||||
2. [设置] NiagaraComponent.FlowDirection = Direction
|
||||
3. [分支] Direction > 0
|
||||
├─ [是]: [设置] StartMarker.Icon = 起点图标
|
||||
└─ [否]: [设置] StartMarker.Icon = 终点图标
|
||||
```
|
||||
|
||||
## 事件
|
||||
|
||||
### OnBeginCursorOver
|
||||
|
||||
```
|
||||
1. [设置] CableMesh.OverlayMaterial = M_Highlight
|
||||
2. [设置] HighlightStrength = 0.3 → 1.0 (渐变)
|
||||
3. [创建/显示] Tooltip Widget
|
||||
└─ 显示: 名称、带宽、长度、运营商
|
||||
```
|
||||
|
||||
### OnEndCursorOver
|
||||
|
||||
```
|
||||
1. [设置] CableMesh.OverlayMaterial = nullptr
|
||||
2. [隐藏] Tooltip Widget
|
||||
```
|
||||
|
||||
### OnClicked
|
||||
|
||||
```
|
||||
1. [调用] FocusOnCable()
|
||||
2. [调用] ShowCableDetails()
|
||||
```
|
||||
|
||||
### FocusOnCable
|
||||
|
||||
```
|
||||
1. [获取] Self.Bounds → CableBounds
|
||||
2. [获取] CameraRig.Camera
|
||||
3. [计算] ViewLocation = CableBounds.Center + (0, 0, 500000)
|
||||
4. [调用] Camera.SetViewTargetWithBlend(ViewLocation)
|
||||
5. [播放] Timeline "FlyToTarget"
|
||||
```
|
||||
|
||||
## 数据格式
|
||||
|
||||
### 输入数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "cable_seamewe4",
|
||||
"name": "SEA-ME-WE 4",
|
||||
"source": "telegeography_cables",
|
||||
"data_type": "submarine_cable",
|
||||
"metadata": {
|
||||
"bandwidth": 2920.0,
|
||||
"length": 19650.0,
|
||||
"owner": "Telecom Italia",
|
||||
"cable_type": "Main",
|
||||
"is_active": true,
|
||||
"owners_list": [
|
||||
"Telecom Italia",
|
||||
"Orange",
|
||||
"Singtel",
|
||||
"MCI"
|
||||
],
|
||||
"rfs_date": "2005-12-15"
|
||||
},
|
||||
"path": [
|
||||
{"latitude": 1.3521, "longitude": 103.8198},
|
||||
{"latitude": 3.1390, "longitude": 101.6869},
|
||||
{"latitude": 5.4141, "longitude": 100.3297},
|
||||
{"latitude": 13.7563, "longitude": 100.5018},
|
||||
{"latitude": 21.4858, "longitude": 101.0400}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 带宽颜色编码
|
||||
|
||||
| 带宽范围 | 颜色 | RGB | 含义 |
|
||||
|----------|------|-----|------|
|
||||
| > 2000 Tbps | 🟢 亮绿 | (0.2, 1.0, 0.2) | 高负载/骨干 |
|
||||
| 1000-2000 Tbps | 🟢 绿色 | (0.4, 1.0, 0.4) | 繁忙 |
|
||||
| 500-1000 Tbps | 🔵 青色 | (0.2, 1.0, 1.0) | 正常 |
|
||||
| 100-500 Tbps | 🟡 黄色 | (1.0, 1.0, 0.2) | 空闲 |
|
||||
| < 100 Tbps | 🔴 红色 | (1.0, 0.3, 0.3) | 低负载 |
|
||||
|
||||
## 光缆类型图标
|
||||
|
||||
| 类型 | 图标 | 颜色 |
|
||||
|------|------|------|
|
||||
| Main | ⬛ 主干 | 金色 |
|
||||
| Branch | ┊ 分支 | 银色 |
|
||||
| Regional | ∿ 区域 | 铜色 |
|
||||
| Private | 🔒 私有 | 灰色 |
|
||||
|
||||
## 性能优化
|
||||
|
||||
### LOD 设置
|
||||
|
||||
```
|
||||
LOD0 (近距离):
|
||||
├─ 高精度网格
|
||||
├─ 完整纹理
|
||||
└─ 完整粒子
|
||||
|
||||
LOD1 (中距离):
|
||||
├─ 中精度网格
|
||||
├─ 半分辨率纹理
|
||||
└─ 简化粒子
|
||||
|
||||
LOD2 (远距离):
|
||||
├─ 低精度网格
|
||||
└─ 禁用粒子
|
||||
```
|
||||
|
||||
### 视锥剔除
|
||||
|
||||
```
|
||||
├─ 启用: true
|
||||
└─ 剔除距离: 50000 km
|
||||
```
|
||||
|
||||
## 知名海缆示例
|
||||
|
||||
| 名称 | 长度 | 带宽 | 起点 | 终点 |
|
||||
|------|------|------|------|------|
|
||||
| SEA-ME-WE 4 | 19,650 km | 2.92 Pbps | 新加坡 | 法国 |
|
||||
| SEA-ME-WE 5 | 20,000 km | 2.44 Pbps | 新加坡 | 法国 |
|
||||
| FASTER | 11,629 km | 6.08 Pbps | 日本 | 美国 |
|
||||
| Apollo | 13,000 km | 3.20 Pbps | 美国 | 法国 |
|
||||
| Pacific Light | 12,120 km | 2.88 Pbps | 香港 | 美国 |
|
||||
| Hainan to Singapore | 2,936 km | 6.0 Pbps | 海南 | 新加坡 |
|
||||
278
unreal/Content/Blueprints/BP_Supercomputer_Spec.md
Normal file
278
unreal/Content/Blueprints/BP_Supercomputer_Spec.md
Normal file
@@ -0,0 +1,278 @@
|
||||
# BP_Supercomputer TOP500 超算蓝图详细规格
|
||||
|
||||
## 蓝图信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 蓝图类型 | Actor (BP_DataPoint 子类) |
|
||||
| 父类 | `BP_DataPoint` |
|
||||
| 路径 | `Content/Blueprints/BP_Supercomputer.uasset` |
|
||||
|
||||
## 组件列表
|
||||
|
||||
```
|
||||
BP_Supercomputer (继承自 BP_DataPoint)
|
||||
├── [继承] SceneRoot
|
||||
│ ├── [继承] StaticMesh (球体)
|
||||
│ │ └── Material: M_Supercomputer (红色自发光)
|
||||
│ ├── [继承] NiagaraComponent (光环粒子)
|
||||
│ │ └── NS_Supercomputer_Glow (红色光环)
|
||||
│ ├── [继承] WidgetComponent (标签)
|
||||
│ │ └── User Widget: W_SupercomputerLabel
|
||||
│ ├── [新增] RingMesh (圆环网格)
|
||||
│ │ └── Material: M_Ring_Pulse (脉冲圆环)
|
||||
│ └── [新增] PerformanceText3D (3D 性能文字)
|
||||
│ └── Font: Default
|
||||
```
|
||||
|
||||
## 变量列表 (新增)
|
||||
|
||||
| 变量名 | 类型 | 默认值 | 说明 |
|
||||
|--------|------|--------|------|
|
||||
| `Rmax` | Float | `1682.65` | Rmax 值 (TFLOPS) |
|
||||
| `Rpeak` | Float | `2000.0` | Rpeak 值 (TFLOPS) |
|
||||
| `CoreCount` | Integer | `0` | CPU 核心数 |
|
||||
| `NodeCount` | Integer | `0` | 节点数 |
|
||||
| `Interconnect` | String | `"InfiniBand"` | 互联网络 |
|
||||
| `OperatingSystem` | String | `"Linux"` | 操作系统 |
|
||||
| `Vendor` | String | `"HPE"` | 厂商 |
|
||||
| `Model` | String | `"Expresso"` | 型号 |
|
||||
|
||||
## 函数覆盖 (Override)
|
||||
|
||||
### UpdateLabel (Override)
|
||||
|
||||
```
|
||||
1. [父调用] BP_DataPoint.UpdateLabel()
|
||||
|
||||
2. [获取] W_SupercomputerLabel Widget
|
||||
3. [设置] NameText = Name
|
||||
4. [设置] CountryText = Country
|
||||
5. [设置] PerformanceText = FormatPerformance(Rmax)
|
||||
6. [设置] CoreText = FormatNumber(CoreCount)
|
||||
7. [设置] VendorText = Vendor
|
||||
```
|
||||
|
||||
### UpdateMaterial (Override)
|
||||
|
||||
```
|
||||
1. [获取] StaticMesh.Material
|
||||
2. [设置] BaseColor = (1.0, 0.1, 0.1, 1) 红色
|
||||
3. [设置] EmissiveStrength = 3.0 + (Rmax / 100)
|
||||
4. [计算] PulseSpeed = 0.5 + (Rmax / 1000)
|
||||
5. [设置] PulseSpeed_Material = PulseSpeed
|
||||
```
|
||||
|
||||
### UpdateSize (Override)
|
||||
|
||||
```
|
||||
1. [计算] ScaleFactor = 0.5 + (Rmax / 500)
|
||||
├─ < 100 TFLOPS: 0.5x
|
||||
├─ 100-500 TFLOPS: 1.0x
|
||||
├─ 500-1000 TFLOPS: 1.5x
|
||||
└─ > 1000 TFLOPS: 2.0x
|
||||
|
||||
2. [设置] StaticMesh.SetWorldScale3D(ScaleFactor)
|
||||
```
|
||||
|
||||
## 材质规格
|
||||
|
||||
### M_Supercomputer
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `BaseColor` | Vector3 | (1.0, 0.1, 0.1) | 红色 |
|
||||
| `EmissiveColor` | Vector3 | (1.0, 0.0, 0.0) | 自发光颜色 |
|
||||
| `EmissiveStrength` | Float | `5.0` | 自发光强度 |
|
||||
| `PulseSpeed` | Float | `1.0` | 脉冲速度 |
|
||||
| `PulseIntensity` | Float | `0.3` | 脉冲强度 |
|
||||
| `FresnelPower` | Float | `2.5` | 菲涅尔效果 |
|
||||
|
||||
### M_Ring_Pulse
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `RingColor` | Vector4 | (1.0, 0.2, 0.2, 1.0) | 圆环颜色 |
|
||||
| `RingWidth` | Float | `0.02` | 圆环宽度 |
|
||||
| `PulseSpeed` | Float | `1.0` | 脉冲速度 |
|
||||
| `GlowIntensity` | Float | `10.0` | 发光强度 |
|
||||
|
||||
## 粒子效果 (Niagara)
|
||||
|
||||
### NS_Supercomputer_Glow
|
||||
|
||||
```
|
||||
发射器设置:
|
||||
├─ 发射器类型: 粒子系统
|
||||
├─ 发射模式: 循环
|
||||
├─ 发射速率: 20 粒子/秒
|
||||
├─ 粒子寿命: 2.0 秒
|
||||
└─ 粒子大小: 50 → 200 cm
|
||||
|
||||
颜色渐变:
|
||||
├─ 0%: (1.0, 0.1, 0.1, 0.8) 红色
|
||||
├─ 50%: (1.0, 0.1, 0.1, 0.4)
|
||||
└─ 100%: (1.0, 0.1, 0.1, 0.0)
|
||||
|
||||
渲染:
|
||||
├─ 材质: M_Particle_Glow_Additive
|
||||
└─ 混合模式: Additive
|
||||
```
|
||||
|
||||
## UI 标签 (W_SupercomputerLabel)
|
||||
|
||||
### 组件结构
|
||||
|
||||
```
|
||||
W_SupercomputerLabel
|
||||
├── CanvasPanel
|
||||
│ ├── Background (黑色半透明背景)
|
||||
│ │ └── Size: 300x150
|
||||
│ │ └── Opacity: 0.8
|
||||
│ ├── NameText (名称)
|
||||
│ │ └── Text: "Frontier"
|
||||
│ │ └── Color: 白色
|
||||
│ │ └── Font Size: 18
|
||||
│ ├── CountryText (国家)
|
||||
│ │ └── Text: "🇺🇸 United States"
|
||||
│ │ └── Color: 浅灰色
|
||||
│ │ └── Font Size: 14
|
||||
│ ├── PerformancePanel (性能面板)
|
||||
│ │ ├── RmaxLabel
|
||||
│ │ │ └── Text: "Rmax"
|
||||
│ │ │ └── Color: 浅灰色
|
||||
│ │ ├── RmaxValue
|
||||
│ │ │ └── Text: "1,682.65 TFLOPS"
|
||||
│ │ │ └── Color: 亮红色
|
||||
│ │ │ └── Font Size: 24
|
||||
│ │ │ └── Font Weight: Bold
|
||||
│ │ ├── RpeakLabel
|
||||
│ │ │ └── Text: "Rpeak"
|
||||
│ │ ├── RpeakValue
|
||||
│ │ │ └── Text: "2,000.00 TFLOPS"
|
||||
│ │ │ └── Color: 灰色
|
||||
│ │ └── Font Size: 12
|
||||
│ ├── SpecsPanel (规格面板)
|
||||
│ │ ├── CoresText
|
||||
│ │ │ └── Text: "8,730,112 Cores"
|
||||
│ │ ├── NodesText
|
||||
│ │ │ └── Text: "76,032 Nodes"
|
||||
│ │ ├── InterconnectText
|
||||
│ │ │ └── Text: "InfiniBand HDR"
|
||||
│ │ └── VendorText
|
||||
│ │ └── Text: "HPE"
|
||||
│ └── LineSeparator (分隔线)
|
||||
│ └── Color: 红色
|
||||
```
|
||||
|
||||
## 数据格式
|
||||
|
||||
### 输入数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "top500_1",
|
||||
"name": "Frontier",
|
||||
"source": "top500",
|
||||
"data_type": "supercomputer",
|
||||
"location": {
|
||||
"latitude": 33.7756,
|
||||
"longitude": -84.3962,
|
||||
"altitude": 0
|
||||
},
|
||||
"country": "US",
|
||||
"city": "Atlanta",
|
||||
"metadata": {
|
||||
"rmax": 1682.65,
|
||||
"rpeak": 2000.00,
|
||||
"cores": 8730112,
|
||||
"nodes": 76032,
|
||||
"interconnect": "InfiniBand HDR",
|
||||
"operating_system": "Linux",
|
||||
"vendor": "HPE",
|
||||
"model": "ExaScale"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 性能格式化函数
|
||||
|
||||
### FormatPerformance (Float TFLOPS) → String
|
||||
|
||||
```
|
||||
如果 TFLOPS >= 1000000:
|
||||
返回 = FString::Printf(TEXT("%.2f EFLOPS"), TFLOPS / 1000000)
|
||||
否则如果 TFLOPS >= 1000:
|
||||
返回 = FString::Printf(TEXT("%.2f PFLOPS"), TFLOPS / 1000)
|
||||
否则:
|
||||
返回 = FString::Printf(TEXT("%.2f TFLOPS"), TFLOPS)
|
||||
```
|
||||
|
||||
### FormatNumber (Integer) → String
|
||||
|
||||
```
|
||||
如果 Number >= 1000000:
|
||||
返回 = FString::Printf(TEXT("%dM"), Number / 1000000)
|
||||
否则如果 Number >= 1000:
|
||||
返回 = FString::Printf(TEXT("%dK"), Number / 1000)
|
||||
否则:
|
||||
返回 = FString::Printf(TEXT("%d"), Number)
|
||||
```
|
||||
|
||||
## TOP500 前 10 名 (测试数据)
|
||||
|
||||
| 排名 | 名称 | 位置 | Rmax (PFLOPS) | 国家 |
|
||||
|------|------|------|---------------|------|
|
||||
| 1 | Frontier | 美国 | 1,682.65 | 🇺🇸 |
|
||||
| 2 | Aurora | 美国 | 1,206.00 | 🇺🇸 |
|
||||
| 3 | Eagle | 美国 | 561.00 | 🇺🇸 |
|
||||
| 4 | MareNostrum5 | 西班牙 | 175.00 | 🇪🇸 |
|
||||
| 5 | LUMI | 芬兰 | 151.90 | 🇫🇮 |
|
||||
| 6 | Leonardo | 意大利 | 148.70 | 🇮🇹 |
|
||||
| 7 | Summit | 美国 | 148.60 | 🇺🇸 |
|
||||
| 8 | Sierra | 美国 | 119.40 | 🇺🇸 |
|
||||
| 9 | Sunway TaihuLight | 中国 | 93.01 | 🇨🇳 |
|
||||
| 10 | Tianhe-2A | 中国 | 61.44 | 🇨🇳 |
|
||||
|
||||
## 交互效果
|
||||
|
||||
### 悬停效果 (OnHover)
|
||||
|
||||
```
|
||||
1. [播放] Niagara Burst (红色粒子)
|
||||
└─ 粒子数量: 30
|
||||
2. [播放] Sound "Hover_Enter"
|
||||
3. [设置] RingMesh.Visible = true
|
||||
4. [播放] Timeline "RingExpand"
|
||||
└─ 持续时间: 0.3秒
|
||||
5. [设置] WidgetPanel.Opacity = 1.0
|
||||
```
|
||||
|
||||
### 点击效果 (OnClick)
|
||||
|
||||
```
|
||||
1. [播放] Sound "Select"
|
||||
2. [播放] Timeline "Pulse"
|
||||
└─ 持续时间: 0.5秒
|
||||
└─ 缩放变化: 1.0x → 1.3x → 1.0x
|
||||
3. [调用] FocusCamera()
|
||||
```
|
||||
|
||||
### 聚焦相机 (FocusCamera)
|
||||
|
||||
```
|
||||
1. [获取] Self.Location → PointLoc
|
||||
2. [获取] BP_GlobeController.Camera
|
||||
3. [计算] CameraOffset = (0, 0, 500000)
|
||||
4. [调用] Camera.SetViewTargetWithBlend(PointLoc + CameraOffset)
|
||||
5. [播放] Camera Shake "Focus"
|
||||
```
|
||||
|
||||
## 颜色方案
|
||||
|
||||
| 性能级别 | 颜色 | RGB | 圆环颜色 |
|
||||
|----------|------|-----|----------|
|
||||
| > 1 EFLOPS | 暗红色 | (0.8, 0, 0) | 脉冲红 |
|
||||
| 500T - 1E | 红色 | (1.0, 0.1, 0.1) | 脉冲橙 |
|
||||
| 100T - 500T | 橙色 | (1.0, 0.4, 0.1) | 脉冲黄 |
|
||||
| < 100T | 黄色 | (1.0, 0.7, 0.1) | 脉冲白 |
|
||||
460
unreal/Content/Levels/Scene_Setup_Guide.md
Normal file
460
unreal/Content/Levels/Scene_Setup_Guide.md
Normal file
@@ -0,0 +1,460 @@
|
||||
# UE5 3D 大屏场景搭建完整指南
|
||||
|
||||
## 目录
|
||||
|
||||
1. [项目初始化](#项目初始化)
|
||||
2. [安装 Cesium 插件](#安装-cesium-插件)
|
||||
3. [创建主场景](#创建主场景)
|
||||
4. [配置光照](#配置光照)
|
||||
5. [设置相机](#设置相机)
|
||||
6. [添加蓝图组件](#添加蓝图组件)
|
||||
7. [配置后端连接](#配置后端连接)
|
||||
8. [测试运行](#测试运行)
|
||||
|
||||
---
|
||||
|
||||
## 项目初始化
|
||||
|
||||
### 步骤 1: 创建 UE5 项目
|
||||
|
||||
```
|
||||
1. 打开 Epic Games Launcher
|
||||
2. 选择 Unreal Engine 5.3+ (推荐 5.4)
|
||||
3. 点击 "New Project" → "Games"
|
||||
4. 选择 "Blank" 模板
|
||||
5. 设置:
|
||||
├─ 项目名: Planet
|
||||
├─ 位置: D:\games\Planet\
|
||||
├─ 目标: Desktop / Console
|
||||
├─ 质量: Maximum
|
||||
├─ -starter content: false
|
||||
└─ raytracing: false
|
||||
6. 点击 "Create Project"
|
||||
```
|
||||
|
||||
### 步骤 2: 项目设置
|
||||
|
||||
```
|
||||
Edit → Project Settings:
|
||||
|
||||
显示设置:
|
||||
├─ Render → Default Viewport:
|
||||
│ ├─ Fullscreen Mode: Windowed
|
||||
│ ├─ Resolution: 3840×2160 (4K)
|
||||
│ └─ Custom Near Clip Plane: 100
|
||||
├─ Input:
|
||||
│ ├─ Capture Mouse on Launch: true
|
||||
│ └─ Enable Click Events: true
|
||||
└─ Quality:
|
||||
└─ Shadow Quality: High
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 安装 Cesium 插件
|
||||
|
||||
### 方法 1: 通过 Marketplace (推荐)
|
||||
|
||||
```
|
||||
1. 打开 UE5 编辑器
|
||||
2. Edit → Plugins
|
||||
3. 搜索 "Cesium for Unreal"
|
||||
4. 点击 "Enable"
|
||||
5. 重启编辑器
|
||||
```
|
||||
|
||||
### 方法 2: 手动安装
|
||||
|
||||
```
|
||||
1. 从 GitHub 下载:
|
||||
https://github.com/CesiumGS/cesium-unreal/releases
|
||||
|
||||
2. 解压到:
|
||||
D:\games\Planet\unreal\Plugins\Cesium
|
||||
|
||||
3. 编辑uproject文件:
|
||||
{
|
||||
"Plugins": [
|
||||
{
|
||||
"Name": "Cesium",
|
||||
"Enabled": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
4. 右键 Planet.uproject → "Generate Visual Studio project files"
|
||||
5. 重新打开项目
|
||||
```
|
||||
|
||||
### 配置 Cesium ion Token
|
||||
|
||||
```
|
||||
Edit → Project Settings → Cesium:
|
||||
|
||||
1. Cesium ion:
|
||||
├─ Default Access Token: 粘贴你的 token
|
||||
│ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||
└─ Default Server: https://ion.cesium.com
|
||||
|
||||
2. Cesium World Terrain:
|
||||
├─ Enable: true
|
||||
├─ Ellipsoid: WGS84
|
||||
└─ Terrain Exaggeration: 1.0
|
||||
|
||||
3. Cesium OSM Buildings:
|
||||
├─ Enable: true
|
||||
└─ Style: Gray
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 创建主场景
|
||||
|
||||
### 步骤 1: 创建新关卡
|
||||
|
||||
```
|
||||
1. File → New Level → Default
|
||||
2. 删除默认的:
|
||||
├─ Floor
|
||||
├─ Wall_400
|
||||
├─ Wall_400x400
|
||||
└─ PlayerStart
|
||||
3. 保存为: Content/Levels/Main.umap
|
||||
4. 设置为启动关卡:
|
||||
Edit → Project Settings → Maps & Modes
|
||||
└─ Default Level Name: Main
|
||||
```
|
||||
|
||||
### 步骤 2: 添加 Cesium 组件
|
||||
|
||||
从 "Cesium" 面板拖入:
|
||||
|
||||
```
|
||||
1. CesiumGeoreference
|
||||
└─ 位置: (0, 0, 0)
|
||||
└─ 属性: 自动设置
|
||||
|
||||
2. CesiumWorldTerrain
|
||||
└─ 位置: (0, 0, 0)
|
||||
└─ 属性:
|
||||
├─ Enable Collision: false
|
||||
└─ Create Pawns: false
|
||||
|
||||
3. CesiumSunSky
|
||||
└─ 位置: (0, 0, 0)
|
||||
└─ 属性:
|
||||
├─ Use Solar Time: true
|
||||
└─ Solar Time: 2024-01-01 12:00:00
|
||||
```
|
||||
|
||||
### 步骤 3: 配置地球位置
|
||||
|
||||
```
|
||||
选中 CesiumGeoreference:
|
||||
|
||||
├─ Origin Location:
|
||||
│ ├─ Latitude: 0
|
||||
│ ├─ Longitude: 0
|
||||
│ └─ Height: 0
|
||||
│
|
||||
├─ Target Viewport:
|
||||
│ ├─ Width: 3840
|
||||
│ └─ Height: 2160
|
||||
│
|
||||
└─ Camera:
|
||||
└─ Default Camera Class: None
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 配置光照
|
||||
|
||||
### 步骤 1: 设置太阳光照
|
||||
|
||||
```
|
||||
选中 CesiumSunSky:
|
||||
|
||||
├─ Atmospheric Sun Light:
|
||||
│ └─ 指向 DirectionalLight_Sun
|
||||
│
|
||||
├─ Direction:
|
||||
│ ├─ Azimuth: 180
|
||||
│ └─ Altitude: 45
|
||||
│
|
||||
├─ Sky Light:
|
||||
│ └─ Sky Light Actor → SkyLight
|
||||
│
|
||||
└─ Atmospheric Fog:
|
||||
├─ Fog Density: 0.02
|
||||
├─ Fog Falloff: 0.2
|
||||
└─ Volumetric Fog: true
|
||||
```
|
||||
|
||||
### 步骤 2: 添加辅助光照
|
||||
|
||||
```
|
||||
1. 添加 DirectionalLight_Sun:
|
||||
├─ Intensity: 10 lux
|
||||
├─ Light Color: (1, 0.95, 0.8)
|
||||
└─ Cast Shadows: true
|
||||
|
||||
2. 添加 Skylight:
|
||||
├─ Intensity: 1.0
|
||||
├─ Color: (0.5, 0.7, 1.0)
|
||||
└─ Real-time Capture: false
|
||||
```
|
||||
|
||||
### 步骤 3: 后处理
|
||||
|
||||
```
|
||||
添加 PostProcessVolume (Unbound):
|
||||
|
||||
├─ Exposure:
|
||||
│ ├─ Min EV100: 10
|
||||
│ ├─ Max EV100: 20
|
||||
│ ├─ Speed Up: 2
|
||||
│ ├─ Speed Down: 2
|
||||
│ └─ Target EV100: 12
|
||||
│
|
||||
├─ Bloom:
|
||||
│ ├─ Intensity: 1.0
|
||||
│ ├─ Threshold: 1.0
|
||||
│ └─ Method: Convolution
|
||||
│
|
||||
├─ Color Grading:
|
||||
│ ├─ Saturation: (1, 1, 1)
|
||||
│ ├─ Contrast: 1.0
|
||||
│ └─ Gamma: 1.0
|
||||
│
|
||||
└─ Vignette:
|
||||
└─ Intensity: 0.5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 设置相机
|
||||
|
||||
### 步骤 1: 创建相机控制器
|
||||
|
||||
```
|
||||
创建 Blueprint: BP_CameraController (父类: Actor)
|
||||
|
||||
组件:
|
||||
├─ SceneRoot
|
||||
│ └─ SpringArm
|
||||
│ └─ Camera
|
||||
│
|
||||
变量:
|
||||
├─ TargetRadius: Float = 500000
|
||||
├─ ZoomSpeed: Float = 50000
|
||||
├─ RotateSpeed: Float = 1.0
|
||||
└─ bIsRotating: Boolean = false
|
||||
```
|
||||
|
||||
### 步骤 2: 配置相机移动
|
||||
|
||||
```
|
||||
输入绑定 (Edit → Project Settings → Input):
|
||||
|
||||
├─ Mouse X:
|
||||
│ └─ Event: Rotate Yaw
|
||||
│ └─ Add Controller Yaw Input × -1
|
||||
│
|
||||
├─ Mouse Y:
|
||||
│ └─ Event: Rotate Pitch
|
||||
│ └─ Add Controller Pitch Input × -1
|
||||
│
|
||||
├─ Mouse Wheel:
|
||||
│ └─ Event: Zoom
|
||||
│ ├─ Add Controller Zoom In (放大)
|
||||
│ └─ Add Controller Zoom Out (缩小)
|
||||
│
|
||||
└─ Right Mouse Button:
|
||||
├─ Event: 按下 → bIsRotating = true
|
||||
└─ Event: 松开 → bIsRotating = false
|
||||
```
|
||||
|
||||
### 步骤 3: 自动巡航
|
||||
|
||||
```
|
||||
创建 Timeline: AutoRotate
|
||||
|
||||
├─ 持续时间: 60秒
|
||||
├─ 循环: true
|
||||
└─ 曲线:
|
||||
0%: 0
|
||||
100%: 360
|
||||
|
||||
Tick Event:
|
||||
├─ 分支: bAutoRotate == true
|
||||
│ ├─ Play Timeline
|
||||
│ └─ Add Controller Yaw Output
|
||||
└─ 否则: 跳过
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 添加蓝图组件
|
||||
|
||||
### 步骤 1: 放置 GlobeController
|
||||
|
||||
```
|
||||
1. 从 Content Browser 拖入 BP_GlobeController
|
||||
2. 位置: (0, 0, 0)
|
||||
3. 确保 CesiumGeoreference 在其下
|
||||
```
|
||||
|
||||
### 步骤 2: 设置初始相机
|
||||
|
||||
```
|
||||
1. 在 World Outliner 中选择 Camera
|
||||
2. 设置位置:
|
||||
├─ X: 0
|
||||
├─ Y: -2000000
|
||||
└─ Z: 1000000
|
||||
3. 设置旋转:
|
||||
├─ Pitch: -30
|
||||
└─ Yaw: 0
|
||||
```
|
||||
|
||||
### 步骤 3: 配置数据管理器
|
||||
|
||||
```
|
||||
选中 BP_GlobeController:
|
||||
|
||||
├─ API_URL: http://localhost:8000
|
||||
├─ WS_URL: ws://localhost:8000/ws
|
||||
├─ UpdateInterval: 30.0
|
||||
├─ bAutoRotate: true
|
||||
└─ RotateSpeed: 0.5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 配置后端连接
|
||||
|
||||
### 步骤 1: 测试后端服务
|
||||
|
||||
```bash
|
||||
# 在 WSL 中启动后端
|
||||
cd /home/ray/dev/linkong/planet
|
||||
docker restart planet_backend_new
|
||||
|
||||
# 测试 API
|
||||
curl http://localhost:8000/api/v1/collected/summary
|
||||
```
|
||||
|
||||
### 步骤 2: 配置 CORS (如果需要)
|
||||
|
||||
```
|
||||
后端已配置 CORS:
|
||||
├─ http://localhost:3000
|
||||
├─ http://0.0.0.0:3000
|
||||
└─ http://frontend:3000
|
||||
```
|
||||
|
||||
### 步骤 3: 测试 WebSocket
|
||||
|
||||
```
|
||||
在 UE5 蓝图中:
|
||||
|
||||
1. 创建 WebSocket 连接
|
||||
└─ URL: ws://localhost:8000/ws
|
||||
|
||||
2. 发送订阅消息:
|
||||
{
|
||||
"action": "subscribe",
|
||||
"channels": ["updates", "alarms"]
|
||||
}
|
||||
|
||||
3. 监听消息并处理
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 测试运行
|
||||
|
||||
### 步骤 1: 编译蓝图
|
||||
|
||||
```
|
||||
1. 点击工具栏 "Compile" 按钮
|
||||
2. 检查错误日志
|
||||
3. 修复任何错误
|
||||
```
|
||||
|
||||
### 步骤 2: 运行测试
|
||||
|
||||
```
|
||||
1. 点击 "Play" 按钮
|
||||
2. 检查:
|
||||
├─ 地球是否正常显示
|
||||
├─ Cesium 地形是否加载
|
||||
├─ 太阳光照是否正确
|
||||
└─ 相机控制是否工作
|
||||
|
||||
3. 打开输出日志检查错误
|
||||
```
|
||||
|
||||
### 步骤 3: 打包发布
|
||||
|
||||
```
|
||||
1. File → Package Project → Windows (64-bit)
|
||||
2. 选择输出目录: D:\games\Planet\Dist\
|
||||
3. 等待打包完成
|
||||
4. 测试打包后的可执行文件
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: Cesium 地形不显示
|
||||
|
||||
```
|
||||
解决方案:
|
||||
1. 检查 Cesium ion Token 是否正确
|
||||
2. 检查网络连接
|
||||
3. 确认 CesiumWorldTerrain 已启用
|
||||
4. 查看输出日志错误信息
|
||||
```
|
||||
|
||||
### Q2: 相机控制不工作
|
||||
|
||||
```
|
||||
解决方案:
|
||||
1. 确保 PlayerController 启用输入
|
||||
2. 检查输入绑定是否正确
|
||||
3. 确认相机组件已附加
|
||||
4. 检查是否有其他 Actor 捕获输入
|
||||
```
|
||||
|
||||
### Q3: WebSocket 连接失败
|
||||
|
||||
```
|
||||
解决方案:
|
||||
1. 检查后端服务是否运行
|
||||
2. 确认 CORS 配置正确
|
||||
3. 检查防火墙设置
|
||||
4. 验证 URL 格式正确
|
||||
```
|
||||
|
||||
### Q4: 性能问题
|
||||
|
||||
```
|
||||
解决方案:
|
||||
1. 降低渲染分辨率
|
||||
2. 禁用不必要的特效
|
||||
3. 减少粒子数量
|
||||
4. 使用 LOD
|
||||
5. 启用虚拟纹理
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 下一步
|
||||
|
||||
1. **添加数据点** - 创建 BP_Supercomputer 实例
|
||||
2. **添加海缆** - 创建 BP_SubmarineCable 实例
|
||||
3. **添加数据流** - 创建 BP_DataFlow 实例
|
||||
4. **配置 UI** - 添加 W_MainHUD 等界面
|
||||
5. **优化性能** - 根据实际运行调整
|
||||
314
unreal/Content/Materials/Materials_Spec.md
Normal file
314
unreal/Content/Materials/Materials_Spec.md
Normal file
@@ -0,0 +1,314 @@
|
||||
# 材质规格完整参考
|
||||
|
||||
## 目录
|
||||
|
||||
1. [M_Globe 地球材质](#m_globe-地球材质)
|
||||
2. [M_DataPoint 数据点材质](#m_datapoint-数据点材质)
|
||||
3. [M_Supercomputer 超算材质](#m_supercomputer-超算材质)
|
||||
4. [M_Cable 光缆材质](#m_cable-光缆材质)
|
||||
5. [M_DataFlow 数据流材质](#m_dataplow-数据流材质)
|
||||
6. [M_Particle 粒子材质](#m_particle-粒子材质)
|
||||
|
||||
---
|
||||
|
||||
## M_Globe 地球材质
|
||||
|
||||
### 基础信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 材质类型 | Surface |
|
||||
| 着色模型 | Default Lit |
|
||||
| 混合模式 | Opaque |
|
||||
| 路径 | `Content/Materials/M_Globe.uasset` |
|
||||
|
||||
### 材质参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 | 使用位置 |
|
||||
|------|------|--------|------|----------|
|
||||
| `DayTexture` | Texture2D | Earth_Day | 白天纹理 | Base Color |
|
||||
| `NightTexture` | Texture2D | Earth_Night | 夜间纹理 | Emissive |
|
||||
| `CloudsTexture` | Texture2D | Earth_Clouds | 云层纹理 | Opacity |
|
||||
| `NormalMap` | Texture2D | Earth_Normal | 法线贴图 | Normal |
|
||||
| `SpecularMap` | Texture2D | Earth_Specular | 高光贴图 | Specular |
|
||||
| `EmissiveStrength` | Float | `1.0` | 自发光强度 | Emissive |
|
||||
| `CloudOpacity` | Float | `0.5` | 云层透明度 | Opacity |
|
||||
| `RotationSpeed` | Float | `0.1` | 旋转速度 | Time |
|
||||
| `NightThreshold` | Float | `0.3` | 夜间阈值 | LightSensor |
|
||||
|
||||
### 节点网络
|
||||
|
||||
```
|
||||
1. Time → Multiply → RotationSpeed → Rotator → DayTexture UV
|
||||
2. LightVector → DotProduct → NightThreshold → Step
|
||||
3. Step → Lerp → NightTexture → Emissive
|
||||
4. Time → Panner → CloudsTexture UV
|
||||
5. CloudsTexture → Opacity Mask
|
||||
```
|
||||
|
||||
### 效果说明
|
||||
|
||||
```
|
||||
白天效果:
|
||||
├─ 显示 DayTexture
|
||||
├─ 标准光照
|
||||
└─ 无自发光
|
||||
|
||||
夜间效果:
|
||||
├─ 显示 NightTexture
|
||||
├─ 关闭直射光照
|
||||
└─ 启用自发光 (城市灯光)
|
||||
|
||||
云层效果:
|
||||
├─ 半透明云层覆盖
|
||||
├─ 云层缓慢移动
|
||||
└─ 根据太阳位置变化
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## M_DataPoint 数据点材质
|
||||
|
||||
### 基础信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 材质类型 | Surface |
|
||||
| 着色模型 | Unlit |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Materials/M_DataPoint.uasset` |
|
||||
|
||||
### 材质参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `BaseColor` | Vector3 | (1.0, 0.2, 0.2) | 基础颜色 |
|
||||
| `EmissiveStrength` | Float | `10.0` | 自发光强度 |
|
||||
| `PulseSpeed` | Float | `1.0` | 脉冲速度 |
|
||||
| `PulseIntensity` | Float | `0.5` | 脉冲强度 |
|
||||
| `FresnelPower` | Float | `2.0` | 菲涅尔强度 |
|
||||
| `GlowRadius` | Float | `50.0` | 发光半径 |
|
||||
| `AlphaMask` | ScalarParameter | `1.0` | 透明度遮罩 |
|
||||
|
||||
### 节点网络
|
||||
|
||||
```
|
||||
1. ObjectPosition → WorldPosition
|
||||
2. CameraPosition → Subtract → Normalize → FresnelEffect
|
||||
3. FresnelEffect → Power → FresnelPower → Multiply → EmissiveStrength
|
||||
|
||||
4. Time → Multiply → PulseSpeed → Sine → Add → 1.0
|
||||
5. Multiply → PulseIntensity → Multiply → EmissiveColor
|
||||
|
||||
6. FresnelOutput × PulseOutput → FinalEmissive
|
||||
```
|
||||
|
||||
### 菲涅尔效果
|
||||
|
||||
```
|
||||
边缘发光:
|
||||
├─ 视角与表面法线夹角越大
|
||||
├─ 发光越强
|
||||
└─ 中心透明,边缘发光
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## M_Supercomputer 超算材质
|
||||
|
||||
### 基础信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 材质类型 | Surface |
|
||||
| 着色模型 | Unlit |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Materials/M_Supercomputer.uasset` |
|
||||
|
||||
### 材质参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `CoreColor` | Vector3 | (1.0, 0.1, 0.1) | 核心颜色 |
|
||||
| `RingColor` | Vector3 | (1.0, 0.3, 0.1) | 圆环颜色 |
|
||||
| `CoreEmissive` | Float | `15.0` | 核心发光 |
|
||||
| `RingEmissive` | Float | `5.0` | 圆环发光 |
|
||||
| `RingPulseSpeed` | Float | `1.0` | 圆环脉冲 |
|
||||
| `RingWidth` | Float | `0.02` | 圆环宽度 |
|
||||
| `PerformanceFactor` | Float | `1.0` | 性能因子 |
|
||||
|
||||
### 节点网络
|
||||
|
||||
```
|
||||
核心球体:
|
||||
1. FresnelEffect → Power(2.5) → Multiply → CoreEmissive
|
||||
2. CoreColor × CoreEmissive → CoreOutput
|
||||
|
||||
扩散圆环:
|
||||
1. Time × RingPulseSpeed → Sine
|
||||
2. Sine + 0.5 → SineWidth
|
||||
3. RingWidth × SineWidth → RingWidthOutput
|
||||
4. RingColor × RingEmissive × RingWidthOutput → RingOutput
|
||||
|
||||
最终输出:
|
||||
CoreOutput + RingOutput → EmissiveColor
|
||||
```
|
||||
|
||||
### 性能颜色映射
|
||||
|
||||
| 性能范围 | 核心颜色 | RGB |
|
||||
|----------|----------|-----|
|
||||
| > 1 EFLOPS | 暗红 | (0.8, 0, 0) |
|
||||
| 500T - 1E | 红色 | (1.0, 0.1, 0.1) |
|
||||
| 100T - 500T | 橙色 | (1.0, 0.4, 0.1) |
|
||||
| < 100T | 黄色 | (1.0, 0.7, 0.1) |
|
||||
|
||||
---
|
||||
|
||||
## M_Cable 光缆材质
|
||||
|
||||
### 基础信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 材质类型 | Surface |
|
||||
| 着色模型 | Default Lit |
|
||||
| 混合模式 | Opaque |
|
||||
| 路径 | `Content/Materials/M_Cable.uasset` |
|
||||
|
||||
### 材质参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `BaseColor` | Vector3 | (1.0, 0.8, 0.0) | 金黄色 |
|
||||
| `Metallic` | Float | `0.8` | 金属度 |
|
||||
| `Roughness` | Float | `0.3` | 粗糙度 |
|
||||
| `EmissiveStrength` | Float | `2.0` | 自发光强度 |
|
||||
| `FlowDirection` | Float | `1.0` | 流向 (1=正向) |
|
||||
| `FlowSpeed` | Float | `1.0` | 流动速度 |
|
||||
| `BandwidthColor` | Vector3 | (0.2, 1.0, 0.2) | 带宽颜色 |
|
||||
|
||||
### 节点网络
|
||||
|
||||
```
|
||||
基础属性:
|
||||
1. BaseColor → BaseColor
|
||||
2. Metallic → Metallic
|
||||
3. Roughness → Roughness
|
||||
|
||||
流动效果:
|
||||
1. Time × FlowSpeed → Panner UV
|
||||
2. NoiseTexture → Panner → FlowPattern
|
||||
3. FlowPattern × EmissiveStrength → FlowEmissive
|
||||
|
||||
最终:
|
||||
BaseColor + FlowEmissive → EmissiveColor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## M_DataFlow 数据流材质
|
||||
|
||||
### 基础信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 材质类型 | Surface |
|
||||
| 着色模型 | Unlit |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Materials/M_DataFlow.uasset` |
|
||||
|
||||
### 材质参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `FlowColor` | Vector4 | (0.2, 0.6, 1.0, 1.0) | 流动颜色 |
|
||||
| `LineWidth` | Float | `100.0` | 线宽度 |
|
||||
| `FlowSpeed` | Float | `1.0` | 流动速度 |
|
||||
| `FlowIntensity` | Float | `0.8` | 流动强度 |
|
||||
| `HeadLength` | Float | `0.2` | 头部长度 |
|
||||
| `TailFade` | Float | `0.5` | 尾部渐隐 |
|
||||
|
||||
### 节点网络
|
||||
|
||||
```
|
||||
1. TextureCoordinates → FlowUV
|
||||
2. Time × FlowSpeed → Panner → FlowOffset
|
||||
3. FlowUV + FlowOffset → FlowPattern
|
||||
|
||||
4. FlowPattern × HeadLength → HeadMask
|
||||
5. 1 - FlowPattern × TailFade → TailMask
|
||||
|
||||
6. FlowColor × HeadMask × TailMask × FlowIntensity → Emissive
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## M_Particle 粒子材质
|
||||
|
||||
### 基础信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 材质类型 | User Interface / Transparent |
|
||||
| 着色模型 | Unlit |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Materials/M_Particle.uasset` |
|
||||
|
||||
### 材质参数
|
||||
|
||||
| 参数 | 类型 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `ParticleColor` | LinearColor | (1.0, 1.0, 1.0, 1.0) | 粒子颜色 |
|
||||
| `Softness` | Float | `0.5` | 柔和度 |
|
||||
| `GlowCenter` | Float | `0.5` | 发光中心 |
|
||||
| `GlowFalloff` | Float | `2.0` | 发光衰减 |
|
||||
|
||||
### 节点网络
|
||||
|
||||
```
|
||||
1. TextureCoordinates (UV)
|
||||
2. UV - 0.5 → CenterUV
|
||||
3. Length(CenterUV) → DistanceFromCenter
|
||||
4. DistanceFromCenter × 2 → NormalizedDistance
|
||||
5. 1 - NormalizedDistance × GlowFalloff → GlowStrength
|
||||
6. Softness × GlowStrength → SoftGlow
|
||||
|
||||
7. ParticleColor × SoftGlow × ParticleOpacity → Emissive
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 材质使用指南
|
||||
|
||||
### 创建新材质
|
||||
|
||||
```
|
||||
1. 右键 Content Browser → Material → Basic → M_Name
|
||||
2. 设置材质属性:
|
||||
├─ Material Domain: Surface
|
||||
├─ Blend Mode: Opaque/Additive/Transparent
|
||||
└─ Shading Model: Default Lit/Unlit
|
||||
3. 创建参数 (Material Parameter Collection)
|
||||
4. 保存并编译
|
||||
```
|
||||
|
||||
### 材质实例
|
||||
|
||||
```
|
||||
创建实例 (右击材质 → Create Material Instance):
|
||||
├─ 可在蓝图中动态修改参数
|
||||
├─ 支持材质覆盖
|
||||
└─ 便于批量管理
|
||||
```
|
||||
|
||||
### 性能优化
|
||||
|
||||
```
|
||||
材质优化技巧:
|
||||
├─ 减少 Texture Sample 数量
|
||||
├─ 使用 LOD
|
||||
├─ 禁用不必要的计算
|
||||
├─ 简化节点网络
|
||||
└─ 使用材质参数而非硬编码
|
||||
```
|
||||
384
unreal/Content/Particles/Niagara_Spec.md
Normal file
384
unreal/Content/Particles/Niagara_Spec.md
Normal file
@@ -0,0 +1,384 @@
|
||||
# Niagara 粒子系统规格
|
||||
|
||||
## 目录
|
||||
|
||||
1. [NS_DataPoint_Glow 数据点光环](#ns_datapoint_glow-数据点光环)
|
||||
2. [NS_Supercomputer_Glow 超算光环](#ns_supercomputer_glow-超算光环)
|
||||
3. [NS_DataFlow_Directional 流向粒子](#ns_dataflow_directional-流向粒子)
|
||||
4. [NS_Alarm_Flash 告警闪烁](#ns_alarm_flash-告警闪烁)
|
||||
5. [NS_Ambient_Ambience 环境粒子](#ns_ambient_ambience-环境粒子)
|
||||
|
||||
---
|
||||
|
||||
## NS_DataPoint_Glow 数据点光环
|
||||
|
||||
### 系统信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 系统类型 | Emitter |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Particles/NS_DataPoint_Glow.uasset` |
|
||||
|
||||
### 发射器配置
|
||||
|
||||
| 配置项 | 值 | 说明 |
|
||||
|--------|-----|------|
|
||||
| Emitter Type | Sprite | 精灵粒子 |
|
||||
| Start Method | Owner | 所有者位置 |
|
||||
| Loop | true | 循环播放 |
|
||||
| Min Loop Count | 0 | 无最小限制 |
|
||||
| Max Loop Count | -1 | 无最大限制 |
|
||||
|
||||
### 粒子初始化
|
||||
|
||||
| 属性 | 值 | 说明 |
|
||||
|------|-----|------|
|
||||
| Sprite Size | 50 → 200 cm | 渐变大小 |
|
||||
| Sprite Rotation | 0 → 360 | 随机旋转 |
|
||||
| Color | (1, 0.2, 0.2, 0.8) | 红色 |
|
||||
| Lifetime | 1.5 秒 | 粒子寿命 |
|
||||
|
||||
### 粒子更新
|
||||
|
||||
```
|
||||
缩放渐变:
|
||||
├─ Start: 50 cm
|
||||
├─ End: 200 cm
|
||||
└─ Scale: 线性插值
|
||||
|
||||
颜色渐变:
|
||||
├─ 0%: (1, 0.2, 0.2, 0.8)
|
||||
├─ 50%: (1, 0.2, 0.2, 0.4)
|
||||
└─ 100%: (1, 0.2, 0.2, 0)
|
||||
|
||||
物理:
|
||||
├─ Velocity: (0, 0, 10) cm/s
|
||||
└─ Drag: 1.0
|
||||
```
|
||||
|
||||
### 发射速率
|
||||
|
||||
```
|
||||
├─ Rate: 30 粒子/秒
|
||||
├─ Bursts: 无
|
||||
└─ Scale Factor: 1.0
|
||||
```
|
||||
|
||||
### 渲染
|
||||
|
||||
```
|
||||
├─ Material: M_Particle_Glow
|
||||
├─ Sort: 距离排序
|
||||
└─ Enable GPU Simulation: false
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## NS_Supercomputer_Glow 超算光环
|
||||
|
||||
### 系统信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 系统类型 | Emitter |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Particles/NS_Supercomputer_Glow.uasset` |
|
||||
|
||||
### 发射器配置
|
||||
|
||||
| 配置项 | 值 | 说明 |
|
||||
|--------|-----|------|
|
||||
| Emitter Type | Sprite | 精灵粒子 |
|
||||
| Start Method | Owner | 所有者位置 |
|
||||
| Loop | true | 循环播放 |
|
||||
| Orbit | true | 轨道运动 |
|
||||
|
||||
### 粒子初始化
|
||||
|
||||
| 属性 | 值 | 说明 |
|
||||
|------|------|------|
|
||||
| Sprite Size | 100 → 300 cm | 渐变大小 |
|
||||
| Color | (1.0, 0.1, 0.1, 1.0) | 红色 |
|
||||
| Lifetime | 2.0 秒 | 粒子寿命 |
|
||||
| RotationSpeed | 10 deg/s | 旋转速度 |
|
||||
|
||||
### 粒子更新
|
||||
|
||||
```
|
||||
轨道运动:
|
||||
├─ Pivot: Center
|
||||
├─ Radius: 150 cm
|
||||
└─ RotationSpeed: 30 deg/s
|
||||
|
||||
缩放:
|
||||
├─ Start: 100 cm
|
||||
├─ Mid: 300 cm
|
||||
└─ End: 100 cm
|
||||
|
||||
颜色:
|
||||
├─ 0%: (1.0, 0.1, 0.1, 1.0)
|
||||
├─ 50%: (1.0, 0.1, 0.1, 0.5)
|
||||
└─ 100%: (1.0, 0.1, 0.1, 0)
|
||||
```
|
||||
|
||||
### 发射速率
|
||||
|
||||
```
|
||||
├─ Rate: 20 粒子/秒
|
||||
├─ Bursts:
|
||||
│ └─ Time: 0s, Count: 5, Increment: 2
|
||||
└─ Scale Factor: 1.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## NS_DataFlow_Directional 流向粒子
|
||||
|
||||
### 系统信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 系统类型 | Emitter |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Particles/NS_DataFlow_Directional.uasset` |
|
||||
|
||||
### 发射器配置
|
||||
|
||||
| 配置项 | 值 | 说明 |
|
||||
|--------|-----|------|
|
||||
| Emitter Type | Sprite | 精灵粒子 |
|
||||
| Start Method | Spline | 沿样条路径 |
|
||||
| Loop | true | 循环播放 |
|
||||
|
||||
### 参数接口
|
||||
|
||||
| 参数名 | 类型 | 默认值 | 说明 |
|
||||
|--------|------|--------|------|
|
||||
| `User.FlowColor` | LinearColor | (0.2, 0.6, 1.0, 1) | 粒子颜色 |
|
||||
| `User.Speed` | Float | `100.0` | 粒子速度 |
|
||||
| `User.Lifetime` | Float | `3.0` | 粒子寿命 |
|
||||
| `User.Size` | Float | `50.0` | 粒子大小 |
|
||||
| `User.Density` | Float | `1.0` | 粒子密度 |
|
||||
|
||||
### 粒子初始化
|
||||
|
||||
```
|
||||
Sprite Size: User.Size → User.Size × 1.5
|
||||
Color: User.FlowColor
|
||||
Lifetime: User.Lifetime
|
||||
RotationSpeed: 180 deg/s
|
||||
```
|
||||
|
||||
### 粒子更新
|
||||
|
||||
```
|
||||
沿路径移动:
|
||||
├─ 位置: 沿样条插值
|
||||
├─ 速度: User.Speed
|
||||
└─ 方向: 样条切线方向
|
||||
|
||||
颜色渐变:
|
||||
├─ 0%: User.FlowColor × 1.0
|
||||
├─ 50%: User.FlowColor × 0.8
|
||||
└─ 100%: User.FlowColor × 0.0
|
||||
|
||||
缩放渐变:
|
||||
├─ Start: User.Size
|
||||
└─ End: User.Size × 1.5
|
||||
```
|
||||
|
||||
### 发射速率
|
||||
|
||||
```
|
||||
├─ Rate: 100 × User.Density 粒子/秒
|
||||
├─ 方法: Time Divided
|
||||
└─ Scale Factor: 1.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## NS_Alarm_Flash 告警闪烁
|
||||
|
||||
### 系统信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 系统类型 | Emitter |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Particles/NS_Alarm_Flash.uasset` |
|
||||
|
||||
### 发射器配置
|
||||
|
||||
| 配置项 | 值 | 说明 |
|
||||
|--------|-----|------|
|
||||
| Emitter Type | Sprite | 精灵粒子 |
|
||||
| Start Method | Owner | 所有者位置 |
|
||||
| Loop | true | 循环播放 |
|
||||
|
||||
### 粒子初始化
|
||||
|
||||
| 属性 | 值 | 说明 |
|
||||
|------|------|------|
|
||||
| Sprite Size | 500 → 2000 cm | 渐变大小 |
|
||||
| Color | (1.0, 0.0, 0.0, 1.0) | 红色 |
|
||||
| Lifetime | 0.5 秒 | 粒子寿命 |
|
||||
|
||||
### 粒子更新
|
||||
|
||||
```
|
||||
缩放:
|
||||
├─ Start: 500 cm
|
||||
├─ End: 2000 cm
|
||||
└─ Scale: 指数
|
||||
|
||||
颜色:
|
||||
├─ 0%: (1.0, 0.0, 0.0, 1.0)
|
||||
├─ 50%: (1.0, 0.0, 0.0, 0.5)
|
||||
└─ 100%: (1.0, 0.0, 0.0, 0)
|
||||
```
|
||||
|
||||
### 发射配置
|
||||
|
||||
```
|
||||
├─ Rate: 2 粒子/秒
|
||||
├─ Bursts:
|
||||
│ └─ Time: 0s, Count: 1
|
||||
├─ Scale Factor: 1.0
|
||||
└─ 闪烁频率: 2 Hz
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## NS_Ambient_Ambience 环境粒子
|
||||
|
||||
### 系统信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| 系统类型 | Emitter |
|
||||
| 混合模式 | Additive |
|
||||
| 路径 | `Content/Particles/NS_Ambient_Ambience.uasset` |
|
||||
|
||||
### 发射器配置
|
||||
|
||||
| 配置项 | 值 | 说明 |
|
||||
|--------|-----|------|
|
||||
| Emitter Type | Sprite | 精灵粒子 |
|
||||
| Start Method | Box | 盒体范围 |
|
||||
| Loop | true | 循环播放 |
|
||||
|
||||
### 发射范围
|
||||
|
||||
```
|
||||
Box Extents: (50000, 50000, 50000) cm
|
||||
├─ X: -50000 → 50000
|
||||
├─ Y: -50000 → 50000
|
||||
└─ Z: 0 → 100000
|
||||
```
|
||||
|
||||
### 粒子初始化
|
||||
|
||||
```
|
||||
Sprite Size: 5 → 15 cm
|
||||
Color: (0.5, 0.5, 1.0, 0.1)
|
||||
Lifetime: 5 → 10 秒
|
||||
RotationSpeed: -10 → 10 deg/s
|
||||
```
|
||||
|
||||
### 粒子更新
|
||||
|
||||
```
|
||||
速度场:
|
||||
├─ Constant: (0, 0, 5) cm/s
|
||||
└─ Curl Noise: 启用
|
||||
|
||||
颜色:
|
||||
├─ 0%: (0.5, 0.5, 1.0, 0.1)
|
||||
└─ 100%: (0.5, 0.5, 1.0, 0.0)
|
||||
```
|
||||
|
||||
### 发射配置
|
||||
|
||||
```
|
||||
├─ Rate: 50 粒子/秒
|
||||
├─ 方法: Time Divided
|
||||
└─ Scale Factor: 1.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Niagara 模块参考
|
||||
|
||||
### 常用模块
|
||||
|
||||
| 模块 | 用途 |
|
||||
|------|------|
|
||||
| `Sprite Renderer` | 精灵渲染 |
|
||||
| `Mesh Renderer` | 网格渲染 |
|
||||
| `Emitter State` | 发射器状态 |
|
||||
| `Spawn Rate` | 生成速率 |
|
||||
| `Spawn Burst Instant` | 爆发生成 |
|
||||
| `Particle State` | 粒子状态 |
|
||||
| `Kill Particle` | 杀死粒子 |
|
||||
| `Color` | 颜色 |
|
||||
| `Scale Sprite Size` | 精灵缩放 |
|
||||
| `Add Velocity` | 添加速度 |
|
||||
| `Velocity From Point` | 从点速度 |
|
||||
| `Curl Noise Force` | 卷曲噪点力 |
|
||||
| `Drag` | 阻力 |
|
||||
| `Limit Velocity` | 限制速度 |
|
||||
| `Position` | 位置 |
|
||||
| `Rotation` | 旋转 |
|
||||
| `Rotation Rate` | 旋转速度 |
|
||||
|
||||
### 常用设置
|
||||
|
||||
```
|
||||
GPU Simulation:
|
||||
├─ Enable: false (建议)
|
||||
├─ Supports GPU: true
|
||||
└─ Requires persistent IDs: false
|
||||
|
||||
Determism:
|
||||
├─ Deterministic: false
|
||||
└─ Pooling Method: eager
|
||||
|
||||
Scalability:
|
||||
├─ Max Active Particles: 10000
|
||||
└─ Max Time: 60s
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 粒子数量限制
|
||||
|
||||
```
|
||||
远距离:
|
||||
├─ Max Particles: 100
|
||||
├─ Cull Distance: 50000 cm
|
||||
└─ Scale Factor: 0.1
|
||||
|
||||
中距离:
|
||||
├─ Max Particles: 500
|
||||
├─ Cull Distance: 20000 cm
|
||||
└─ Scale Factor: 0.5
|
||||
|
||||
近距离:
|
||||
├─ Max Particles: 2000
|
||||
├─ Cull Distance: 5000 cm
|
||||
└─ Scale Factor: 1.0
|
||||
```
|
||||
|
||||
### 优化建议
|
||||
|
||||
```
|
||||
1. 使用 GPU Simulation (如果显卡支持)
|
||||
2. 减少粒子数量
|
||||
3. 简化粒子行为
|
||||
4. 禁用不必要的效果
|
||||
5. 使用 LOD
|
||||
6. 定期清理粒子
|
||||
```
|
||||
154
unreal/QUICK_START.md
Normal file
154
unreal/QUICK_START.md
Normal file
@@ -0,0 +1,154 @@
|
||||
# UE5 项目快速启动指南
|
||||
|
||||
## 已配置内容
|
||||
|
||||
✅ **Cesium ion Token** - 已配置
|
||||
- Token: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...`
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
unreal/
|
||||
├── Config/
|
||||
│ └── PlanetConfig.ini # Cesium ion 配置
|
||||
├── Content/
|
||||
│ ├── Blueprints/ # 蓝图文件 (在 UE5 中创建)
|
||||
│ ├── Materials/ # 材质文件
|
||||
│ ├── Widgets/ # UI 控件
|
||||
│ └── Levels/ # 关卡文件
|
||||
└── Source/
|
||||
└── PlanetAPI/ # C++ 源码 (在 UE5 中编译)
|
||||
```
|
||||
|
||||
## 启动步骤
|
||||
|
||||
### 1. 创建 UE5 项目
|
||||
|
||||
```bash
|
||||
# 方式一: 从 Epic Games Launcher
|
||||
# 1. 打开 Epic Games Launcher
|
||||
# 2. 选择 Unreal Engine 5.3+
|
||||
# 3. 点击 "Games" → "Blank" → "Blueprint"
|
||||
# 4. 创建名为 "Planet" 的项目
|
||||
# 5. 将项目保存到 /home/ray/dev/linkong/planet/unreal/
|
||||
```
|
||||
|
||||
### 2. 安装 Cesium 插件
|
||||
|
||||
在 UE5 编辑器中:
|
||||
1. 打开 **Edit** → **Plugins**
|
||||
2. 搜索 **Cesium for Unreal**
|
||||
3. 点击 **Enable**
|
||||
4. 重启编辑器
|
||||
|
||||
### 3. 配置 Cesium ion Token
|
||||
|
||||
**方式 A: 通过 UE5 编辑器**
|
||||
1. 打开 **Edit** → **Project Settings**
|
||||
2. 搜索 **Cesium**
|
||||
3. 在 **Cesium ion** 部分输入 Token:
|
||||
```
|
||||
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI4YWFhYTQ5Zi02YTBlLTRhNmYtOTYyZC02NjgyYzQwMWY1YmMiLCJpZCI6Mzg5NDMzLCJpYXQiOjE3NzA3ODE1ODN9.yF-06K39B_8SkwMCQVuztAwdXDlRlumT33TVOYhQGqs
|
||||
```
|
||||
|
||||
**方式 B: 通过配置文件**
|
||||
- 配置文件已保存到: `Config/PlanetConfig.ini`
|
||||
|
||||
### 4. 创建主场景
|
||||
|
||||
1. 在 UE5 中创建新关卡: **File** → **New Level** → **Default**
|
||||
2. 从 **Cesium** 面板拖入 **Cesium World Terrain**
|
||||
3. 添加 **Cesium Sun Sky**
|
||||
4. 保存为 `Content/Levels/Main.umap`
|
||||
|
||||
### 5. 创建数据可视化蓝图
|
||||
|
||||
创建以下蓝图类 (在 UE5 中):
|
||||
|
||||
| 蓝图类 | 用途 |
|
||||
|--------|------|
|
||||
| BP_GlobeController | 地球控制器,管理 Cesium |
|
||||
| BP_Supercomputer | TOP500 超算标记 |
|
||||
| BP_GPUCluster | GPU 集群标记 |
|
||||
| BP_SubmarineCable | 海缆连接线 |
|
||||
| BP_DataFlow | 数据流向粒子 |
|
||||
|
||||
### 6. 连接后端 API
|
||||
|
||||
在蓝图中使用 HTTP 请求获取数据:
|
||||
|
||||
```cpp
|
||||
// HTTP 请求示例 (在 UE5 蓝图中使用 HTTP Client 节点)
|
||||
GET http://localhost:8000/api/v1/collected?source=top500
|
||||
```
|
||||
|
||||
WebSocket 实时更新:
|
||||
```
|
||||
ws://localhost:8000/ws
|
||||
```
|
||||
|
||||
## 数据格式
|
||||
|
||||
### TOP500 超算数据
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "top500_1",
|
||||
"name": "Frontier",
|
||||
"location": {
|
||||
"latitude": 33.7756,
|
||||
"longitude": -84.3962,
|
||||
"altitude": 0
|
||||
},
|
||||
"performance": 1682.65,
|
||||
"cores": 8730112,
|
||||
"country": "US"
|
||||
}
|
||||
```
|
||||
|
||||
### 海缆数据
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "cable_1",
|
||||
"name": "SEA-ME-WE 4",
|
||||
"path": [
|
||||
{"latitude": 1.3521, "longitude": 103.8198},
|
||||
{"latitude": 3.1390, "longitude": 101.6869}
|
||||
],
|
||||
"bandwidth": 1000
|
||||
}
|
||||
```
|
||||
|
||||
## 快速测试
|
||||
|
||||
1. 启动后端服务:
|
||||
```bash
|
||||
cd /home/ray/dev/linkong/planet
|
||||
docker restart planet_backend_new
|
||||
```
|
||||
|
||||
2. 打开 UE5 项目
|
||||
|
||||
3. 在蓝图中添加 HTTP 请求获取数据
|
||||
|
||||
4. 在场景中放置数据标记
|
||||
|
||||
5. 运行并测试
|
||||
|
||||
## 注意事项
|
||||
|
||||
⚠️ **Token 安全**:
|
||||
- 你的 Cesium ion token 已保存在配置文件中
|
||||
- 建议不要将 token 上传到公开的代码仓库
|
||||
- 可以通过环境变量管理敏感信息
|
||||
|
||||
⚠️ **UE5 系统要求**:
|
||||
- Windows 10/11 64-bit
|
||||
- 16GB RAM (建议 32GB+)
|
||||
- 支持 DirectX 12 的显卡
|
||||
- 100GB SSD 存储
|
||||
|
||||
## 下一步
|
||||
|
||||
详细开发文档: `docs/ue5_development_plan.md`
|
||||
247
unreal/README.md
Normal file
247
unreal/README.md
Normal file
@@ -0,0 +1,247 @@
|
||||
# UE5 智能星球可视化项目 - 完整文档索引
|
||||
|
||||
## 项目概览
|
||||
|
||||
本项目为"智能星球计划"的 UE5 3D 可视化大屏客户端,用于展示全球态势感知数据。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
unreal/
|
||||
├── Config/
|
||||
│ └── PlanetConfig.ini # Cesium ion 配置
|
||||
├── Content/
|
||||
│ ├── Blueprints/ # 蓝图规格文档
|
||||
│ │ ├── BP_GlobeController_Spec.md
|
||||
│ │ ├── BP_DataPoint_Spec.md
|
||||
│ │ ├── BP_Supercomputer_Spec.md
|
||||
│ │ ├── BP_SubmarineCable_Spec.md
|
||||
│ │ └── BP_DataFlow_Spec.md
|
||||
│ ├── Materials/
|
||||
│ │ └── Materials_Spec.md # 材质规格文档
|
||||
│ ├── Particles/
|
||||
│ │ └── Niagara_Spec.md # Niagara 粒子规格文档
|
||||
│ ├── Levels/
|
||||
│ │ └── Scene_Setup_Guide.md # 场景搭建指南
|
||||
│ ├── UI/
|
||||
│ └── Widgets/
|
||||
├── QUICK_START.md # 快速启动指南
|
||||
└── setup.sh # 设置脚本
|
||||
```
|
||||
|
||||
## 文档列表
|
||||
|
||||
### 1. 蓝图规格文档
|
||||
|
||||
| 文档 | 蓝图名称 | 用途 |
|
||||
|------|----------|------|
|
||||
| [BP_GlobeController_Spec.md](./Content/Blueprints/BP_GlobeController_Spec.md) | BP_GlobeController | 地球控制器,管理 Cesium |
|
||||
| [BP_DataPoint_Spec.md](./Content/Blueprints/BP_DataPoint_Spec.md) | BP_DataPoint | 数据点基类 |
|
||||
| [BP_Supercomputer_Spec.md](./Content/Blueprints/BP_Supercomputer_Spec.md) | BP_Supercomputer | TOP500 超算标记 |
|
||||
| [BP_SubmarineCable_Spec.md](./Content/Blueprints/BP_SubmarineCable_Spec.md) | BP_SubmarineCable | 海底光缆可视化 |
|
||||
| [BP_DataFlow_Spec.md](./Content/Blueprints/BP_DataFlow_Spec.md) | BP_DataFlow | 数据流向粒子 |
|
||||
|
||||
### 2. 材质和粒子
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [Materials_Spec.md](./Content/Materials/Materials_Spec.md) | 所有材质参数和网络结构 |
|
||||
| [Niagara_Spec.md](./Content/Particles/Niagara_Spec.md) | 所有粒子系统配置 |
|
||||
|
||||
### 3. 场景搭建
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [Scene_Setup_Guide.md](./Content/Levels/Scene_Setup_Guide.md) | 完整场景搭建步骤 |
|
||||
| [QUICK_START.md](./QUICK_START.md) | 快速启动指南 |
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 环境准备
|
||||
|
||||
```bash
|
||||
# 确保后端服务运行
|
||||
cd /home/ray/dev/linkong/planet
|
||||
docker restart planet_backend_new
|
||||
```
|
||||
|
||||
### 2. 启动 UE5
|
||||
|
||||
```
|
||||
1. 打开 D:\games\Planet\unreal\Planet.uproject
|
||||
2. 安装 Cesium for Unreal 插件
|
||||
3. 配置 Cesium ion Token
|
||||
4. 打开 Main.umap 场景
|
||||
```
|
||||
|
||||
### 3. 创建蓝图
|
||||
|
||||
按照蓝图规格文档创建蓝图类:
|
||||
|
||||
```
|
||||
Content/Blueprints/
|
||||
├── BP_GlobeController.uasset # 地球控制器
|
||||
├── BP_DataPoint.uasset # 数据点基类
|
||||
├── BP_Supercomputer.uasset # 超算标记 (继承自 BP_DataPoint)
|
||||
├── BP_SubmarineCable.uasset # 海缆可视化
|
||||
└── BP_DataFlow.uasset # 数据流向粒子
|
||||
```
|
||||
|
||||
### 4. 配置材质
|
||||
|
||||
按照材质规格文档创建材质:
|
||||
|
||||
```
|
||||
Content/Materials/
|
||||
├── M_Globe.uasset # 地球材质
|
||||
├── M_DataPoint.uasset # 数据点材质
|
||||
├── M_Supercomputer.uasset # 超算材质
|
||||
├── M_Cable.uasset # 海缆材质
|
||||
├── M_DataFlow.uasset # 数据流材质
|
||||
└── M_Particle.uasset # 粒子材质
|
||||
```
|
||||
|
||||
### 5. 配置粒子系统
|
||||
|
||||
按照 Niagara 规格文档创建粒子:
|
||||
|
||||
```
|
||||
Content/Particles/
|
||||
├── NS_DataPoint_Glow.uasset # 数据点光环
|
||||
├── NS_Supercomputer_Glow.uasset # 超算光环
|
||||
├── NS_DataFlow_Directional.uasset # 流向粒子
|
||||
├── NS_Alarm_Flash.uasset # 告警闪烁
|
||||
└── NS_Ambient_Ambience.uasset # 环境粒子
|
||||
```
|
||||
|
||||
## 数据源支持
|
||||
|
||||
| 数据源 | 类型 | 蓝图 | 颜色 |
|
||||
|--------|------|------|------|
|
||||
| TOP500 | 超算 | BP_Supercomputer | 🔴 红色 |
|
||||
| Epoch AI | GPU 集群 | BP_DataPoint | 🟠 橙色 |
|
||||
| HuggingFace | 模型部署 | BP_DataPoint | 🔵 蓝色 |
|
||||
| PeeringDB IXP | 交换中心 | BP_DataPoint | 🩵 青色 |
|
||||
| PeeringDB Network | 网络 | BP_DataPoint | 🟣 紫色 |
|
||||
| TeleGeography | 海缆 | BP_SubmarineCable | 🟡 黄色 |
|
||||
|
||||
## 后端 API
|
||||
|
||||
### HTTP API
|
||||
|
||||
| 端点 | 方法 | 说明 |
|
||||
|------|------|------|
|
||||
| `/api/v1/collected/summary` | GET | 获取数据统计 |
|
||||
| `/api/v1/collected?source=top500` | GET | 获取 TOP500 数据 |
|
||||
| `/api/v1/collected?source=telegeography_cables` | GET | 获取海缆数据 |
|
||||
| `/api/v1/collected/export/json` | GET | 导出 JSON |
|
||||
| `/api/v1/collected/export/csv` | GET | 导出 CSV |
|
||||
|
||||
### WebSocket
|
||||
|
||||
| 端点 | 说明 |
|
||||
|------|------|
|
||||
| `ws://localhost:8000/ws` | 实时数据推送 |
|
||||
|
||||
### 消息格式
|
||||
|
||||
**更新消息:**
|
||||
```json
|
||||
{
|
||||
"type": "update",
|
||||
"data": {
|
||||
"source": "top500",
|
||||
"action": "add/update/remove",
|
||||
"payload": {
|
||||
"id": "top500_1",
|
||||
"name": "Frontier",
|
||||
"location": {
|
||||
"latitude": 33.7756,
|
||||
"longitude": -84.3962
|
||||
},
|
||||
"performance": 1682.65
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**告警消息:**
|
||||
```json
|
||||
{
|
||||
"type": "alarm",
|
||||
"data": {
|
||||
"severity": "high",
|
||||
"message": "数据采集失败",
|
||||
"source": "peeringdb_ixp"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 渲染设置
|
||||
|
||||
```
|
||||
├─ 分辨率: 4K (3840×2160)
|
||||
├─ FPS 目标: 60
|
||||
├─ 光照质量: 高
|
||||
├─ 阴影质量: 高
|
||||
└─ 后处理: 中
|
||||
```
|
||||
|
||||
### LOD 设置
|
||||
|
||||
```
|
||||
├─ 数据点:
|
||||
│ ├─ LOD0: < 10000 cm
|
||||
│ ├─ LOD1: < 50000 cm
|
||||
│ └─ LOD2: > 50000 cm (禁用粒子)
|
||||
│
|
||||
├─ 海缆:
|
||||
│ ├─ LOD0: < 10000 cm
|
||||
│ ├─ LOD1: < 50000 cm (简化网格)
|
||||
│ └─ LOD2: > 50000 cm (禁用)
|
||||
│
|
||||
└─ 粒子:
|
||||
├─ Max Particles: 1000
|
||||
├─ Cull Distance: 50000 cm
|
||||
└─ GPU Simulation: true
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: Cesium 地形不显示
|
||||
|
||||
检查:
|
||||
1. Cesium ion Token 是否正确配置
|
||||
2. 网络连接是否正常
|
||||
3. Cesium 插件是否启用
|
||||
|
||||
### Q2: WebSocket 连接失败
|
||||
|
||||
检查:
|
||||
1. 后端服务是否运行
|
||||
2. CORS 配置是否正确
|
||||
3. URL 格式是否正确
|
||||
|
||||
### Q3: 性能不足
|
||||
|
||||
优化:
|
||||
1. 降低分辨率
|
||||
2. 减少粒子数量
|
||||
3. 禁用不必要的特效
|
||||
4. 使用 LOD
|
||||
|
||||
## 下一步
|
||||
|
||||
1. **完善蓝图** - 按照规格文档创建所有蓝图
|
||||
2. **添加 UI** - 创建 W_MainHUD、W_DataInfo 等界面
|
||||
3. **测试数据** - 验证所有数据源正常显示
|
||||
4. **优化性能** - 根据实际运行调整参数
|
||||
5. **打包发布** - 生成可执行文件
|
||||
|
||||
## 参考资源
|
||||
|
||||
- [Cesium for Unreal 文档](https://cesium.com/docs/)
|
||||
- [Unreal Engine 文档](https://docs.unrealengine.com/)
|
||||
- [Niagara 粒子系统](https://docs.unrealengine.com/niagara-in-unreal-engine/)
|
||||
126
unreal/setup.sh
Normal file
126
unreal/setup.sh
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
# UE5 项目设置脚本
|
||||
# 此脚本用于初始化 UE5 项目的 Cesium 配置
|
||||
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo "智能星球计划 - UE5 项目初始化"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 检查是否安装了 UE5
|
||||
if ! command -v ue5 &> /dev/null && ! command -v UnrealEditor &> /dev/null; then
|
||||
echo "⚠️ 未检测到 UE5 安装"
|
||||
echo "请从 Epic Games Launcher 安装 Unreal Engine 5.3+"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# 创建配置文件
|
||||
CONFIG_FILE="Config/PlanetConfig.ini"
|
||||
if [ ! -f "$CONFIG_FILE" ]; then
|
||||
echo "📝 创建配置文件..."
|
||||
cat > "$CONFIG_FILE" << 'EOF'
|
||||
# UE5 项目配置文件
|
||||
# Cesium ion 访问令牌
|
||||
|
||||
# Cesium ion Token
|
||||
# 请从 https://cesium.com/ion/ 获取你的 token
|
||||
CESIUM_ION_TOKEN=YOUR_TOKEN_HERE
|
||||
|
||||
# Cesium ion 默认服务器
|
||||
CESIUM_ION_DEFAULT_SERVER=https://ion.cesium.com
|
||||
|
||||
# 后端 API 地址
|
||||
BACKEND_API_URL=http://localhost:8000
|
||||
BACKEND_WS_URL=ws://localhost:8000
|
||||
EOF
|
||||
echo "✅ 已创建 $CONFIG_FILE"
|
||||
echo ""
|
||||
else
|
||||
echo "✅ 配置文件已存在"
|
||||
fi
|
||||
|
||||
# 创建蓝图占位符
|
||||
echo ""
|
||||
echo "📦 创建蓝图脚本..."
|
||||
|
||||
# BP_GlobeController.py (占位符)
|
||||
cat > "Source/PlanetAPI/Private/PlanetAPIClient.cpp" << 'CPP'
|
||||
// Planet API Client
|
||||
// 用于连接后端 WebSocket 服务
|
||||
|
||||
#include "PlanetAPIClient.h"
|
||||
#include "IWebSocket.h"
|
||||
#include "WebSocketsModule.h"
|
||||
|
||||
void UPlanetAPIClient::Connect(FString URL)
|
||||
{
|
||||
if (!FModuleManager::Get().IsModuleLoaded("WebSockets"))
|
||||
{
|
||||
FModuleManager::Get().LoadModule("WebSockets");
|
||||
}
|
||||
|
||||
Socket = FWebSocketsModule::Get().CreateWebSocket(URL);
|
||||
|
||||
Socket->OnConnected().AddLambda([](){
|
||||
UE_LOG(LogTemp, Log, TEXT("WebSocket Connected!"));
|
||||
});
|
||||
|
||||
Socket->OnMessage().AddLambda([this](FString Message){
|
||||
HandleMessage(Message);
|
||||
});
|
||||
|
||||
Socket->OnClosed().AddLambda([](int32 StatusCode, const FString& Reason, bool bWasClean){
|
||||
UE_LOG(LogTemp, Warning, TEXT("WebSocket Closed: %d - %s"), StatusCode, *Reason);
|
||||
});
|
||||
|
||||
Socket->Connect();
|
||||
}
|
||||
|
||||
void UPlanetAPIClient::Disconnect()
|
||||
{
|
||||
if (Socket.IsValid())
|
||||
{
|
||||
Socket->Close();
|
||||
}
|
||||
}
|
||||
|
||||
void UPlanetAPIClient::HandleMessage(FString Message)
|
||||
{
|
||||
// 解析 JSON 消息
|
||||
TSharedPtr<FJsonObject> JsonParsed;
|
||||
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(Message);
|
||||
|
||||
if (FJsonSerializer::Deserialize(Reader, JsonParsed) && JsonParsed.IsValid())
|
||||
{
|
||||
FString Type = JsonParsed->GetStringField("type");
|
||||
|
||||
if (Type == "update")
|
||||
{
|
||||
OnDataReceived.Broadcast(JsonParsed);
|
||||
}
|
||||
else if (Type == "alarm")
|
||||
{
|
||||
OnAlarmReceived.Broadcast(JsonParsed);
|
||||
}
|
||||
}
|
||||
}
|
||||
CPP
|
||||
|
||||
echo "✅ 已创建 PlanetAPIClient.cpp"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "✅ UE5 项目初始化完成!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "📋 下一步操作:"
|
||||
echo "1. 打开 Unreal Engine 5"
|
||||
echo "2. 打开项目目录中的 Planet.uproject"
|
||||
echo "3. 从 Marketplace 安装 Cesium for Unreal 插件"
|
||||
echo "4. 在项目设置中配置 Cesium ion Token"
|
||||
echo "5. 开始开发蓝图和可视化组件"
|
||||
echo ""
|
||||
echo "📖 详细文档请查看:docs/ue5_development_plan.md"
|
||||
echo ""
|
||||
1
unreal/unreal
Symbolic link
1
unreal/unreal
Symbolic link
@@ -0,0 +1 @@
|
||||
/mnt/d/games/Planet/unreal
|
||||
Reference in New Issue
Block a user