docs: 添加锻造系统总体需求与总体技术架构

整合原 01-22 高真实度锻造系统设计与 01-23 淬火退火相变与应力疲劳总览两份重叠文档,拆分为需求侧(玩家/体验视角)与设计侧(技术实现视角)。需求文档不含任何代码与算法名,设计文档定义混合体素-顶点架构、跨子系统共用决策、性能预算。

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-08-11 08:57:55 +08:00
parent 56cb314799
commit 4633e866ec
2 changed files with 622 additions and 0 deletions
@@ -0,0 +1,404 @@
# 锻造系统总体技术架构
**项目**: BladeSmith
**文档类型**: 技术设计(总体)
**版本**: 2.0
**最后更新**: 2026-08-11
**状态**: 整合自原 `2026-01-22-高真实度锻造系统设计.md` 与 `2026-01-23-淬火退火相变与应力疲劳系统总览.md` 的技术部分
> 本文档描述锻造系统的总体技术架构、数据结构、性能预算与跨子系统共用决策。需求侧见 [requirements/00-锻造系统总体需求.md](../requirements/00-锻造系统总体需求.md)。各子系统的算法/公式/代码细节见 [design/01~07](./)。
---
## 1. 架构目标
| 目标 | 含义 |
|---|---|
| **性能可控** | 体素层粗、顶点层细,分辨率独立可调,保证 60 FPS |
| **物理直觉清晰** | 全局场(温度、应力扩散)+ 局部历史(材料记忆)职责分明 |
| **复用现有基础** | 在已有的 GPU Compute / Ping-Pong / RDG / DynamicMesh3 基础上扩展 |
| **易于调试** | 体素数据与顶点数据可独立可视化 |
| **架构扩展性** | 顶点属性层是开放的,新增子系统不需要改动核心数据结构 |
## 2. 总体架构:混合体素-顶点
核心思想:**体素层存储"全局物理场",顶点层存储"局部材料历史"**,两层通过双向采样通信。
```
┌─────────────────────────────────────────────────────────┐
│ 锤击输入(CPU) │
└─────────────────┬───────────────────────────────────────┘
│
┌────────┴────────┐
│ │
┌────▼─────┐ ┌─────▼─────┐
│ 体素层 │ │ 顶点层 │
│ (GPU) │ │ (CPU/GPU) │
└────┬─────┘ └─────┬────┘
│ │
│ 双向采样通信 │
└────────┬────────┘
│
┌────────▼────────┐
│ 渲染 & 显示 │
└─────────────────┘
```
### 2.1 体素层(全局物理场)
| 字段类别 | 字段 | 说明 |
|---|---|---|
| 已有 | 温度 | °C |
| 已有 | 塑性系数 | 0-1 |
| 已有 | Flags | 标志位(如 bit 0 = 表面体素) |
| 新增 | 平均应变率 | 形变活跃度,0-1 归一化 |
| 新增 | 冷却速率 | °C/s,用于淬火判断 |
| 新增 | 相态 | 奥氏体/马氏体/珠光体/开裂 |
| 新增 | 是否已淬火标记 | bool |
- **分辨率**: 50×50×50(典型),可配置 30³-80³
- **更新方式**: GPU Compute Shader,Ping-Pong 双缓冲
- **优势**: 全局扩散计算(温度传导、应力扩散)在体素层做,与顶点数无关
### 2.2 顶点层(局部材料历史)
| 字段 | 用途 |
|---|---|
| 初始位置 | 无漂移纹理采样 |
| 累积塑性应变 | 加工硬化输入、疲劳计算 |
| 硬度系数 | 形变阻力 |
| 脆性系数 | 开裂风险 |
| 内部应力 | 标量简化,影响形变/弯曲/开裂 |
| 应力方向 | 可选三维向量 |
| 疲劳值 | 0-1,刀具耐久度 |
| 打磨度 | 0=生锈,1=光亮 |
| 晶粒尺寸 | 0-1 归一化 |
| 相态标记 | 从体素采样 |
| 回火颜色 | 真实视觉表现 |
| 氧化层度数 | 氧化层表现 |
| 裂纹状态 | 0=无,1=有 |
- **数量**: 20-50 万顶点(基础),刀刃区域局部加密到 100 万/cm²
- **存储**: `TDynamicMeshVertexAttribute<T>` 自定义属性层
- **优势**: 局部历史精确,顶点独立维护,可承载材料记忆
### 2.3 双向采样
- **体素 → 顶点**: 顶点根据自己的位置,从体素网格三线性插值采样温度、相态、冷却速率等
- **顶点 → 体素**: 顶点的应变率、形变活跃度回写体素,影响全局扩散
## 3. 锤击事件数据流
每次锤击触发以下 8 步流水线(各步对应一个子系统设计文档):
```
锤击事件
↓
1. 形变计算(顶点位移) ── design/01-刀刃形成
↓
2. 更新顶点应变累积 ── design/04-物理模拟
↓
3. 从温度体素采样塑性/相态 ── 架构层(本节)
↓
4. 硬化计算(应变+温度→硬度) ── design/04-物理模拟
↓
5. 应力累积(塑性+热+相变+残余) ── design/06-应力系统
↓
6. 更新体素应变率场、温度/淬火/退火 ── design/05-淬火系统
↓
7. 疲劳累积与裂纹判定 ── design/07-疲劳系统
↓
8. 材质可视化更新(顶点颜色/材质参数) ── design/02-表面磨损、05-淬火系统
```
## 4. 数据结构定义
### 4.1 扩展体素结构
```cpp
USTRUCT(BlueprintType)
struct FTemperatureVoxel
{
GENERATED_BODY()
// ===== 已有字段 =====
UPROPERTY()
float Temperature; // 温度(°C)
UPROPERTY()
float PlasticityCoefficient; // 塑性系数(0-1)
UPROPERTY()
uint8 Flags; // 标志位(bit 0: 表面体素)
// ===== 新增字段 =====
UPROPERTY()
float AverageStrainRate; // 平均应变率(0-1)
UPROPERTY()
float CoolingRate; // 冷却速率(°C/s)
UPROPERTY()
EPhaseState PhaseState; // 相态
UPROPERTY()
bool bHasBeenQuenched; // 是否经历过快速冷却
FTemperatureVoxel()
: Temperature(20.0f)
, PlasticityCoefficient(0.0f)
, Flags(0)
, AverageStrainRate(0.0f)
, CoolingRate(0.0f)
, PhaseState(EPhaseState::Austenite)
, bHasBeenQuenched(false)
{}
};
```
### 4.2 相态枚举
```cpp
UENUM(BlueprintType)
enum class EPhaseState : uint8
{
Austenite UMETA(DisplayName = "奥氏体"), // 高温软相(>800°C)
Martensite UMETA(DisplayName = "马氏体"), // 淬火硬相
Pearlite UMETA(DisplayName = "珠光体"), // 缓冷软相
Bainite UMETA(DisplayName = "贝氏体"), // 中间相
Cracked UMETA(DisplayName = "开裂") // 永久缺陷
};
```
### 4.3 顶点自定义属性层
```cpp
class ADynamicIronBlock : public ADynamicMeshActor
{
private:
// ===== 几何与历史 =====
TDynamicMeshVertexAttribute<FVector>* InitialPositions; // 初始位置(不变,用于无漂移采样)
// ===== 材料状态 =====
TDynamicMeshVertexAttribute<float>* AccumulatedStrain; // 累积塑性应变
TDynamicMeshVertexAttribute<float>* HardnessCoefficient; // 硬度系数(0-1)
TDynamicMeshVertexAttribute<float>* Brittleness; // 脆性系数(0-1)
TDynamicMeshVertexAttribute<float>* GrainSize; // 晶粒尺寸(0-1)
// ===== 应力与疲劳 =====
TDynamicMeshVertexAttribute<float>* StressValue; // 标量应力(简化)
TDynamicMeshVertexAttribute<FVector>* StressDirection; // 应力方向(可选)
TDynamicMeshVertexAttribute<float>* FatigueValue; // 疲劳值(0-1)
TDynamicMeshVertexAttribute<uint8>* CrackState; // 裂纹状态
// ===== 表面与外观 =====
TDynamicMeshVertexAttribute<float>* PolishAmount; // 打磨度(0=生锈,1=光亮)
TDynamicMeshVertexAttribute<float>* RustSeed; // 铁锈噪声种子
TDynamicMeshVertexAttribute<float>* OxideThickness; // 氧化层厚度
TDynamicMeshVertexAttribute<FVector>* TemperColor; // 回火颜色
TDynamicMeshVertexAttribute<float>* OxidationLevel; // 氧化层度数
// ===== 相态(从体素采样) =====
TDynamicMeshVertexAttribute<uint8>* PhaseState; // 相态标记
public:
void InitializeVertexAttributes();
void ReleaseVertexAttributes();
};
```
### 4.4 顶点颜色编码方案
顶点颜色仅 4 通道(RGBA),需精心分配。基础方案:
| 通道 | 用途 | 范围 | 更新频率 |
|---|---|---|---|
| **R** | 温度可视化 | 0-1 | 每帧 |
| **G** | 打磨度(Polish) | 0-1 | 锤击时 |
| **B** | 噪声种子 / 初始位置 Z | 0-1 | 初始化 |
| **A** | 辅助标记(0=正常, 1=裂纹区, 2=淬火区临时) | 0-3 | 事件触发 |
淬火过程期间临时占用通道做高辨识度反馈,过渡期恢复到基础方案(详见 [05-淬火退火相变系统设计.md](05-淬火退火相变系统设计.md))。
超出 4 通道的数据通过 UV1 通道或自定义顶点属性传递。
## 5. GPU-CPU 分工
| 模块 | GPU Compute Shader | CPU |
|---|---|---|
| 温度场 | 更新、传导、冷却 | — |
| 冷却速率 | 滑动平均计算 | — |
| 相态判定 | 体素级相变 | — |
| 热应力 | 计算(简化版) | — |
| 应力扩散 | 简化版 | 完整扩散、累积 |
| 形变 | (可选,GPU 化) | 默认实现、与 BVH 同步 |
| 硬度/脆性 | — | 公式应用 |
| 残余应力/塑性应力 | — | 计算 |
| 裂纹判定/扩展 | — | 全部 |
| 疲劳累积 | — | 全部 |
| 材质可视化 | — | 顶点颜色更新、材质参数 |
### 5.1 异步 Dispatch 模式
```cpp
ENQUEUE_RENDER_COMMAND(FMetallurgyComputeDispatch)(
[this, DeltaTime](FRHICommandListImmediate& RHICmdList)
{
FMetallurgyComputeShader::Dispatch(
RHICmdList,
TemperatureBufferA,
TemperatureBufferB,
MetallurgyBuffer,
DeltaTime,
TemperatureResolution
);
bMetallurgyComputeComplete = true;
}
);
// CPU 继续其他工作,不等待 GPU
```
## 6. 性能与内存预算
### 6.1 帧时间预算(60 FPS = 16.67 ms)
| 系统 | 预算 | 说明 |
|---|---|---|
| 渲染(UE5 基础) | 10 ms | 场景渲染、后处理 |
| 锤击形变计算 | 2-3 ms | 顶点位移、BVH 更新 |
| 网格质量优化 | 1-2 ms | 边翻转、平滑 |
| GPU 物理(温度+冶金) | 0.5-1 ms | Compute Shader(异步) |
| 顶点属性更新 | 0.5 ms | 硬化、应力、疲劳公式 |
| 材质可视化 | 0.5 ms | 顶点颜色更新 |
| **总锤击开销上限** | **≤ 7 ms** | 留足渲染预算 |
### 6.2 内存预算
| 数据 | 大小 | 说明 |
|---|---|---|
| 网格顶点(20 万) | ~17 MB | 84 字节/顶点(含扩展属性) |
| 网格三角形(40 万) | 4.8 MB | 3×4 字节索引 |
| BVH 结构 | 5 MB | 加速结构 |
| 物理场体素(50³) | ~0.4 MB | 扩展后的体素结构 |
| GPU 缓冲区 | ~3 MB | Ping-Pong 缓冲 |
| **单铁块总计** | **~30 MB** | 可接受 |
### 6.3 可扩展性
- **网格密度**: 20 万-100 万顶点可配置
- **体素分辨率**: 30³-80³ 可配置
- **子系统开关**: 各子系统可独立禁用
- **LOD 支持**: 远距离降低网格密度与计算频率
## 7. 子系统映射
每个子系统专题设计文档对应到本架构的具体位置:
| 专题设计 | 主要涉及层 | 主要涉及数据 |
|---|---|---|
| [01-刀刃形成-各向异性流动](01-刀刃形成-各向异性流动设计.md) | 顶点 | 顶点位置、InitialPositions |
| [02-表面磨损-顶点属性与无漂移采样](02-表面磨损-顶点属性与无漂移采样设计.md) | 顶点 + 材质 | PolishAmount、RustSeed、UV1、VertexColor |
| [03-网格质量-增量式优化](03-网格质量-增量式优化设计.md) | 顶点(拓扑) | 三角形/边、属性插值 |
| [04-物理模拟-加工硬化与晶粒演化](04-物理模拟-加工硬化与晶粒演化设计.md) | 体素 + 顶点 | 体素全部、HardnessCoefficient、GrainSize |
| [05-淬火退火相变系统](05-淬火退火相变系统设计.md) | 体素 + 顶点 + 材质 | CoolingRate、PhaseState、TemperColor、OxidationLevel |
| [06-应力累积系统](06-应力累积系统设计.md) | 体素 + 顶点 | StressValue、CrackState、应力方向 |
| [07-疲劳与耐久度系统](07-疲劳与耐久度系统设计.md) | 顶点(纯 CPU) | FatigueValue、CrackState、耐久度聚合 |
## 8. 跨子系统共用决策
这些决策被多个子系统共用,统一约定,避免分散定义。
### 8.1 顶点 ID 持久化与属性插值
网格重网格化(Remesher)/细分/合并会改变顶点 ID。属性必须随顶点保留,否则会出现"颜色错乱""硬化丢失"。
约定:
- **新建顶点**: 在 Remesher 回调 `OnVertexSplit` 中,基于 split alpha 对属性做线性插值
- **最近邻回退**: 回调不可用时,基于位置最近邻查找旧属性(精度损失,仅作降级)
- **不能丢失的关键属性**: InitialPositions、PhaseState、CrackState、AccumulatedStrain
### 8.2 体素 Ping-Pong 双缓冲
温度场、冶金场更新采用 Ping-Pong,避免读写冲突。
```
Buffer A (读) → Compute Shader → Buffer B (写)
下一帧对调
```
### 8.3 体素-顶点采样约定
- **体素 → 顶点**: 三线性插值,顶点位置除以 VoxelSize 得到体素坐标
- **顶点 → 体素**: 加权累加,顶点的应变率按距离权重回写到周围 8 个体素
### 8.4 RDG(Render Dependency Graph)
所有 GPU 计算走 RDG,自动管理资源生命周期与并行调度。
### 8.5 增量式局部处理
锤击只影响局部,所有后续处理(网格优化、应力扩散、疲劳累积)都只处理影响半径内的顶点。这是性能可控的关键。
## 9. 调试与可视化基础设施
各子系统共享一套调试工具,统一在 `ADynamicIronBlock` 上以 `Debug*` 命名:
| 工具 | 用途 |
|---|---|
| `DebugDrawVoxelData` | 体素可视化:温度、冷却速率、相态 |
| `DebugDrawFlowDirections` | 材料流动方向箭头(刀刃形成) |
| `DebugDrawEdgeVertices` | 边缘顶点高亮 |
| `DebugDrawDegenerateTriangles` | 退化三角形红色标记 |
| `DebugDrawQualityHeatmap` | 网格质量热图 |
| `DebugDrawPolishHeatmap` | 打磨度热图 |
| `DebugDrawStressHeatmap` | 应力热图(蓝→红) |
| `DebugDrawFatigueHeatmap` | 疲劳热图 |
| `DebugPrintVertexAttributes` | 顶点属性统计输出(Min/Max/Avg) |
| `LogMeshQualityStats` | 网格质量统计日志 |
材质侧统一加 `DebugMode` 参数:
- 0 = 正常
- 1 = 打磨度
- 2 = 铁锈图案
- 3 = 初始位置
- 4 = 应力
- 5 = 疲劳
- 6 = 相态
## 10. 已知简化假设(技术债务)
当前架构基于以下简化,是有意识的取舍,非缺陷:
1. **应力张量简化为标量**: 真实是 3×3 张量,当前仅用单值。StressDirection 是可选的补丁
2. **晶粒模型极度简化**: 真实晶粒有复杂 3D 形状与取向,当前用标量 GrainSize
3. **相变模型经验化**: 马氏体转变实际需要 CCT 曲线,当前用冷却速率阈值近似
4. **无热-力-电-磁耦合**: 忽略形变生热、磁性、电阻率等二次效应
5. **各向同性假设**: 真实钢有晶粒取向,当前材料各向同性
适用场景:**游戏娱乐级**,足够真实感但非科研级精度。
## 11. 未来扩展接口
以下扩展不需要改动核心架构:
- **多材料支持**: 新增 `MaterialID` 顶点属性,材质侧按 ID 查材料参数表
- **焊接系统**: 多个 `ADynamicIronBlock` 通过焊接约束连接,共享体素边界
- **不同锤头形状**: 在 `OnHammerImpact` 增加 `HammerShape` 参数,影响 ImpactRadius 与形变方向
- **VR 支持**: 锤击输入改为 VR 控制器,核心数据流不变
## 12. 参考资料
### 12.1 技术参考
- Unreal Engine 5.6 Geometry Scripting 文档
- *Real-Time Collision Detection* by Christer Ericson(网格优化)
- *GPU Gems 3: Chapter 39* — Parallel Prefix Sum(GPU 算法)
- *Siggraph 2020: Dynamic Mesh Simplification*(网格优化)
### 12.2 索引
- 总体需求: [requirements/00-锻造系统总体需求.md](../requirements/00-锻造系统总体需求.md)
- 专题设计: [01~07](./)
- 实施记录: [impl/](../impl/)
- 原始设计文档(归档): [_archive/plans/](../_archive/plans/)