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

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-08-11 08:57:55 +08:00

16 KiB
Raw Permalink Blame History

锻造系统总体技术架构

项目: BladeSmith 文档类型: 技术设计(总体) 版本: 2.0 最后更新: 2026-08-11 状态: 整合自原 2026-01-22-高真实度锻造系统设计.md 与 2026-01-23-淬火退火相变与应力疲劳系统总览.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 扩展体素结构

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 相态枚举

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 顶点自定义属性层

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)。

超出 4 通道的数据通过 UV1 通道或自定义顶点属性传递。

5. GPU-CPU 分工

模块 GPU Compute Shader CPU
温度场 更新、传导、冷却 —
冷却速率 滑动平均计算 —
相态判定 体素级相变 —
热应力 计算(简化版) —
应力扩散 简化版 完整扩散、累积
形变 (可选,GPU 化) 默认实现、与 BVH 同步
硬度/脆性 — 公式应用
残余应力/塑性应力 — 计算
裂纹判定/扩展 — 全部
疲劳累积 — 全部
材质可视化 — 顶点颜色更新、材质参数

5.1 异步 Dispatch 模式

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-刀刃形成-各向异性流动 顶点 顶点位置、InitialPositions
02-表面磨损-顶点属性与无漂移采样 顶点 + 材质 PolishAmount、RustSeed、UV1、VertexColor
03-网格质量-增量式优化 顶点(拓扑) 三角形/边、属性插值
04-物理模拟-加工硬化与晶粒演化 体素 + 顶点 体素全部、HardnessCoefficient、GrainSize
05-淬火退火相变系统 体素 + 顶点 + 材质 CoolingRate、PhaseState、TemperColor、OxidationLevel
06-应力累积系统 体素 + 顶点 StressValue、CrackState、应力方向
07-疲劳与耐久度系统 顶点(纯 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 索引