Files
BladeSmith/docs/_archive/plans/2026-01-23-疲劳累积与耐久度系统设计.md
starmen1265 56cb314799 docs: 归档原 plans 目录,迁移实施清单到 impl/
原 docs/plans/ 下的 10 份混合文档(需求+设计混杂)归档到 docs/_archive/plans/ 作为决策考古用途。hammer-deformation-enhancement 实施清单迁移到 docs/impl/。后续工作产出统一进入 docs/requirements/ 与 docs/design/ 两个清晰分层。

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-08-11 08:57:46 +08:00

12 KiB
Raw Permalink Blame History

疲劳累积与耐久度系统设计

项目: 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 疲劳裂纹视觉表现

几何表现:

  1. 细小裂缝:

    • 开口宽度较小(0.01-0.02)
    • 多条裂纹可能交织
  2. 边缘锯齿:

    • 裂纹边缘不光滑
    • 顶点位置随机抖动

材质表现:

  1. 表面氧化:

    • 显示轻微锈迹
    • 氧化程度与时间相关
  2. 内部损伤:

    • 深处 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 失效表现

几何表现:

  1. 断裂:

    • 刀身分离成两段
    • 网格拓扑断裂
    • 删除断裂部分的顶点和三角形
  2. 破碎:

    • 多个小碎片
    • 适合薄刃刀具

材质表现:

  1. 断口:

    • 显示粗糙断裂面
    • 颜色暗淡
    • 无光泽
  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 状态: 设计完成,待评审