diff --git a/docs/plans/2026-01-23-应力累积系统设计.md b/docs/plans/2026-01-23-应力累积系统设计.md new file mode 100644 index 0000000..267a313 --- /dev/null +++ b/docs/plans/2026-01-23-应力累积系统设计.md @@ -0,0 +1,530 @@ +# 应力累积系统设计 + +**项目**: BladeSmith +**日期**: 2026-01-23 +**目标**: 模拟多来源应力累积与物理表现 +**设计原则**: 真实物理表现优先,辅助功能可选 + +--- + +## 1. 应力来源分类 + +### 1.1 塑性形变应力 + +**来源**: 锤击导致材料永久形变 + +**计算公式**: +``` +Stress_plastic = k_plastic × StrainIncrement × Hardness +``` + +**参数说明**: +- `k_plastic = 10.0`: 塑性应力系数(可调) +- `StrainIncrement`: 本次锤击的应变增量 +- `Hardness`: 当前硬度系数 + +**应用范围**: 锤击影响区域内的所有顶点 + +### 1.2 热应力 + +**来源**: 温度梯度导致内部膨胀不均匀 + +**计算公式**: +``` +Stress_thermal = ThermalStressCoeff × CoolingRate × (T_current - 20°C) +``` + +**参数说明**: +- `ThermalStressCoeff = 0.005`: 热应力系数(可调) +- `CoolingRate`: 冷却速率(°C/s) +- `T_current`: 当前温度(°C) +- 20°C: 环境温度 + +**应用范围**: 所有体素和顶点 + +### 1.3 相变应力 + +**来源**: 马氏体转变导致体积膨胀 + +**计算公式**: +``` +Stress_phase = PhaseStressCoeff × MartensiteFraction +``` + +**参数说明**: +- `PhaseStressCoeff = 50.0`: 相变应力系数(可调) +- `MartensiteFraction`: 马氏体转化比例 + ``` + MartensiteFraction = clamp(CoolingRate / 80°C/s, 0, 1) + ``` + +**应用范围**: 淬火区域的所有顶点 + +### 1.4 残余应力 + +**来源**: 锤击时周边材料限制形变 + +**计算公式**: +``` +Stress_residual = k_residual × (TargetStrain - ActualStrain) +``` + +**参数说明**: +- `k_residual = 5.0`: 残余应力系数(可调) +- `TargetStrain`: 目标应变(基于锤击强度) +- `ActualStrain`: 实际应变(受限后) + +**应用范围**: 锤击区域周边的顶点 + +--- + +## 2. 应力累积规则 + +### 2.1 总应力计算 + +**综合应力公式**: +``` +TotalStress = Stress_plastic + Stress_thermal + Stress_phase + Stress_residual +``` + +**顶点更新**: +``` +InternalStress += TotalStress × DeltaTime +``` + +**应力限制**: +``` +InternalStress = clamp(InternalStress, 0.0, MaxStress) +``` + +其中`MaxStress`为材料极限应力,可配置。 + +### 2.2 应力扩散机制 + +**目的**: 应力向周围顶点扩散,模拟真实物理行为 + +**拉普拉斯平滑**: +``` +Stress_diffused = Stress_original + α × (AverageNeighborStress - Stress_original) +``` + +**参数说明**: +- `α`: 扩散系数(0.1-0.3,可调) +- `AverageNeighborStress`: 相邻顶点的平均应力 + +**实现方式**: +每帧对每个顶点执行扩散,迭代1-2次。 + +### 2.3 应力松弛机制 + +**温度驱动的松弛**: + +**松弛因子**: +``` +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秒(回火温度) + +--- + +## 3. 应力对形变阻力的影响 + +### 3.1 形变阻力公式 + +**DeformationResistance(形变阻力)**: +``` +DeformationResistance = BaseResistance × HardnessFactor × StressFactor × TemperatureFactor +``` + +### 3.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, 常温) +``` + +### 3.3 顶点位移计算 + +**锤击位移**: +``` +Displacement = BaseDisplacement / DeformationResistance +``` + +**应力高的区域**: +- 更难锻打 +- 需要更用力 +- 或重复锤击 + +--- + +## 4. 应力物理表现 + +### 4.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) +``` + +**视觉效果**: +- 刀身沿应力梯度方向自然弯曲 +- 应力集中区域出现扭曲 +- 大幅应力差导致明显形变 + +### 4.2 裂纹起始判定 + +**临界应力阈值**: +``` +CriticalStressThreshold = MaterialStrength × SafetyFactor +``` + +其中: +- `MaterialStrength`: 材料强度(可配置,默认100.0) +- `SafetyFactor`: 安全系数(默认1.2) + +**开裂条件**: +``` +if (InternalStress > CriticalStressThreshold) +{ + CreateCrack(Vertex); +} +``` + +**概率开裂**: +为避免一次性开裂过多,引入概率: +``` +CrackProbability = (InternalStress / CriticalStressThreshold) - 1.0 +if (Random() < CrackProbability) +{ + CreateCrack(Vertex); +} +``` + +### 4.3 裂纹扩展机制 + +**裂纹生长方向**: +优先沿应力梯度方向扩展(应力最大方向) + +**每帧检查**: +``` +if (Vertex.IsCracked) +{ + // 裂纹扩展概率 + ExtendProbability = (InternalStress / CriticalStressThreshold) - 0.8 + + if (Random() < ExtendProbability) + { + // 找到应力最高的相邻顶点 + TargetNeighbor = FindMaxStressNeighbor(); + CrackTo(TargetNeighbor); + } +} +``` + +**裂纹合并**: +当两条裂纹相交时: +- 大块材料脱落 +- 网格拓扑断裂 +- 几何处理: 删除被包围的顶点和三角形 + +### 4.4 裂纹视觉表现 + +**几何表现**: +1. **裂缝开口**: + ``` + CrackVertex.Position += Normal × CrackOpeningWidth + ``` + 其中`CrackOpeningWidth`为裂缝开口宽度(可配置) + +2. **边缘抖动**: + 裂纹边缘顶点位置随机抖动,模拟粗糙断裂 + +**材质表现**: +1. **锈迹**: + - 裂纹区域显示RustTexture + - 锈迹深度基于裂纹时间 + +2. **内部氧化**: + - 裂缝深处更暗 + - 模拟内部氧化 + +3. **纹理扰动**: + 使用顶点法线扰动模拟裂纹纹理 + +**物理影响**: +- 裂纹区域的硬度系数降为0.3 +- 裂纹顶点不再参与后续锻打形变(断裂) + +### 4.5 应力释放事件 + +**开裂后应力释放**: +``` +if (CrackCreated) +{ + InternalStress = InternalStress × 0.3 // 应力释放 + // 释放应力用于下次计算 +} +``` + +**回火对应力的影响**: +加热至回火温度(200-400°C): +- 加速应力松弛(详见松弛机制) +- 但如果已经开裂,裂纹无法愈合 + +--- + +## 5. 应力可视化(辅助功能) + +### 5.1 应力扫描模式 + +**触发方式**: +- 玩家按住特定键(如Alt键)切换到"应力视图" +- 或在UI中选择"应力扫描"工具 + +**视觉效果**: + +**顶点颜色着色**(彩虹色谱): +``` +// 蓝色:低应力(< 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(); +} +``` + +**应力流线**(可选): +- 显示应力传导路径 +- 从高应力区域流向低应力区域 +- 帮助玩家理解应力分布 + +**UI面板**: +- 实时显示最大应力值 +- 平均应力值 +- 超阈值顶点数量 +- 裂纹数量 + +### 5.2 退出可视化 + +**恢复正常视觉**: +释放辅助功能键后,完全恢复正常视觉表现: +- 顶点颜色恢复到正常状态(打磨度、回火色等) +- 材质参数恢复 +- 无任何残留效果 + +--- + +## 6. 实现架构 + +### 6.1 GPU-CPU分工 + +**GPU Compute Shader职责**: +- 热应力计算 +- 应力扩散(简化版) + +**CPU职责**: +- 塑性应力计算 +- 相变应力应用 +- 残余应力计算 +- 应力累积 +- 形变阻力计算 +- 弯曲/扭曲应用 +- 裂纹判定与扩展 +- 应力扫描可视化 + +### 6.2 数据结构 + +**顶点属性扩展**: +```cpp +TDynamicMeshVertexAttribute* InternalStress; // 内部应力值 +TDynamicMeshVertexAttribute* 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; // 创建时间 +}; +``` + +### 6.3 性能优化 + +**应力扩散**: +- 只在锤击后更新,每帧不需要 +- 局部扩散,仅受影响区域 + +**裂纹判定**: +- 仅在高应力区域检查 +- 使用空间分区加速 + +**可视化**: +- 应力扫描模式按需启用 +- 使用简化着色器 + +--- + +## 7. 参数配置 + +### 7.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 | 回火松弛时间 | + +### 7.2 调试工具 + +- 应力热图:实时显示应力分布 +- 裂纹追踪:记录裂纹生成和扩展 +- 应力时间线:记录应力变化历史 +- 统计面板:最大应力、平均应力、裂纹数量 + +--- + +## 8. 实施计划 + +### 8.1 第一阶段:应力计算(1天) + +- [ ] 四种应力来源实现 +- [ ] 应力累积规则 +- [ ] 应力扩散机制 +- [ ] 应力松弛机制 +- [ ] 单元测试 + +### 8.2 第二阶段:形变阻力(0.5天) + +- [ ] 形变阻力公式 +- [ ] 顶点位移计算 +- [ ] 参数调优 +- [ ] 集成测试 + +### 8.3 第三阶段:物理表现(1.5天) + +- [ ] 弯曲/扭曲机制 +- [ ] 裂纹起始判定 +- [ ] 裂纹扩展逻辑 +- [ ] 裂纹视觉表现 +- [ ] 几何处理(裂纹开口、抖动) +- [ ] 材质表现(锈迹、氧化) + +### 8.4 第四阶段:辅助功能(0.5天) + +- [ ] 应力扫描模式 +- [ ] 顶点颜色着色 +- [ ] UI面板 +- [ ] 应力流线(可选) + +### 8.5 第五阶段:集成测试(0.5天) + +- [ ] 完整流程测试 +- [ ] 性能Profiling +- [ ] 参数调优 +- [ ] 文档更新 + +--- + +**文档版本**: 1.0 +**最后更新**: 2026-01-23 +**状态**: 设计完成,待评审 diff --git a/docs/plans/2026-01-23-淬火退火相变与应力疲劳系统总览.md b/docs/plans/2026-01-23-淬火退火相变与应力疲劳系统总览.md new file mode 100644 index 0000000..4b205d5 --- /dev/null +++ b/docs/plans/2026-01-23-淬火退火相变与应力疲劳系统总览.md @@ -0,0 +1,424 @@ +# 淬火退火相变与应力疲劳系统总览 + +**项目**: BladeSmith +**日期**: 2026-01-23 +**目标**: 实现游戏娱乐级的高真实度冶金学物理系统 +**性能目标**: 60 FPS @ 锤击操作 + +--- + +## 1. 设计目标 + +### 1.1 核心物理现象 + +实现以下冶金学物理过程: + +1. **淬火硬化(马氏体相变)** + - 快速冷却改变晶体结构 + - 极大提升硬度和脆性 + - 温度区间与冷却速率双参数控制 + +2. **退火/回火机制** + - 重新加热软化材料 + - 应力松弛,硬度降低 + - 可逆性支持(可多次热处理) + +3. **应力累积与松弛** + - 多来源应力:塑性形变、热应力、相变应力、残余应力 + - 应力影响形变阻力和开裂风险 + - 温度驱动的应力松弛机制 + +4. **疲劳累积与耐久度** + - 反复锻打导致的材料疲劳 + - 裂纹起始与扩展机制 + - 刀具使用中的耐久度系统 + +### 1.2 设计原则 + +- **游戏体验优先**: 简化物理模型,保留核心机制,60 FPS性能 +- **三阶段可视化**: 淬火过程高辨识度→冷却过渡→真实物理表现 +- **渐进式实现**: 分阶段开发,每阶段可独立运行 +- **架构扩展性**: 为未来功能预留接口 +- **YAGNI原则**: 避免过度设计,专注核心功能 + +--- + +## 2. 整体架构方案 + +### 2.1 混合体素-顶点架构 + +**核心思想**: 体素存储"物理场",顶点存储"材料历史" + +``` +┌─────────────────────────────────────────────────────────┐ +│ 锤击输入 │ +└─────────────────┬───────────────────────────────────────┘ + │ + ┌────────┴────────┐ + │ │ + ┌────▼─────┐ ┌─────▼────┐ + │ 体素层 │ │ 顶点层 │ + │ (GPU) │ │ (GPU) │ + └────┬─────┘ └─────┬────┘ + │ │ + │ 双向采样通信 │ + └────────┬────────┘ + │ + ┌────────▼────────┐ + │ 渲染 & 显示 │ + └─────────────────┘ +``` + +### 2.2 体素层(全局物理场) + +**存储内容**: +- 温度场(已有) +- 冷却速率场(用于淬火判定) +- 相态标记(0=奥氏体, 1=马氏体, 2=珠光体, 3=开裂) + +**分辨率**: 50×50×50(可配置) +**更新方式**: GPU Compute Shader(Ping-Pong双缓冲) + +### 2.3 顶点层(局部材料历史) + +**存储内容**: +- 硬度系数(影响形变阻力) +- 脆性系数(影响开裂风险) +- 内部应力值(标量简化) +- 疲劳值(0-1,影响耐久度) +- 相态标记(从体素采样) +- 回火颜色(用于真实视觉表现) +- 氧化层度数(用于氧化层表现) +- 打磨度(表面状态) + +**数量**: 20-50万顶点(基础) + +### 2.4 数据流 + +``` +锤击事件 + ↓ +1. 形变计算(顶点位移) + ↓ +2. 应力累积(塑性应力+残余应力) + ↓ +3. 从温度体素采样相态和材料参数 + ↓ +4. 硬度/脆性计算(基于相变+冷却速率) + ↓ +5. 更新顶点属性(硬度、应力、疲劳) + ↓ +6. 应力扩散与松弛 + ↓ +7. 疲劳累积与裂纹判定 + ↓ +8. 材质可视化更新 +``` + +--- + +## 3. 子系统概述 + +### 3.1 淬火退火相变系统 + +**目标**: 实现基于温度和冷却速率的真实热处理效果 + +**核心机制**: +- 温度区间判定(800-1200°C) +- 冷却速率计算(快速/中速/慢速) +- 硬度倍数映射(基于Sigmoid函数) +- 脆性系数增加(基于冷却速率) +- 相态标记永久保留 + +**可视化**: +- 三阶段可视化:过程高辨识度→冷却过渡→真实物理表现 +- 真实回火色系统(基于最后回火温度) +- 氧化层表现(基于冷却介质) + +**详细设计**: 见 [淬火退火相变系统设计.md](./2026-01-23-淬火退火相变系统设计.md) + +### 3.2 应力累积系统 + +**目标**: 模拟多来源应力累积与物理表现 + +**应力来源**: +- 塑性形变应力(锤击) +- 热应力(温度梯度) +- 相变应力(马氏体膨胀) +- 残余应力(外部约束) + +**物理表现**: +- 弯曲/扭曲(应力梯度导致) +- 裂纹起始与扩展(应力超阈值) +- 应力松弛(温度驱动) + +**辅助功能**: +- 应力扫描模式(玩家主动开启) +- 彩虹色谱可视化应力分布 + +**详细设计**: 见 [应力累积系统设计.md](./2026-01-23-应力累积系统设计.md) + +### 3.3 疲劳累积与耐久度系统 + +**目标**: 模拟材料疲劳和刀具耐久度 + +**疲劳机制**: +- 累积式疲劳值(每次锻打增加) +- 应力和温度影响疲劳率 +- 疲劳裂纹起始与扩展 + +**耐久度系统**: +- 基于平均疲劳、裂纹数量、最大应力 +- 使用中的损伤累积 +- 回火部分恢复耐久度 + +**详细设计**: 见 [疲劳累积与耐久度系统设计.md](./2026-01-23-疲劳累积与耐久度系统设计.md) + +--- + +## 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 CoolingRate; // 冷却速率(°C/s) + + UPROPERTY() + uint8 PhaseState; // 相态(0=奥氏体, 1=马氏体, 2=珠光体, 3=开裂) + + FTemperatureVoxel() + : Temperature(20.0f) + , PlasticityCoefficient(0.0f) + , Flags(0) + , CoolingRate(0.0f) + , PhaseState(0) + {} +}; +``` + +### 4.2 顶点自定义属性 + +```cpp +// 在DynamicIronBlock.h中添加 +class ADynamicIronBlock : public ADynamicMeshActor +{ + // 顶点属性层(使用FDynamicMesh3的扩展属性系统) + TDynamicMeshVertexAttribute* HardnessCoefficient; // 硬度系数 + TDynamicMeshVertexAttribute* Brittleness; // 脆性系数(0-1) + TDynamicMeshVertexAttribute* InternalStress; // 内部应力值 + TDynamicMeshVertexAttribute* FatigueValue; // 疲劳值(0-1) + TDynamicMeshVertexAttribute* PhaseState; // 相态标记 + TDynamicMeshVertexAttribute* TemperColor; // 回火颜色 + TDynamicMeshVertexAttribute* OxidationLevel; // 氧化层度数 + TDynamicMeshVertexAttribute* PolishAmount; // 打磨度 +}; +``` + +### 4.3 顶点颜色编码方案 + +由于顶点颜色只有4通道(RGBA),需要精心分配: + +| 通道 | 用途 | 范围 | 说明 | +|------|------|------|------| +| **R** | 温度可视化 | 0-1 | 淬火过程:温度映射,冷却后恢复 | +| **G** | 打磨度 | 0-1 | 0=生锈,1=光亮金属 | +| **B** | 噪声种子 | 0-1 | 用于无漂移纹理采样 | +| **A** | 辅助标记 | 0-3 | 0=正常, 1=裂纹区, 2=淬火区(临时) | + +额外数据通过UV1通道或自定义属性传递。 + +--- + +## 5. GPU-CPU分工 + +### 5.1 GPU Compute Shader职责 + +- 体素层面热力学计算 +- 温度场更新 +- 冷却速率计算 +- 相态判定 +- 应力扩散(简化版) + +### 5.2 CPU职责 + +- 顶点属性更新 +- 锤击碰撞检测 +- 形变计算 +- 硬度/脆性/应力/疲劳公式应用 +- 开裂判定 +- 材质可视化更新 +- 游戏逻辑(辅助功能触发) + +--- + +## 6. 性能预算 + +### 6.1 目标帧时间分解(60 FPS = 16.67ms) + +| 系统 | 预算 | 说明 | +|------|------|------| +| 渲染(UE5基础) | 10ms | 场景渲染、后处理 | +| 锤击形变计算 | 2-3ms | 顶点位移、BVH更新 | +| 网格质量优化 | 1-2ms | 边翻转、平滑 | +| GPU物理计算 | 1ms | Compute Shader(异步) | +| 应力/疲劳更新 | 0.5ms | 公式计算 | +| 材质可视化 | 0.5ms | 顶点颜色更新 | +| **总锤击开销** | **≤7ms** | 保持在预算内 | + +### 6.2 内存预算 + +| 数据 | 大小 | 说明 | +|------|------|------| +| 网格顶点(20万) | 16.8 MB | 84字节/顶点(新增属性) | +| 网格三角形(40万) | 4.8 MB | 3×4字节索引 | +| BVH结构 | 5 MB | 加速结构 | +| 物理场体素(50³) | 0.4 MB | 扩展后的体素结构 | +| GPU缓冲区 | 3 MB | Ping-Pong缓冲 | +| **单铁块总计** | **~30 MB** | 可接受 | + +--- + +## 7. 实施计划 + +### 阶段1:淬火退火相变系统(3-4天) + +**目标**: 实现完整的热处理机制 + +- [ ] 扩展体素结构(冷却速率、相态) +- [ ] 顶点硬度/脆性属性系统 +- [ ] 温度区间判定逻辑 +- [ ] 冷却速率计算(滑动平均) +- [ ] 硬度/脆性公式实现 +- [ ] 三阶段可视化系统 +- [ ] 回火色系统 +- [ ] 氧化层表现 + +**验收标准**: +- 淬火后硬度显著提升 +- 冷却速率影响硬度和脆性 +- 回火后硬度降低,应力松弛 +- 视觉表现符合真实物理规律 + +### 阶段2:应力累积系统(2-3天) + +**目标**: 实现应力累积与物理表现 + +- [ ] 应力来源分类与计算 +- [ ] 应力累积规则 +- [ ] 应力扩散机制 +- [ ] 形变阻力公式 +- [ ] 弯曲/扭曲机制 +- [ ] 裂纹起始判定 +- [ ] 裂纹扩展逻辑 +- [ ] 应力扫描辅助功能 + +**验收标准**: +- 多来源应力正确累积 +- 高应力区域形变困难 +- 应力超阈值产生裂纹 +- 裂纹沿应力梯度扩展 + +### 阶段3:疲劳累积与耐久度系统(2-3天) + +**目标**: 实现材料疲劳和耐久度机制 + +- [ ] 疲劳值累积规则 +- [ ] 应力和温度影响疲劳率 +- [ ] 疲劳裂纹起始 +- [ ] 裂纹扩展概率 +- [ ] 耐久度计算公式 +- [ ] 使用中的损伤累积 +- [ ] 回火恢复机制 +- [ ] 刀具失效判定 + +**验收标准**: +- 反复锻打疲劳累积 +- 疲劳裂纹产生并扩展 +- 耐久度正确计算 +- 使用导致耐久度下降 +- 回火部分恢复耐久度 + +### 阶段4:集成与优化(1-2天) + +**目标**: 系统集成与性能优化 + +- [ ] 各子系统联动测试 +- [ ] 参数调优 +- [ ] 性能Profiling +- [ ] 调试工具完善 +- [ ] 文档更新 + +**验收标准**: +- 60 FPS @ 连续锤击 +- 所有功能正常运行 +- 调试工具完善 +- 文档齐全 + +--- + +## 8. 风险评估 + +### 8.1 技术风险 + +| 风险 | 概率 | 影响 | 缓解措施 | +|------|------|------|---------| +| 公式过于复杂,性能不足 | 中 | 高 | 简化计算,使用GPU并行 | +| 参数调优困难 | 中 | 中 | 提供调试工具,分阶段测试 | +| 可视化效果不真实 | 中 | 中 | 参考真实照片,迭代优化 | +| 网格拓扑变化导致属性丢失 | 中 | 高 | 使用持久化ID追踪顶点 | + +### 8.2 设计风险 + +| 风险 | 概率 | 影响 | 缓解措施 | +|------|------|------|---------| +| 过度复杂化,开发周期过长 | 高 | 高 | 严格遵守YAGNI,分阶段验收 | +| 物理模型过于简化,真实感不足 | 中 | 中 | 阶段性用户测试,迭代调整 | +| 辅助功能与真实表现混淆 | 低 | 中 | 明确区分,UI提示清晰 | + +--- + +## 9. 参考资料 + +### 9.1 物理基础 + +- 《金属塑性成形原理》(清华大学出版社) +- 《材料科学基础》(上海交通大学出版社) +- 《金属热处理原理与工艺》(机械工业出版社) +- *Metals Handbook: Heat Treating* (ASM International) + +### 9.2 游戏案例 + +- *My Summer Car* - 机械装配真实度 +- *BeamNG.drive* - 动态网格形变 +- *Dwarf Fortress* - 材料属性系统 + +--- + +## 10. 文件索引 + +- [淬火退火相变系统设计.md](./2026-01-23-淬火退火相变系统设计.md) +- [应力累积系统设计.md](./2026-01-23-应力累积系统设计.md) +- [疲劳累积与耐久度系统设计.md](./2026-01-23-疲劳累积与耐久度系统设计.md) + +--- + +**文档版本**: 1.0 +**最后更新**: 2026-01-23 +**状态**: 设计完成,待评审 diff --git a/docs/plans/2026-01-23-淬火退火相变系统设计.md b/docs/plans/2026-01-23-淬火退火相变系统设计.md new file mode 100644 index 0000000..5fd238c --- /dev/null +++ b/docs/plans/2026-01-23-淬火退火相变系统设计.md @@ -0,0 +1,436 @@ +# 淬火退火相变系统设计 + +**项目**: BladeSmith +**日期**: 2026-01-23 +**目标**: 实现基于温度和冷却速率的真实热处理效果 +**设计原则**: 游戏体验优先,三阶段可视化 + +--- + +## 1. 核心机制 + +### 1.1 温度区间判定 + +**三个关键温度阈值**: + +| 阈值名称 | 温度范围 | 效果 | +|---------|---------|------| +| 临界下限 | < 800°C | 淬火无效,硬度无提升 | +| 黄金区间 | 900-1100°C | 最佳淬火,硬度最大提升 | +| 临界上限 | > 1200°C | 材料开裂风险,硬度提升低 | + +**温度区间修正系数(TemperatureFactor)**: +``` +TemperatureFactor = + 3.0 (900°C ≤ T ≤ 1100°C, 黄金区间) + 1.8 (800°C ≤ T < 900°C 或 1100°C < T ≤ 1200°C, 次优区间) + 0.5 (T < 800°C, 温度过低) + 0.2 (T > 1200°C, 温度过高且可能开裂) +``` + +### 1.2 冷却速率计算 + +**基础公式**: +``` +CoolingRate = |T_current - T_previous| / Δt +``` + +- `T_current`: 当前帧体素温度 +- `T_previous`: Δt时间前的体素温度 +- `Δt`: 采样时间窗口(推荐0.5-1.0秒) + +**滑动平均平滑**: +``` +CoolingRate_smoothed = Σ(CoolingRate_i) / N (i=1 to N, N=10) +``` + +使用过去10帧的平均值,消除瞬时波动。 + +--- + +## 2. 硬度映射系统 + +### 2.1 硬度倍数公式 + +**基于冷却速率的Sigmoid函数**: +``` +HardnessMultiplier = BaseMultiplier × Sigmoid(CoolingRate) +``` + +其中: +``` +Sigmoid(CoolingRate) = 1 + 2 / (1 + exp(-k × (CoolingRate - Threshold))) +``` + +**参数说明**: +- `BaseMultiplier = 1.0`: 基准倍数 +- `Threshold = 35°C/s`: 中点冷却速率 +- `k = 0.1`: 曲线陡峭度(可调节) + +**冷却速率分类**: +- 快速冷却(>50°C/s): 水淬,硬度最高 +- 中速冷却(20-50°C/s): 油淬,硬度适中 +- 慢速冷却(<20°C/s): 空冷,硬度低(退火) + +### 2.2 最终硬度计算 + +**综合硬度公式**: +``` +FinalHardness = InitialHardness × HardnessMultiplier × TemperatureFactor +``` + +**硬度系数对形变的影响**: +``` +HardnessFactor = 1.0 + (Hardness / MaxHardness) × 2.0 +``` + +硬度越高,形变阻力越大(最大3倍阻力)。 + +--- + +## 3. 脆性计算系统 + +### 3.1 脆性系数公式 + +**基础脆性公式**: +``` +Brittleness = BaseBrittleness + BrittlenessIncrease × CoolingRate_normalized +``` + +**参数说明**: +- `BaseBrittleness = 0.1`: 基准脆性(未经淬火的钢) +- `BrittlenessIncrease = 0.6`: 最大脆性增加量 +- `CoolingRate_normalized`: 归一化冷却速率 + ``` + CoolingRate_normalized = clamp(CoolingRate / 80°C/s, 0, 1) + ``` + +**脆性对开裂的影响**: +脆性系数与开裂概率直接相关,详见应力系统文档。 + +### 3.2 脆性可视化阈值 + +| 脆性范围 | 颜色 | 含义 | +|---------|------|------| +| < 0.3 | 绿色 | 韧性良好 | +| 0.3 - 0.6 | 黄色 | 中度脆性 | +| ≥ 0.6 | 红色 | 高度脆性 | + +--- + +## 4. 内部应力公式 + +### 4.1 应力分量 + +**热应力分量(温度梯度)**: +``` +StressThermal = ThermalStressCoeff × CoolingRate × (T_current - 20°C) +``` + +- `ThermalStressCoeff = 0.005`: 热应力系数(可调) +- `T_current`: 当前温度(°C) +- 20°C: 环境温度 + +**相变应力分量(马氏体体积膨胀)**: +``` +StressPhase = PhaseStressCoeff × MartensiteFraction +``` + +- `PhaseStressCoeff = 50.0`: 相变应力系数 +- `MartensiteFraction`: 马氏体转化比例 + ``` + MartensiteFraction = clamp(CoolingRate / 80°C/s, 0, 1) + ``` + +**总应力**: +``` +InternalStress = StressThermal + StressPhase +``` + +### 4.2 应力松弛机制 + +**温度驱动的松弛公式**: +``` +RelaxationFactor = + 0.99 (T < 100°C, 常温慢松弛) + 0.90 (200°C ≤ T < 400°C, 回火快松弛) + 0.85 (T ≥ 400°C, 快速松弛) +``` + +**每帧更新**: +``` +InternalStress = InternalStress × RelaxationFactor +``` + +--- + +## 5. 相态系统 + +### 5.1 相态枚举 + +每个体素维护相态标记: + +```cpp +enum class EPhaseState : uint8 +{ + Austenite = 0, // 奥氏体(软) + Martensite = 1, // 马氏体(硬) + Pearlite = 2, // 珠光体(中) + Cracked = 3 // 开裂(永久缺陷) +}; +``` + +### 5.2 相变判定规则 + +**奥氏体→马氏体(淬火)**: +``` +if (Temperature > 800°C && CoolingRate > 20°C/s) +{ + PhaseState = EPhaseState::Martensite; + // 硬度和脆性提升 +} +``` + +**奥氏体→珠光体(退火)**: +``` +if (Temperature > 800°C && CoolingRate < 20°C/s) +{ + PhaseState = EPhaseState::Pearlite; + // 硬度适中,脆性低 +} +``` + +**重置相态**: +``` +if (Temperature > 800°C && TimeAbove800C > 5.0s) +{ + PhaseState = EPhaseState::Austenite; + // 材料回到软态,可重新淬火 +} +``` + +--- + +## 6. 三阶段可视化设计 + +### 6.1 阶段1:淬火过程(临时高辨识度) + +**目的**: 给玩家实时反馈,知道淬火是否成功、哪些区域被覆盖 + +**顶点颜色强制覆盖**: +``` +// R通道:温度的互补色 +R = 1.0 - Temperature / MaxTemperature + +// G通道:冷却速率(快=绿色,慢=红色) +G = clamp(1.0 - CoolingRate / 80°C/s, 0, 1) + +// B通道:硬度倍数(暗色=软,亮色=硬) +B = (Hardness - MinHardness) / (MaxHardness - MinHardness) + +// A通道:脆性(透明=韧性,不透明=脆) +A = Brittleness +``` + +**材质临时参数**: +- 自发光:启用,随温度变化 +- 金属度:暂时设为1.0(全金属感) +- 粗糙度:暂时设为0.0(镜面反光) + +**UI辅助**: +- 屏幕边缘显示"淬火进行中" +- 顶点统计:"淬火覆盖率:XX%" +- 品质评分实时显示 + +### 6.2 阶段2:冷却过渡(逐步恢复正常) + +**目的**: 从游戏化反馈平滑过渡到真实物理表现 + +**颜色过渡**(0.5-1.0秒): +``` +// 插值因子 +Alpha = (CurrentTime - QuenchStartTime) / TransitionDuration + +// R通道:温度回归到常温 +R = Lerp(TemporaryR, 0.0, Alpha) + +// G通道:恢复到打磨度 +G = Lerp(TemporaryG, PolishAmount, Alpha) + +// B通道:恢复到噪声种子 +B = Lerp(TemporaryB, NoiseSeed, Alpha) + +// A通道:保留相态标记 +A = PhaseState // 0=奥氏体, 1=马氏体, 2=珠光体, 3=开裂 +``` + +**材质过渡**: +``` +// 自发光:指数衰减至0 +Emissive = TemporaryEmissive × exp(-Alpha × 5.0) + +// 金属度/粗糙度:恢复到打磨度驱动 +Metallic = 0.5 + PolishAmount × 0.5 +Roughness = 0.6 - PolishAmount × 0.4 +``` + +### 6.3 阶段3:最终真实表现(永久保留) + +**目的**: 展示真实的物理热处理效果 + +**回火色系统**: + +回火色映射(新增TemperColor顶点属性): + +| 回火温度 | 颜色 | RGB值 | +|---------|------|-------| +| 20-150°C(无回火) | 银灰色 | (0.8, 0.8, 0.8) | +| 150-200°C | 淡黄色 | (0.95, 0.9, 0.7) | +| 200-250°C | 金黄/麦秆色 | (0.95, 0.8, 0.4) | +| 250-300°C | 棕色 | (0.7, 0.5, 0.3) | +| 300-350°C | 紫色 | (0.6, 0.4, 0.7) | +| 350-400°C | 蓝色 | (0.4, 0.5, 0.8) | +| >400°C | 灰色 | (0.6, 0.6, 0.6) | + +实现方式: 根据最后回火温度设置顶点TemperColor属性。 + +**氧化层表现**: + +新增OxidationLevel顶点属性(0-1): + +| 冷却介质 | OxidationLevel | 视觉效果 | +|---------|---------------|---------| +| 水淬 | 0.8-1.0 | 深色氧化层 | +| 油淬 | 0.4-0.6 | 浅棕色氧化层 | +| 空冷 | 0.1-0.3 | 轻微氧化 | + +**最终材质组合**: +``` +BaseColor = OxidationColor × (1 - PolishAmount) + TemperColor × PolishAmount +``` + +其中: +- `OxidationColor`: 基于OxidationLevel的深灰色 +- `TemperColor`: 基于TemperColor的回火色 +- `PolishAmount`: 打磨度(打磨后露出金属底色) + +**相态的微妙影响**: +虽然马氏体组织肉眼不可见,但通过细微色调表现: +- 马氏体区域: 略微更冷色调(蓝灰倾向) +- 珠光体区域: 略微更暖色调(棕灰倾向) +- 奥氏体区域: 中性灰调 + +--- + +## 7. 实现架构 + +### 7.1 GPU-CPU分工 + +**GPU Compute Shader职责**: +- 体素层面热力学计算 +- 温度场更新 +- 冷却速率计算(滑动平均) +- 相态判定 +- 热应力计算 + +**CPU职责**: +- 顶点属性更新 +- 硬度/脆性公式应用 +- 相态采样到顶点 +- 三阶段可视化逻辑 +- 材质参数更新 + +### 7.2 数据流 + +``` +温度更新(GPU) + ↓ +冷却速率计算(GPU) + ↓ +相态判定(GPU) + ↓ +硬度/脆性公式(CPU) + ↓ +顶点属性更新(CPU) + ↓ +材质可视化(CPU) +``` + +### 7.3 性能优化 + +**冷却速率计算**: +- 使用Ping-Pong双缓冲避免冲突 +- 滑动平均使用历史缓冲,减少计算量 + +**相态判定**: +- 只在温度变化时重新计算 +- 使用标志位避免重复判定 + +**可视化**: +- 临时效果使用简单着色器 +- 最终效果复用现有材质系统 + +--- + +## 8. 参数配置 + +### 8.1 可调参数(蓝图可配) + +| 参数名 | 默认值 | 范围 | 说明 | +|-------|--------|------|------| +| `CriticalTempLow` | 800.0°C | 600-900 | 临界下限 | +| `CriticalTempHigh` | 1200.0°C | 1100-1400 | 临界上限 | +| `GoldTempMin` | 900.0°C | 800-1000 | 黄金区间下限 | +| `GoldTempMax` | 1100.0°C | 1000-1200 | 黄金区间上限 | +| `CoolingRateThreshold` | 35.0°C/s | 20-50 | Sigmoid中点 | +| `SigmoidK` | 0.1 | 0.05-0.2 | 曲线陡峭度 | +| `ThermalStressCoeff` | 0.005 | 0.001-0.01 | 热应力系数 | +| `PhaseStressCoeff` | 50.0 | 20-100 | 相变应力系数 | +| `RelaxationTimeNormal` | 60.0s | 30-120 | 常温松弛时间 | +| `RelaxationTimeTemper` | 10.0s | 5-20 | 回火松弛时间 | + +### 8.2 调试工具 + +- 体素可视化:显示温度、冷却速率、相态 +- 顶点属性检查:硬度、脆性、应力值 +- 时间线:记录淬火-回火过程 +- 统计面板:覆盖率、平均硬度、最大脆性 + +--- + +## 9. 实施计划 + +### 9.1 第一阶段:核心公式(1天) + +- [ ] 冷却速率计算 +- [ ] 硬度/脆性公式 +- [ ] 相态判定逻辑 +- [ ] 单元测试 + +### 9.2 第二阶段:顶点属性(1天) + +- [ ] 顶点属性扩展 +- [ ] 公式应用到顶点 +- [ ] 材质参数更新 +- [ ] 基础可视化 + +### 9.3 第三阶段:三阶段可视化(1-2天) + +- [ ] 淬火过程临时效果 +- [ ] 冷却过渡动画 +- [ ] 回火色系统 +- [ ] 氧化层表现 +- [ ] UI辅助工具 + +### 9.4 第四阶段:集成测试(0.5天) + +- [ ] 完整流程测试 +- [ ] 性能Profiling +- [ ] 参数调优 +- [ ] 文档更新 + +--- + +**文档版本**: 1.0 +**最后更新**: 2026-01-23 +**状态**: 设计完成,待评审 diff --git a/docs/plans/2026-01-23-疲劳累积与耐久度系统设计.md b/docs/plans/2026-01-23-疲劳累积与耐久度系统设计.md new file mode 100644 index 0000000..837df69 --- /dev/null +++ b/docs/plans/2026-01-23-疲劳累积与耐久度系统设计.md @@ -0,0 +1,629 @@ +# 疲劳累积与耐久度系统设计 + +**项目**: 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 数据结构 + +**顶点属性扩展**: +```cpp +TDynamicMeshVertexAttribute* 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 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; // 主裂纹数量 +}; +``` + +### 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 +**状态**: 设计完成,待评审