design/06 涵盖四源应力(塑性/热/相变/残余)、扩散松弛、形变阻力、弯曲扭曲与开裂扩展。design/07 涵盖疲劳累积公式、疲劳裂纹、刀具耐久度计算、回火恢复与刀具失效判定。 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
14 KiB
疲劳与耐久度系统设计
项目: BladeSmith
文档类型: 技术设计(专题)
版本: 2.0
最后更新: 2026-08-11
状态: 整合自原 2026-01-23-疲劳累积与耐久度系统设计.md
本文档描述疲劳累积与耐久度系统的技术实现。需求见 [../requirements/07-疲劳与刀具耐久度需求.md]。总体架构见 00-锻造系统总体技术架构.md。
1. 技术背景
疲劳累积与耐久度系统模拟材料在反复锻打和使用过程中的疲劳累积、裂纹产生与扩展,以及刀具整体耐久度变化。系统通过疲劳值计算、疲劳裂纹机制、耐久度综合评估、使用中损伤累积、恢复机制以及失效判定,实现真实材料疲劳行为模拟。
2. 疲劳累积机制
2.1 疲劳值定义
疲劳值(Fatigue):
- 范围:0(完好)到 1(完全疲劳/失效)
- 每个顶点独立维护
- 累积式,不可逆(除非回火)
2.2 疲劳累积规则
基础公式:
Fatigue += BaseFatigueRate × StressFactor × TemperatureFactor × DeltaTime
2.3 各因子详细说明
2.3.1 基础疲劳率(BaseFatigueRate)
| 锻打类型 | BaseFatigueRate | 说明 |
|---|---|---|
| 正常锻打 | 0.001 | 标准锤击 |
| 过度锻打 | 0.005 | 形变过大(超过阈值) |
| 应力集中 | 0.010 | 高应力区域 |
2.3.2 判定过度锻打
if (StrainIncrement > CriticalStrainThreshold)
{
BaseFatigueRate = 0.005; // 过度锻打
}
2.3.3 应力因子
StressFactor = clamp(InternalStress / StressLimit, 1.0, 3.0)
应力越高,疲劳累积越快:
- 应力 < 1.0 × StressLimit: StressFactor = 1.0
- 应力 = 1.5 × StressLimit: StressFactor = 1.5
- 应力 ≥ 3.0 × StressLimit: StressFactor = 3.0
2.3.4 温度因子
TemperatureFactor =
0.1 (T > 800°C, 高温疲劳慢)
1.0 (常温)
2.0 (T < 200°C, 低温疲劳快)
高温时材料更"柔软",疲劳较慢;低温时更"脆",疲劳快。
2.4 疲劳限制
Fatigue = clamp(Fatigue, 0.0, 1.0)
疲劳值达到1.0后不再增加,但可能触发失效。
3. 疲劳可视化(辅助功能)
3.1 疲劳扫描模式
触发方式:
- 按住特定键切换到"疲劳视图"
- 或在UI中选择"疲劳扫描"工具
3.2 视觉效果
顶点颜色着色:
// 蓝色:疲劳值 < 0.3
if (Fatigue < 0.3)
{
Color = Lerp(Blue, Green, Fatigue / 0.3);
}
// 绿色:疲劳值 0.3-0.7
else if (Fatigue < 0.7)
{
Color = Lerp(Green, Yellow, (Fatigue - 0.3) / 0.4);
}
// 黄色:疲劳值 0.7-0.9
else if (Fatigue < 0.9)
{
Color = Lerp(Yellow, Orange, (Fatigue - 0.7) / 0.2);
}
// 红色:疲劳值 > 0.9(危险区)
else
{
Color = Red;
// 叠加脉冲效果
Pulse = sin(Time × 5.0) × 0.5 + 0.5;
Emissive = Pulse × Red;
}
3.3 UI面板
- 平均疲劳值
- 最大疲劳值
- 危险区域数量(Fatigue > 0.9)
- 预估寿命
3.4 退出可视化
释放辅助功能键后,完全恢复正常视觉表现。
4. 疲劳裂纹系统
4.1 疲劳裂纹起始
触发条件:
if (Fatigue > 0.9 && InternalStress > 0.5 × StressLimit)
{
// 触发疲劳开裂
if (Random() < CrackProbability)
{
CreateFatigueCrack(Vertex);
}
}
疲劳开裂概率:
CrackProbability = (Fatigue - 0.9) × 10.0 // 最大1.0
疲劳值越高,开裂概率越大:
- Fatigue = 0.9: CrackProbability = 0.0
- Fatigue = 0.95: CrackProbability = 0.5
- Fatigue = 1.0: CrackProbability = 1.0
4.2 疲劳裂纹扩展
每次锻打检查:
if (Vertex.IsCracked && CrackType == Fatigue)
{
// 裂纹扩展概率
ExtendProbability = (Fatigue - 0.7) × 2.0
if (Random() < ExtendProbability)
{
// 找到疲劳值最高的相邻顶点
TargetNeighbor = FindMaxFatigueNeighbor();
CrackTo(TargetNeighbor);
}
}
疲劳裂纹特点:
- 沿高疲劳值方向扩展
- 扩展速度与疲劳值成正比
- 可能产生多条细小裂纹(应力裂纹通常是单条)
4.3 疲劳裂纹视觉表现
几何表现:
-
细小裂缝:
- 开口宽度较小(0.01-0.02)
- 多条裂纹可能交织
-
边缘锯齿:
- 裂纹边缘不光滑
- 顶点位置随机抖动
材质表现:
-
表面氧化:
- 显示轻微锈迹
- 氧化程度与时间相关
-
内部损伤:
- 深处 darker
- 模拟材料损伤
5. 耐久度系统
5.1 耐久度定义
耐久度(Durability):
- 范围:0(损坏)到 1.0(完好)
- 基于整个刀具计算
- 影响刀具使用效果
5.2 耐久度计算公式
综合耐久度:
Durability = 1.0 - (AverageFatigue + CrackPenalty + StressPenalty)
5.3 各分量说明
5.3.1 平均疲劳
AverageFatigue = Σ(Fatigue_i) / VertexCount
5.3.2 裂纹惩罚
CrackPenalty = CrackCount × 0.1 // 每条裂纹扣10%耐久
裂纹包括:
- 应力裂纹(由应力超阈值产生)
- 疲劳裂纹(由疲劳累积产生)
5.3.3 应力惩罚
StressPenalty = (MaxStress / StressLimit) × 0.2
高应力区域最高扣除20%耐久度。
5.4 耐久度限制
Durability = clamp(Durability, 0.0, 1.0)
耐久度降到0后刀具可能失效。
6. 使用中的损伤累积
6.1 刀具使用场景
切割/砍击:
- 每次使用造成冲击
- 冲击点附近疲劳增加
抛光/打磨:
- 减少疲劳(回火效果)
- 恢复部分耐久度
6.2 冲击疲劳计算
冲击应力:
ImpactStress = ImpactForce × MaterialStiffness × (1 - ImpactAngle)
参数说明:
ImpactForce: 冲击力(来自物理引擎)MaterialStiffness: 材料刚度ImpactAngle: 冲击角度(0-1,垂直=1.0)
疲劳增量:
Fatigue += ImpactStress / Durability × FatigueRate
参数说明:
FatigueRate: 疲劳率(可配置,默认0.0001)
局部更新: 冲击影响半径内的顶点更新疲劳值。
6.3 耐久度实时更新
每次使用后:
// 重新计算耐久度
Durability = CalculateDurability();
// 更新UI
UpdateDurabilityUI();
7. 耐久度恢复机制
7.1 回火恢复
加热至回火温度(200-400°C):
疲劳恢复:
if (Temperature > 200°C && Temperature < 400°C)
{
Fatigue -= 0.1 × DeltaTime; // 慢慢消除疲劳
Fatigue = clamp(Fatigue, 0.0, 1.0);
}
耐久度恢复:
if (Temperature > 200°C && Temperature < 400°C)
{
Durability += 0.05 × DeltaTime;
Durability = clamp(Durability, 0.0, 1.0);
}
注意事项:
- 疲劳可部分恢复
- 但裂纹无法愈合
- 裂纹惩罚永久存在
7.2 打磨恢复
打磨操作:
表面损伤修复:
- 打磨可去除表面疲劳痕迹
- 减少视觉上的"老伤"
疲劳影响:
if (PolishAmount > OldPolishAmount)
{
Fatigue -= (PolishAmount - OldPolishAmount) × 0.5;
Fatigue = clamp(Fatigue, 0.0, 1.0);
}
耐久度影响:
- 打磨不恢复耐久度
- 但可以改善外观
8. 刀具失效判定
8.1 失效条件
条件1: 耐久度耗尽:
if (Durability < 0.0)
{
BreakWeapon();
}
条件2: 主裂纹存在:
if (MajorCrackExists)
{
// 主裂纹判定:长度超过阈值或穿过关键区域
if (CrackLength > MajorCrackThreshold || CrackThroughCriticalArea)
{
BreakWeapon();
}
}
条件3: 瞬时过载:
if (ImpactForce > UltimateStrength)
{
// 瞬间断裂
InstantBreakWeapon();
}
8.2 失效表现
几何表现:
-
断裂:
- 刀身分离成两段
- 网格拓扑断裂
- 删除断裂部分的顶点和三角形
-
破碎:
- 多个小碎片
- 适合薄刃刀具
材质表现:
-
断口:
- 显示粗糙断裂面
- 颜色暗淡
- 无光泽
-
音效:
- 断裂音效
- 碎片掉落声
物理表现:
- 断裂部分掉落
- 受重力影响
- 碰撞地面产生音效
9. 实现架构
9.1 数据结构
顶点属性扩展:
TDynamicMeshVertexAttribute<float>* FatigueValue; // 疲劳值(0-1)
裂纹数据结构:
UENUM(BlueprintType)
enum class ECrackType : uint8
{
Stress = 0, // 应力裂纹
Fatigue = 1, // 疲劳裂纹
Impact = 2 // 冲击裂纹
};
USTRUCT(BlueprintType)
struct FCrackData
{
GENERATED_BODY()
UPROPERTY()
int32 StartVertex; // 裂纹起始顶点ID
UPROPERTY()
int32 EndVertex; // 裂纹结束顶点ID
UPROPERTY()
TEnumAsByte<ECrackType> CrackType; // 裂纹类型
UPROPERTY()
float CrackWidth; // 裂纹宽度
UPROPERTY()
float CrackDepth; // 裂纹深度
UPROPERTY()
float CreationTime; // 创建时间
UPROPERTY()
bool bIsMajor; // 是否主裂纹
};
刀具耐久度数据:
USTRUCT(BlueprintType)
struct FWeaponDurability
{
GENERATED_BODY()
UPROPERTY()
float Durability; // 耐久度(0-1)
UPROPERTY()
float AverageFatigue; // 平均疲劳
UPROPERTY()
int32 CrackCount; // 裂纹数量
UPROPERTY()
float MaxStress; // 最大应力
UPROPERTY()
int32 MajorCrackCount; // 主裂纹数量
};
9.2 GPU-CPU分工
GPU Compute Shader职责:
- 无(疲劳计算纯CPU)
CPU职责:
- 疲劳累积计算
- 疲劳裂纹判定
- 裂纹扩展逻辑
- 耐久度计算
- 使用中的损伤累积
- 回火/打磨恢复
- 刀具失效判定
- 疲劳扫描可视化
10. 性能优化
10.1 疲劳计算优化
局部更新:
- 锤击时仅更新受影响区域
- 使用空间分区加速查询
批量更新:
- 每帧最多更新N个顶点
- 使用优先级队列(高疲劳优先)
10.2 裂纹判定优化
阈值检查:
// 仅检查接近阈值的顶点
if (Fatigue > 0.8 && InternalStress > 0.5 × StressLimit)
{
// 检查裂纹
}
空间分区:
- 使用八叉树或BVH
- 快速查询相邻顶点
10.3 可视化优化
疲劳扫描:
- 按需启用
- 使用简化着色器
- 降低更新频率
11. 参数配置
11.1 可调参数(蓝图可配)
| 参数名 | 默认值 | 范围 | 说明 |
|---|---|---|---|
BaseFatigueRateNormal |
0.001 | 0.0005-0.002 | 正常锻打疲劳率 |
BaseFatigueRateOverwork |
0.005 | 0.002-0.01 | 过度锻打疲劳率 |
BaseFatigueRateStress |
0.010 | 0.005-0.02 | 应力集中疲劳率 |
CriticalStrainThreshold |
0.1 | 0.05-0.2 | 临界应变阈值 |
TemperatureFactorHigh |
0.1 | 0.05-0.2 | 高温疲劳因子 |
TemperatureFactorNormal |
1.0 | 0.8-1.2 | 常温疲劳因子 |
TemperatureFactorLow |
2.0 | 1.5-2.5 | 低温疲劳因子 |
CrackPenalty |
0.1 | 0.05-0.2 | 单条裂纹惩罚 |
StressPenalty |
0.2 | 0.1-0.3 | 应力惩罚系数 |
FatigueRecoveryRate |
0.1 | 0.05-0.2 | 回火疲劳恢复率 |
DurabilityRecoveryRate |
0.05 | 0.02-0.1 | 回火耐久恢复率 |
ImpactFatigueRate |
0.0001 | 0.00005-0.0002 | 冲击疲劳率 |
MajorCrackThreshold |
10.0 | 5.0-20.0 | 主裂纹长度阈值 |
11.2 调试工具
- 疲劳热图:实时显示疲劳分布
- 疲劳时间线:记录疲劳变化历史
- 裂纹追踪:记录裂纹生成和扩展
- 耐久度面板:实时显示耐久度
- 预估寿命:基于当前疲劳率预估
12. 实施计划
12.1 第一阶段:疲劳累积(1天)
- 疲劳值属性系统
- 疲劳累积规则
- 应力和温度因子
- 疲劳限制
- 单元测试
12.2 第二阶段:疲劳裂纹(1天)
- 疲劳裂纹起始判定
- 疲劳裂纹扩展逻辑
- 疲劳裂纹视觉表现
- 集成测试
12.3 第三阶段:耐久度系统(1天)
- 耐久度计算公式
- 使用中的损伤累积
- 回火/打磨恢复
- 耐久度UI
- 集成测试
12.4 第四阶段:刀具失效(0.5天)
- 失效条件判定
- 失效表现(几何/材质/音效)
- 集成测试
12.5 第五阶段:辅助功能(0.5天)
- 疲劳扫描模式
- 疲劳热图
- UI面板
- 调试工具
12.6 第六阶段:集成测试(0.5天)
- 完整流程测试
- 性能Profiling
- 参数调优
- 文档更新
13. 风险评估
13.1 技术风险
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| 疲劳计算性能不足 | 中 | 中 | 局部更新,批量处理 |
| 裂纹判定过于频繁 | 低 | 高 | 提高阈值,减少检查 |
| 耐久度平衡困难 | 中 | 中 | 参数可调,快速迭代 |
13.2 设计风险
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| 疲劳积累过快 | 中 | 高 | 降低基础疲劳率,提供恢复机制 |
| 刀具失效过于突然 | 低 | 中 | 增加预警,渐进式失效 |
| 辅助功能滥用 | 低 | 低 | 限制使用时长,增加冷却 |
14. 已知限制
- 疲劳模型简化: 真实疲劳涉及复杂循环载荷,当前用近似模型
- 裂纹机制简化: 真实裂纹扩展遵循断裂力学,当前用概率模型
- 各向同性假设: 真实钢有晶粒取向,当前材料各向同性
15. 引用
- 对应需求: ../requirements/07-疲劳与刀具耐久度需求.md
- 总体架构: 00-锻造系统总体技术架构.md
- 原始设计文档(归档): ../_archive/plans/2026-01-23-疲劳累积与耐久度系统设计.md
- 相关专题(应力系统): 06-应力累积系统设计.md