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/)
@@ -0,0 +1,218 @@
# 锻造系统总体需求
**项目**: BladeSmith
**文档类型**: 需求文档(总体)
**版本**: 2.0
**最后更新**: 2026-08-11
**状态**: 整合自原 `2026-01-22-高真实度锻造系统设计.md` 与 `2026-01-23-淬火退火相变与应力疲劳系统总览.md`
> 本文档从玩家与游戏体验视角描述锻造系统要"做成什么样",不涉及算法、代码、shader 等技术实现细节。技术实现见 [design/00-锻造系统总体技术架构.md](../design/00-锻造系统总体技术架构.md)。
---
## 1. 项目定位
BladeSmith 是一款基于 Unreal Engine 5.6 的真实打铁模拟游戏。玩家在游戏中体验锻造刀具的完整流程,刀具的成型过程通过物理计算还原真实锻造效果——**每一把刀具的造型、纹路、性能都是独特的**。
锻造系统是玩法的核心,负责把"玩家敲锤子"这个动作转化为:
- 看得见的金属形变与表面变化
- 影响后续表现的内部材料状态(硬度、应力、相态、疲劳等)
- 最终决定刀具强度、韧性、耐久度的物理属性
## 2. 核心体验目标
| 目标 | 含义 | 验收信号 |
|---|---|---|
| **游戏娱乐级真实感** | 物理模型简化但保留核心机制,玩家直觉上"像真打铁" | 玩家测试中能凭常识判断结果 |
| **每一刀都独特** | 锻造路径决定刀具数据,同样的初始材料能产出截然不同的成品 | 同批次的两次锻造产出差异显著 |
| **可读的反馈** | 玩家在任何时刻都能"看懂"金属当前状态,做下一步决策 | 不依赖外部文档即可理解表层状态 |
| **稳定 60 FPS** | 锤击操作期间帧率不掉,操作延迟不可察觉 | 详见 §5 性能与质量目标 |
| **渐进式可实现** | 系统可分阶段交付,每阶段独立可玩 | 详见 §6 实施阶段 |
## 3. 玩家可见的核心物理过程
整个锻造系统要让玩家**直观感知**以下 7 类冶金学物理现象。这些现象构成 7 个专题需求文档的主题。
### 3.1 锤击形变与刀刃形成
玩家用锤子敲击锻材时:
- 受击处材料被压紧、向四周流动
- 材料优先沿"最小阻力方向"流动,而非均匀扩散
- 在边缘附近锻打时,材料沿边缘延展,逐渐形成平整锐利的刀刃
- 连续锻打能逐步把铁块变形成目标形状
详见 [01-锤击形变与刀刃形成需求.md](01-锤击形变与刀刃形成需求.md)。
### 3.2 表面磨损与外观
锻材的表面状态会随锻造过程演变:
- 新铁块表面是生锈/氧化层(橙红色、粗糙)
- 锤击区域铁锈脱落,露出光亮金属本体
- 表面特征(铁锈图案、纹路)**必须随形变一起移动**,不能"漂移"或"贴在屏幕上"
- 支持铁锈、氧化层、酸蚀痕迹、划痕等多种表面状态
详见 [02-表面磨损与外观需求.md](02-表面磨损与外观需求.md)。
### 3.3 网格质量(隐形但关键)
玩家不应感知到网格退化,因此:
- 连续锻打 50+ 次后,刀刃仍然平整,无明显锯齿
- 表面着色无条纹、无闪烁、无"空洞"
- 锻打不会让金属"莫名其妙"地出现奇怪形状
详见 [03-网格质量与性能需求.md](03-网格质量与性能需求.md)。
### 3.4 加工硬化与晶粒演化
反复锻打会让金属变硬:
- 同一块金属连续锻打会越来越难变形(需要更用力或更多锤)
- 加热到一定温度后金属软化,可继续加工(回火机制)
- 微观上,晶粒尺寸、形状、取向影响材料特性与视觉花纹
- 大马士革钢的层状花纹是可见的视觉表达
详见 [04-加工硬化与晶粒演化需求.md](04-加工硬化与晶粒演化需求.md)。
### 3.5 淬火退火相变
热处理是决定刀具最终性能的关键步骤:
- 把高温金属快速冷却(水/油)会显著提升硬度,但同时增加脆性
- **温度区间**决定淬火效果:黄金区间(900-1100°C)最佳,过低无效,过高有开裂风险
- **冷却速率**决定结果:水淬硬而脆、油淬适中、空冷近似退火
- 缓慢冷却(退火)反而让金属变软但韧性提高
- 视觉上要有清晰的三阶段反馈(详见专题)
详见 [05-淬火退火相变需求.md](05-淬火退火相变需求.md)。
### 3.6 应力累积与开裂
不均匀的形变和热处理会在金属内部累积应力:
- 高应力区域更难锻打(需要更用力)
- 应力梯度会让刀身在锻打中自然弯曲或扭曲
- 应力超过材料强度时会产生裂纹
- 裂纹会沿应力梯度扩展,最终导致刀具断裂
- 玩家可通过"应力扫描"辅助功能主动查看应力分布
详见 [06-应力累积与开裂需求.md](06-应力累积与开裂需求.md)。
### 3.7 疲劳累积与刀具耐久度
长期使用让刀具性能衰减:
- 反复锻打累积疲劳,过锻或高应力区加速疲劳
- 疲劳到达阈值后产生疲劳裂纹
- 刀具的耐久度由平均疲劳、裂纹数量、最大应力共同决定
- 使用刀具(切割、砍击)进一步累积损伤
- 回火可部分恢复疲劳,但裂纹无法愈合
- 耐久度归零或主裂纹出现时,刀具失效(断裂)
详见 [07-疲劳与刀具耐久度需求.md](07-疲劳与刀具耐久度需求.md)。
## 4. 玩家可执行的核心操作
这些操作来自游戏顶层玩法设计,锻造系统必须对其做出物理响应。
| 操作 | 锻造系统需要响应的行为 |
|---|---|
| **加热** | 提升温度,增加塑性,软化已硬化的金属,触发回火/相变重置 |
| **捶打** | 形变、表面去锈、累积应变/硬化/应力/疲劳、维护网格质量 |
| **切割**(电锯) | 快速改变锻材形状(独立子系统) |
| **打磨** | 改变表面粗糙度、微调形状、修复表面损伤 |
| **淬火** | 快速冷却触发马氏体相变,提升硬度/脆性,留下氧化层 |
| **强度测试** | 提供场地与道具,验证刀具性能(独立玩法场景) |
## 5. 性能与质量目标
### 5.1 帧率与延迟
| 指标 | 目标 |
|---|---|
| 锤击操作期间帧率 | 稳定 60 FPS |
| 单次锤击响应时间 | < 10 ms(玩家不可察觉) |
| 锤击形变计算预算 | 2-3 ms |
| 网格质量优化预算 | 1-2 ms |
| GPU 物理计算预算 | 0.5-1 ms(异步) |
| 顶点属性/材质更新预算 | 0.5-1 ms |
| **总锤击开销上限** | **≤ 7 ms** |
### 5.2 规模
| 维度 | 目标 |
|---|---|
| 单铁块网格顶点数 | 20-50 万(基础),刀刃区域可局部加密到 100 万/cm² |
| 体素分辨率 | 50×50×50(典型),可配置 30³-80³ |
| 单铁块内存 | ~30 MB |
| 连续锻打次数 | 连续 50-100 次锤击后网格质量仍良好 |
### 5.3 质量验收原则
- **网格质量**: 连续锻打 50 次后无明显细长三角形(长宽比 > 10:1),无明显锯齿
- **表面稳定性**: 形变后表面纹理(铁锈图案)不漂移
- **可调性**: 所有可调参数可在编辑器实时调节
- **可调试性**: 提供体素场可视化、应力热图、属性统计等调试工具
## 6. 设计原则
| 原则 | 含义 |
|---|---|
| **游戏娱乐级精度** | 简化物理模型,保留核心机制与真实感,不做科研级精度 |
| **YAGNI** | 避免过度设计,专注核心功能,不为假想需求预留 |
| **渐进式实现** | 分阶段交付,每阶段可独立运行与验收 |
| **架构扩展性** | 为未来功能(多材料、焊接、VR 等)预留接口,但不提前实现 |
| **过程高辨识,结果真物理** | 热处理等关键时刻给玩家强反馈,平时展示真实物理表现 |
| **辅助功能可选** | 应力扫描、疲劳扫描等"作弊视图"按需启用,不污染真实视觉 |
## 7. 验收路径(实施阶段)
按以下阶段交付,每阶段独立验收。详细任务排期见各专题需求文档。
| 阶段 | 范围 | 主要验收 |
|---|---|---|
| **阶段 1** | 锤击形变(各向异性) + 表面磨损 + 基础网格平滑 | 锻造边缘材料沿边缘流动;表面铁锈脱落;形变无漂移 |
| **阶段 2** | 完整网格质量系统(边翻转/平滑/重网格) | 连续锻打 50 次网格仍均匀,无细长三角形 |
| **阶段 3** | 物理模拟扩展(加工硬化/淬火/退火) | 连续锻打变硬;加热软化;淬火硬度显著提升 |
| **阶段 4** | 晶粒与视觉(晶粒演化/大马士革/应力可视化/开裂) | 高应变区可视化;支持大马士革花纹;应力过大出现裂纹 |
| **阶段 5** | 疲劳与耐久度 | 反复锻打累积疲劳;耐久度下降;刀具最终可失效 |
| **阶段 6** | 优化与打磨 | Unreal Insights 验证 60 FPS;所有参数蓝图可调;文档齐全 |
## 8. 风险(玩家可感知的失败模式)
这些是锻造系统做错时玩家会直接感受到的问题,设计阶段需重点规避:
| 风险 | 玩家感受 | 严重度 |
|---|---|---|
| 物理模型过于简化 | "假"、"不像打铁" | 中 |
| 系统过度复杂,周期失控 | 长期无新版可玩 | 高 |
| 顶点属性在网格重建时丢失 | 锻打中途表面颜色/状态错乱 | 高 |
| 大马士革花纹实现困难 | 阶段 4 可选功能,可降级或推迟 | 中 |
| 网格重建开销过大 | 锤击延迟突增、掉帧 | 高 |
| 参数难调 | 不同硬件表现差异大 | 中 |
## 9. 未来扩展方向(超出当前需求范围)
以下方向**不在**当前需求内,但系统设计不应阻止未来加入:
- 多材料支持(铜、青铜、钛合金)
- 焊接系统(多块金属连接与材料混合)
- 锻造工具多样性(平锤、圆锤、凿子等不同锤头形状)
- 多人协作锻造(网络同步动态网格)
- VR 支持(空间交互与力反馈)
## 10. 参考资料
### 10.1 物理基础
- 《金属塑性成形原理》(清华大学出版社)
- 《材料科学基础》(上海交通大学出版社)
- 《金属热处理原理与工艺》(机械工业出版社)
- *Metals Handbook: Forging and Forming / Heat Treating* (ASM International)
### 10.2 游戏案例
- *My Summer Car* — 机械装配真实度
- *BeamNG.drive* — 动态网格形变
- *Dwarf Fortress* — 材料属性系统
### 10.3 索引
- 技术实现总览: [design/00-锻造系统总体技术架构.md](../design/00-锻造系统总体技术架构.md)
- 专题需求: [01~07](./)
- 原始设计文档(归档): [_archive/plans/](../_archive/plans/)