12 KiB
12 KiB
疲劳累积与耐久度系统设计
项目: BladeSmith 日期: 2026-01-23 目标: 模拟材料疲劳和刀具耐久度 设计原则: 累积式疲劳,可恢复耐久度
1. 疲劳累积机制
1.1 疲劳值定义
疲劳值(Fatigue):
- 范围:0(完好)到 1(完全疲劳/失效)
- 每个顶点独立维护
- 累积式,不可逆(除非回火)
1.2 疲劳累积规则
基础公式:
Fatigue += BaseFatigueRate × StressFactor × TemperatureFactor × DeltaTime
1.3 各因子详细说明
基础疲劳率(BaseFatigueRate):
| 锻打类型 | BaseFatigueRate | 说明 |
|---|---|---|
| 正常锻打 | 0.001 | 标准锤击 |
| 过度锻打 | 0.005 | 形变过大(超过阈值) |
| 应力集中 | 0.010 | 高应力区域 |
判定过度锻打:
if (StrainIncrement > CriticalStrainThreshold)
{
BaseFatigueRate = 0.005; // 过度锻打
}
应力因子:
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
温度因子:
TemperatureFactor =
0.1 (T > 800°C, 高温疲劳慢)
1.0 (常温)
2.0 (T < 200°C, 低温疲劳快)
高温时材料更"柔软",疲劳较慢;低温时更"脆",疲劳快。
1.4 疲劳限制
Fatigue = clamp(Fatigue, 0.0, 1.0)
疲劳值达到1.0后不再增加,但可能触发失效。
2. 疲劳可视化(辅助功能)
2.1 疲劳扫描模式
触发方式:
- 玩家按住特定键(如Shift键)切换到"疲劳视图"
- 或在UI中选择"疲劳扫描"工具
2.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;
}
2.3 UI面板
- 平均疲劳值
- 最大疲劳值
- 危险区域数量(Fatigue > 0.9)
- 预估寿命
2.4 退出可视化
释放辅助功能键后,完全恢复正常视觉表现。
3. 疲劳裂纹系统
3.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
3.2 疲劳裂纹扩展
每次锻打检查:
if (Vertex.IsCracked && CrackType == Fatigue)
{
// 裂纹扩展概率
ExtendProbability = (Fatigue - 0.7) × 2.0
if (Random() < ExtendProbability)
{
// 找到疲劳值最高的相邻顶点
TargetNeighbor = FindMaxFatigueNeighbor();
CrackTo(TargetNeighbor);
}
}
疲劳裂纹特点:
- 沿高疲劳值方向扩展
- 扩展速度与疲劳值成正比
- 可能产生多条细小裂纹(应力裂纹通常是单条)
3.3 疲劳裂纹视觉表现
几何表现:
-
细小裂缝:
- 开口宽度较小(0.01-0.02)
- 多条裂纹可能交织
-
边缘锯齿:
- 裂纹边缘不光滑
- 顶点位置随机抖动
材质表现:
-
表面氧化:
- 显示轻微锈迹
- 氧化程度与时间相关
-
内部损伤:
- 深处 darker
- 模拟材料损伤
4. 耐久度系统
4.1 耐久度定义
耐久度(Durability):
- 范围:0(损坏)到 1.0(完好)
- 基于整个刀具计算
- 影响刀具使用效果
4.2 耐久度计算公式
综合耐久度:
Durability = 1.0 - (AverageFatigue + CrackPenalty + StressPenalty)
各分量说明:
平均疲劳:
AverageFatigue = Σ(Fatigue_i) / VertexCount
裂纹惩罚:
CrackPenalty = CrackCount × 0.1 // 每条裂纹扣10%耐久
裂纹包括:
- 应力裂纹(由应力超阈值产生)
- 疲劳裂纹(由疲劳累积产生)
应力惩罚:
StressPenalty = (MaxStress / StressLimit) × 0.2
高应力区域最高扣除20%耐久度。
4.3 耐久度限制
Durability = clamp(Durability, 0.0, 1.0)
耐久度降到0后刀具可能失效。
5. 使用中的损伤累积
5.1 刀具使用场景
切割/砍击:
- 每次使用造成冲击
- 冲击点附近疲劳增加
抛光/打磨:
- 减少疲劳(回火效果)
- 恢复部分耐久度
5.2 冲击疲劳计算
冲击应力:
ImpactStress = ImpactForce × MaterialStiffness × (1 - ImpactAngle)
其中:
ImpactForce: 冲击力(来自物理引擎)MaterialStiffness: 材料刚度ImpactAngle: 冲击角度(0-1,垂直=1.0)
疲劳增量:
Fatigue += ImpactStress / Durability × FatigueRate
其中:
FatigueRate: 疲劳率(可配置,默认0.0001)
局部更新: 冲击影响半径内的顶点更新疲劳值。
5.3 耐久度实时更新
每次使用后:
// 重新计算耐久度
Durability = CalculateDurability();
// 更新UI
UpdateDurabilityUI();
6. 耐久度恢复机制
6.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);
}
注意事项:
- 疲劳可部分恢复
- 但裂纹无法愈合
- 裂纹惩罚永久存在
6.2 打磨恢复
打磨操作:
表面损伤修复:
- 打磨可去除表面疲劳痕迹
- 减少视觉上的"老伤"
疲劳影响:
if (PolishAmount > OldPolishAmount)
{
Fatigue -= (PolishAmount - OldPolishAmount) × 0.5;
Fatigue = clamp(Fatigue, 0.0, 1.0);
}
耐久度影响:
- 打磨不恢复耐久度
- 但可以改善外观
7. 刀具失效判定
7.1 失效条件
条件1: 耐久度耗尽:
if (Durability < 0.0)
{
BreakWeapon();
}
条件2: 主裂纹存在:
if (MajorCrackExists)
{
// 主裂纹判定:长度超过阈值或穿过关键区域
if (CrackLength > MajorCrackThreshold || CrackThroughCriticalArea)
{
BreakWeapon();
}
}
条件3: 瞬时过载:
if (ImpactForce > UltimateStrength)
{
// 瞬间断裂
InstantBreakWeapon();
}
7.2 失效表现
几何表现:
-
断裂:
- 刀身分离成两段
- 网格拓扑断裂
- 删除断裂部分的顶点和三角形
-
破碎:
- 多个小碎片
- 适合薄刃刀具
材质表现:
-
断口:
- 显示粗糙断裂面
- 颜色暗淡
- 无光泽
-
音效:
- 断裂音效
- 碎片掉落声
物理表现:
- 断裂部分掉落
- 受重力影响
- 碰撞地面产生音效
8. 实现架构
8.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; // 主裂纹数量
};
8.2 GPU-CPU分工
GPU Compute Shader职责:
- 无(疲劳计算纯CPU)
CPU职责:
- 疲劳累积计算
- 疲劳裂纹判定
- 裂纹扩展逻辑
- 耐久度计算
- 使用中的损伤累积
- 回火/打磨恢复
- 刀具失效判定
- 疲劳扫描可视化
9. 性能优化
9.1 疲劳计算优化
局部更新:
- 锤击时仅更新受影响区域
- 使用空间分区加速查询
批量更新:
- 每帧最多更新N个顶点
- 使用优先级队列(高疲劳优先)
9.2 裂纹判定优化
阈值检查:
// 仅检查接近阈值的顶点
if (Fatigue > 0.8 && InternalStress > 0.5 × StressLimit)
{
// 检查裂纹
}
空间分区:
- 使用八叉树或BVH
- 快速查询相邻顶点
9.3 可视化优化
疲劳扫描:
- 按需启用
- 使用简化着色器
- 降低更新频率
10. 参数配置
10.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 | 主裂纹长度阈值 |
10.2 调试工具
- 疲劳热图:实时显示疲劳分布
- 疲劳时间线:记录疲劳变化历史
- 裂纹追踪:记录裂纹生成和扩展
- 耐久度面板:实时显示耐久度
- 预估寿命:基于当前疲劳率预估
11. 实施计划
11.1 第一阶段:疲劳累积(1天)
- 疲劳值属性系统
- 疲劳累积规则
- 应力和温度因子
- 疲劳限制
- 单元测试
11.2 第二阶段:疲劳裂纹(1天)
- 疲劳裂纹起始判定
- 疲劳裂纹扩展逻辑
- 疲劳裂纹视觉表现
- 集成测试
11.3 第三阶段:耐久度系统(1天)
- 耐久度计算公式
- 使用中的损伤累积
- 回火/打磨恢复
- 耐久度UI
- 集成测试
11.4 第四阶段:刀具失效(0.5天)
- 失效条件判定
- 失效表现(几何/材质/音效)
- 集成测试
11.5 第五阶段:辅助功能(0.5天)
- 疲劳扫描模式
- 疲劳热图
- UI面板
- 调试工具
11.6 第六阶段:集成测试(0.5天)
- 完整流程测试
- 性能Profiling
- 参数调优
- 文档更新
12. 风险评估
12.1 技术风险
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| 疲劳计算性能不足 | 中 | 中 | 局部更新,批量处理 |
| 裂纹判定过于频繁 | 低 | 高 | 提高阈值,减少检查 |
| 耐久度平衡困难 | 中 | 中 | 参数可调,快速迭代 |
12.2 设计风险
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| 疲劳积累过快,玩家受挫 | 中 | 高 | 降低基础疲劳率,提供恢复机制 |
| 刀具失效过于突然 | 低 | 中 | 增加预警,渐进式失效 |
| 辅助功能滥用 | 低 | 低 | 限制使用时长,增加冷却 |
文档版本: 1.0 最后更新: 2026-01-23 状态: 设计完成,待评审