# 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 | 海南 | 新加坡 |
