docs: 添加应力与疲劳耐久度技术设计

design/06 涵盖四源应力(塑性/热/相变/残余)、扩散松弛、形变阻力、弯曲扭曲与开裂扩展。design/07 涵盖疲劳累积公式、疲劳裂纹、刀具耐久度计算、回火恢复与刀具失效判定。

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:58:47 +08:00
parent fbb2baa854
commit ec5e7556ae
2 changed files with 1217 additions and 0 deletions
+558
View File
@@ -0,0 +1,558 @@
# 应力累积系统设计
**项目**: BladeSmith
**文档类型**: 技术设计(专题)
**版本**: 2.0
**最后更新**: 2026-08-11
**状态**: 整合自原 `2026-01-23-应力累积系统设计.md`
> 本文档描述应力累积系统的技术实现。需求见 [../requirements/06-应力累积与开裂需求.md]。总体架构见 [00-锻造系统总体技术架构.md](00-锻造系统总体技术架构.md)。
---
## 1. 技术背景
应力累积系统模拟锻造过程中多来源应力(塑性应力、热应力、相变应力、残余应力)的产生、累积、扩散与松弛机制。系统通过应力对形变阻力的影响、物理表现(弯曲/扭曲/裂纹)以及辅助可视化功能,实现真实应力行为模拟。
---
## 2. 应力来源分类
### 2.1 塑性形变应力
**来源**: 锤击导致材料永久形变
**计算公式**:
```
Stress_plastic = k_plastic × StrainIncrement × Hardness
```
**参数说明**:
- `k_plastic = 10.0`: 塑性应力系数(可调)
- `StrainIncrement`: 本次锤击的应变增量
- `Hardness`: 当前硬度系数
**应用范围**: 锤击影响区域内的所有顶点
### 2.2 热应力
**来源**: 温度梯度导致内部膨胀不均匀
**计算公式**:
```
Stress_thermal = ThermalStressCoeff × CoolingRate × (T_current - 20°C)
```
**参数说明**:
- `ThermalStressCoeff = 0.005`: 热应力系数(可调)
- `CoolingRate`: 冷却速率(°C/s)
- `T_current`: 当前温度(°C)
- 20°C: 环境温度
**应用范围**: 所有体素和顶点
### 2.3 相变应力
**来源**: 马氏体转变导致体积膨胀
**计算公式**:
```
Stress_phase = PhaseStressCoeff × MartensiteFraction
```
**参数说明**:
- `PhaseStressCoeff = 50.0`: 相变应力系数(可调)
- `MartensiteFraction`: 马氏体转化比例
**马氏体转化比例公式**:
```
MartensiteFraction = clamp(CoolingRate / 80°C/s, 0, 1)
```
**应用范围**: 淬火区域的所有顶点
### 2.4 残余应力
**来源**: 锤击时周边材料限制形变
**计算公式**:
```
Stress_residual = k_residual × (TargetStrain - ActualStrain)
```
**参数说明**:
- `k_residual = 5.0`: 残余应力系数(可调)
- `TargetStrain`: 目标应变(基于锤击强度)
- `ActualStrain`: 实际应变(受限后)
**应用范围**: 锤击区域周边的顶点
---
## 3. 应力累积规则
### 3.1 总应力计算
**综合应力公式**:
```
TotalStress = Stress_plastic + Stress_thermal + Stress_phase + Stress_residual
```
**顶点更新**:
```
InternalStress += TotalStress × DeltaTime
```
### 3.2 应力限制
```
InternalStress = clamp(InternalStress, 0.0, MaxStress)
```
其中`MaxStress`为材料极限应力,可配置。
### 3.3 应力扩散机制
**目的**: 应力向周围顶点扩散,模拟真实物理行为
**拉普拉斯平滑**:
```
Stress_diffused = Stress_original + α × (AverageNeighborStress - Stress_original)
```
**参数说明**:
- `α`: 扩散系数(0.1-0.3,可调)
- `AverageNeighborStress`: 相邻顶点的平均应力
**实现方式**:
每帧对每个顶点执行扩散,迭代1-2次。
### 3.4 应力松弛机制
**温度驱动的松弛**:
**松弛因子**:
```
RelaxationFactor =
0.99 (T < 100°C, 常温慢松弛)
0.90 (200°C ≤ T < 400°C, 回火快松弛)
0.85 (T ≥ 400°C, 快速松弛)
```
**每帧更新**:
```
InternalStress = InternalStress × RelaxationFactor
```
**时间常数公式**:
```
InternalStress = InternalStress × exp(-t / τ)
```
**参数说明**:
- `t`: 时间(秒)
- `τ`: 松弛时间常数
- τ = 60秒(常温)
- τ = 10秒(回火温度)
---
## 4. 应力对形变阻力的影响
### 4.1 形变阻力公式
**DeformationResistance(形变阻力)**:
```
DeformationResistance = BaseResistance × HardnessFactor × StressFactor × TemperatureFactor
```
### 4.2 各因子详细公式
**基础阻力**:
```
BaseResistance = 1.0
```
**硬度因子**:
```
HardnessFactor = 1.0 + (Hardness / MaxHardness) × 2.0
```
硬度越高,形变阻力越大(最大3倍阻力)。
**应力因子**:
```
StressFactor = 1.0 + (InternalStress / StressLimit) × 1.5
```
应力越高,材料越难形变(最大2.5倍阻力)。
**温度因子**:
```
TemperatureFactor =
3.0 (T > 800°C, 高温软)
1.5 (500°C < T ≤ 800°C, 中温)
1.0 (T ≤ 500°C, 常温)
```
### 4.3 顶点位移计算
**锤击位移**:
```
Displacement = BaseDisplacement / DeformationResistance
```
**应力高的区域**:
- 更难锻打
- 需要更用力
- 或重复锤击
---
## 5. 应力物理表现
### 5.1 弯曲/扭曲机制
**弯曲角度公式**:
```
BendAngle = (StressLocal - StressAverage) × BendSensitivity
BendDirection = CrossProduct(HammerDirection, Normal)
```
**实现步骤**:
1. 计算应力梯度:
```
∇Stress = Stress_neighbor - Stress_center
```
2. 应用顶点位移:
```
VertexPosition += BendDirection × BendAngle × DistanceFromCenter
```
**扭曲公式**:
当材料两侧应力不均匀时:
```
TwistAngle = (Stress_Left - Stress_Right) × TwistSensitivity
VertexPosition = RotateAroundAxis(VertexPosition, Axis, TwistAngle)
```
**视觉效果**:
- 刀身沿应力梯度方向自然弯曲
- 应力集中区域出现扭曲
- 大幅应力差导致明显形变
### 5.2 裂纹起始判定
**临界应力阈值**:
```
CriticalStressThreshold = MaterialStrength × SafetyFactor
```
**参数说明**:
- `MaterialStrength`: 材料强度(可配置,默认100.0)
- `SafetyFactor`: 安全系数(默认1.2)
**开裂条件**:
```cpp
if (InternalStress > CriticalStressThreshold)
{
CreateCrack(Vertex);
}
```
**概率开裂**:
为避免一次性开裂过多,引入概率:
```
CrackProbability = (InternalStress / CriticalStressThreshold) - 1.0
if (Random() < CrackProbability)
{
CreateCrack(Vertex);
}
```
### 5.3 裂纹扩展机制
**裂纹生长方向**:
优先沿应力梯度方向扩展(应力最大方向)
**每帧检查**:
```cpp
if (Vertex.IsCracked)
{
// 裂纹扩展概率
ExtendProbability = (InternalStress / CriticalStressThreshold) - 0.8
if (Random() < ExtendProbability)
{
// 找到应力最高的相邻顶点
TargetNeighbor = FindMaxStressNeighbor();
CrackTo(TargetNeighbor);
}
}
```
**裂纹合并**:
当两条裂纹相交时:
- 大块材料脱落
- 网格拓扑断裂
- 几何处理: 删除被包围的顶点和三角形
### 5.4 裂纹视觉表现
**几何表现**:
1. **裂缝开口**:
```
CrackVertex.Position += Normal × CrackOpeningWidth
```
其中`CrackOpeningWidth`为裂缝开口宽度(可配置)
2. **边缘抖动**:
裂纹边缘顶点位置随机抖动,模拟粗糙断裂
**材质表现**:
1. **锈迹**:
- 裂纹区域显示RustTexture
- 锈迹深度基于裂纹时间
2. **内部氧化**:
- 裂缝深处更暗
- 模拟内部氧化
3. **纹理扰动**:
使用顶点法线扰动模拟裂纹纹理
**物理影响**:
- 裂纹区域的硬度系数降为0.3
- 裂纹顶点不再参与后续锻打形变(断裂)
### 5.5 应力释放事件
**开裂后应力释放**:
```cpp
if (CrackCreated)
{
InternalStress = InternalStress × 0.3 // 应力释放
// 释放应力用于下次计算
}
```
**回火对应力的影响**:
加热至回火温度(200-400°C):
- 加速应力松弛(详见松弛机制)
- 但如果已经开裂,裂纹无法愈合
---
## 6. 应力可视化(辅助功能)
### 6.1 应力扫描模式
**触发方式**:
- 按住特定键切换到"应力视图"
- 或在UI中选择"应力扫描"工具
### 6.2 视觉效果
**顶点颜色着色**(彩虹色谱):
```hlsl
// 蓝色:低应力(< 30% StressLimit)
if (Stress < 0.3 × StressLimit)
{
Color = Lerp(Blue, Green, StressRatio);
}
// 绿色:中等应力(30-60% StressLimit)
else if (Stress < 0.6 × StressLimit)
{
Color = Lerp(Green, Yellow, StressRatio);
}
// 黄色:高应力(60-90% StressLimit)
else if (Stress < 0.9 × StressLimit)
{
Color = Lerp(Yellow, Red, StressRatio);
}
// 红色:接近开裂(≥ 90% StressLimit)
else
{
Color = Red;
// 叠加闪烁效果
Emissive = Flicker();
}
```
**应力流线**(可选):
- 显示应力传导路径
- 从高应力区域流向低应力区域
- 帮助理解应力分布
### 6.3 UI面板
- 实时显示最大应力值
- 平均应力值
- 超阈值顶点数量
- 裂纹数量
### 6.4 退出可视化
释放辅助功能键后,完全恢复正常视觉表现:
- 顶点颜色恢复到正常状态(打磨度、回火色等)
- 材质参数恢复
- 无任何残留效果
---
## 7. 实现架构
### 7.1 GPU-CPU分工
**GPU Compute Shader职责**:
- 热应力计算
- 应力扩散(简化版)
**CPU职责**:
- 塑性应力计算
- 相变应力应用
- 残余应力计算
- 应力累积
- 形变阻力计算
- 弯曲/扭曲应用
- 裂纹判定与扩展
- 应力扫描可视化
### 7.2 数据结构
**顶点属性扩展**:
```cpp
TDynamicMeshVertexAttribute<float>* InternalStress; // 内部应力值
TDynamicMeshVertexAttribute<uint8>* CrackState; // 裂纹状态(0=无, 1=有)
```
**裂纹数据结构**:
```cpp
USTRUCT(BlueprintType)
struct FCrackData
{
GENERATED_BODY()
UPROPERTY()
int32 StartVertex; // 裂纹起始顶点ID
UPROPERTY()
int32 EndVertex; // 裂纹结束顶点ID
UPROPERTY()
float CrackWidth; // 裂纹宽度
UPROPERTY()
float CrackDepth; // 裂纹深度
UPROPERTY()
float CreationTime; // 创建时间
};
```
### 7.3 性能优化
**应力扩散**:
- 只在锤击后更新,每帧不需要
- 局部扩散,仅受影响区域
**裂纹判定**:
- 仅在高应力区域检查
- 使用空间分区加速
**可视化**:
- 应力扫描模式按需启用
- 使用简化着色器
---
## 8. 参数配置
### 8.1 可调参数(蓝图可配)
| 参数名 | 默认值 | 范围 | 说明 |
|-------|--------|------|------|
| `MaxStress` | 150.0 | 100-200 | 最大应力值 |
| `k_plastic` | 10.0 | 5-20 | 塑性应力系数 |
| `ThermalStressCoeff` | 0.005 | 0.001-0.01 | 热应力系数 |
| `PhaseStressCoeff` | 50.0 | 20-100 | 相变应力系数 |
| `k_residual` | 5.0 | 2-10 | 残余应力系数 |
| `DiffusionAlpha` | 0.2 | 0.1-0.3 | 扩散系数 |
| `BendSensitivity` | 0.001 | 0.0005-0.002 | 弯曲敏感度 |
| `TwistSensitivity` | 0.0005 | 0.0002-0.001 | 扭曲敏感度 |
| `CriticalStressThreshold` | 120.0 | 80-150 | 临界应力 |
| `CrackOpeningWidth` | 0.05 | 0.01-0.1 | 裂纹宽度 |
| `RelaxationTimeNormal` | 60.0 | 30-120 | 常温松弛时间 |
| `RelaxationTimeTemper` | 10.0 | 5-20 | 回火松弛时间 |
### 8.2 调试工具
- 应力热图:实时显示应力分布
- 裂纹追踪:记录裂纹生成和扩展
- 应力时间线:记录应力变化历史
- 统计面板:最大应力、平均应力、裂纹数量
---
## 9. 实施计划
### 9.1 第一阶段:应力计算(1天)
- 四种应力来源实现
- 应力累积规则
- 应力扩散机制
- 应力松弛机制
- 单元测试
### 9.2 第二阶段:形变阻力(0.5天)
- 形变阻力公式
- 顶点位移计算
- 参数调优
- 集成测试
### 9.3 第三阶段:物理表现(1.5天)
- 弯曲/扭曲机制
- 裂纹起始判定
- 裂纹扩展逻辑
- 裂纹视觉表现
- 几何处理(裂纹开口、抖动)
- 材质表现(锈迹、氧化)
### 9.4 第四阶段:辅助功能(0.5天)
- 应力扫描模式
- 顶点颜色着色
- UI面板
- 应力流线(可选)
### 9.5 第五阶段:集成测试(0.5天)
- 完整流程测试
- 性能Profiling
- 参数调优
- 文档更新
---
## 10. 已知限制
1. **应力张量简化**: 真实是3×3张量,当前仅用单值
2. **各向同性假设**: 真实钢有晶粒取向,当前材料各向同性
3. **简化扩散**: 真实应力扩散是复杂偏微分方程,当前用拉普拉斯近似
---
## 11. 引用
- 对应需求: [../requirements/06-应力累积与开裂需求.md](../requirements/06-应力累积与开裂需求.md)
- 总体架构: [00-锻造系统总体技术架构.md](00-锻造系统总体技术架构.md)
- 原始设计文档(归档): [../_archive/plans/2026-01-23-应力累积系统设计.md](../_archive/plans/2026-01-23-应力累积系统设计.md)
- 相关专题(物理模拟): [04-物理模拟-加工硬化与晶粒演化设计.md](04-物理模拟-加工硬化与晶粒演化设计.md)
- 相关专题(淬火系统): [05-淬火退火相变系统设计.md](05-淬火退火相变系统设计.md)
- 相关专题(疲劳系统): [07-疲劳与耐久度系统设计.md](07-疲劳与耐久度系统设计.md)
@@ -0,0 +1,659 @@
# 疲劳与耐久度系统设计
**项目**: BladeSmith
**文档类型**: 技术设计(专题)
**版本**: 2.0
**最后更新**: 2026-08-11
**状态**: 整合自原 `2026-01-23-疲劳累积与耐久度系统设计.md`
> 本文档描述疲劳累积与耐久度系统的技术实现。需求见 [../requirements/07-疲劳与刀具耐久度需求.md]。总体架构见 [00-锻造系统总体技术架构.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 判定过度锻打
```cpp
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 视觉效果
**顶点颜色着色**:
```hlsl
// 蓝色:疲劳值 < 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 疲劳裂纹起始
**触发条件**:
```cpp
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 疲劳裂纹扩展
**每次锻打检查**:
```cpp
if (Vertex.IsCracked && CrackType == Fatigue)
{
// 裂纹扩展概率
ExtendProbability = (Fatigue - 0.7) × 2.0
if (Random() < ExtendProbability)
{
// 找到疲劳值最高的相邻顶点
TargetNeighbor = FindMaxFatigueNeighbor();
CrackTo(TargetNeighbor);
}
}
```
**疲劳裂纹特点**:
- 沿高疲劳值方向扩展
- 扩展速度与疲劳值成正比
- 可能产生多条细小裂纹(应力裂纹通常是单条)
### 4.3 疲劳裂纹视觉表现
**几何表现**:
1. **细小裂缝**:
- 开口宽度较小(0.01-0.02)
- 多条裂纹可能交织
2. **边缘锯齿**:
- 裂纹边缘不光滑
- 顶点位置随机抖动
**材质表现**:
1. **表面氧化**:
- 显示轻微锈迹
- 氧化程度与时间相关
2. **内部损伤**:
- 深处 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 耐久度实时更新
**每次使用后**:
```cpp
// 重新计算耐久度
Durability = CalculateDurability();
// 更新UI
UpdateDurabilityUI();
```
---
## 7. 耐久度恢复机制
### 7.1 回火恢复
**加热至回火温度**(200-400°C):
**疲劳恢复**:
```cpp
if (Temperature > 200°C && Temperature < 400°C)
{
Fatigue -= 0.1 × DeltaTime; // 慢慢消除疲劳
Fatigue = clamp(Fatigue, 0.0, 1.0);
}
```
**耐久度恢复**:
```cpp
if (Temperature > 200°C && Temperature < 400°C)
{
Durability += 0.05 × DeltaTime;
Durability = clamp(Durability, 0.0, 1.0);
}
```
**注意事项**:
- 疲劳可部分恢复
- 但裂纹无法愈合
- 裂纹惩罚永久存在
### 7.2 打磨恢复
**打磨操作**:
**表面损伤修复**:
- 打磨可去除表面疲劳痕迹
- 减少视觉上的"老伤"
**疲劳影响**:
```cpp
if (PolishAmount > OldPolishAmount)
{
Fatigue -= (PolishAmount - OldPolishAmount) × 0.5;
Fatigue = clamp(Fatigue, 0.0, 1.0);
}
```
**耐久度影响**:
- 打磨不恢复耐久度
- 但可以改善外观
---
## 8. 刀具失效判定
### 8.1 失效条件
**条件1: 耐久度耗尽**:
```cpp
if (Durability < 0.0)
{
BreakWeapon();
}
```
**条件2: 主裂纹存在**:
```cpp
if (MajorCrackExists)
{
// 主裂纹判定:长度超过阈值或穿过关键区域
if (CrackLength > MajorCrackThreshold || CrackThroughCriticalArea)
{
BreakWeapon();
}
}
```
**条件3: 瞬时过载**:
```cpp
if (ImpactForce > UltimateStrength)
{
// 瞬间断裂
InstantBreakWeapon();
}
```
### 8.2 失效表现
**几何表现**:
1. **断裂**:
- 刀身分离成两段
- 网格拓扑断裂
- 删除断裂部分的顶点和三角形
2. **破碎**:
- 多个小碎片
- 适合薄刃刀具
**材质表现**:
1. **断口**:
- 显示粗糙断裂面
- 颜色暗淡
- 无光泽
2. **音效**:
- 断裂音效
- 碎片掉落声
**物理表现**:
- 断裂部分掉落
- 受重力影响
- 碰撞地面产生音效
---
## 9. 实现架构
### 9.1 数据结构
**顶点属性扩展**:
```cpp
TDynamicMeshVertexAttribute<float>* FatigueValue; // 疲劳值(0-1)
```
**裂纹数据结构**:
```cpp
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; // 是否主裂纹
};
```
**刀具耐久度数据**:
```cpp
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 裂纹判定优化
**阈值检查**:
```cpp
// 仅检查接近阈值的顶点
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. 已知限制
1. **疲劳模型简化**: 真实疲劳涉及复杂循环载荷,当前用近似模型
2. **裂纹机制简化**: 真实裂纹扩展遵循断裂力学,当前用概率模型
3. **各向同性假设**: 真实钢有晶粒取向,当前材料各向同性
---
## 15. 引用
- 对应需求: [../requirements/07-疲劳与刀具耐久度需求.md](../requirements/07-疲劳与刀具耐久度需求.md)
- 总体架构: [00-锻造系统总体技术架构.md](00-锻造系统总体技术架构.md)
- 原始设计文档(归档): [../_archive/plans/2026-01-23-疲劳累积与耐久度系统设计.md](../_archive/plans/2026-01-23-疲劳累积与耐久度系统设计.md)
- 相关专题(应力系统): [06-应力累积系统设计.md](06-应力累积系统设计.md)