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:
@@ -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/)
|
||||
Reference in New Issue
Block a user