# 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) ```