Files
BladeSmith/docs/design/06-应力累积系统设计.md
T
starmen1265 ec5e7556ae docs: 添加应力与疲劳耐久度技术设计
design/06 涵盖四源应力(塑性/热/相变/残余)、扩散松弛、形变阻力、弯曲扭曲与开裂扩展。design/07 涵盖疲劳累积公式、疲劳裂纹、刀具耐久度计算、回火恢复与刀具失效判定。

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

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

12 KiB
Raw Blame History

应力累积系统设计

项目: BladeSmith 文档类型: 技术设计(专题) 版本: 2.0 最后更新: 2026-08-11 状态: 整合自原 2026-01-23-应力累积系统设计.md

本文档描述应力累积系统的技术实现。需求见 [../requirements/06-应力累积与开裂需求.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)

开裂条件:

if (InternalStress > CriticalStressThreshold)
{
    CreateCrack(Vertex);
}

概率开裂: 为避免一次性开裂过多,引入概率:

CrackProbability = (InternalStress / CriticalStressThreshold) - 1.0
if (Random() < CrackProbability)
{
    CreateCrack(Vertex);
}

5.3 裂纹扩展机制

裂纹生长方向: 优先沿应力梯度方向扩展(应力最大方向)

每帧检查:

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 应力释放事件

开裂后应力释放:

if (CrackCreated)
{
    InternalStress = InternalStress × 0.3  // 应力释放
    // 释放应力用于下次计算
}

回火对应力的影响: 加热至回火温度(200-400°C):

  • 加速应力松弛(详见松弛机制)
  • 但如果已经开裂,裂纹无法愈合

6. 应力可视化(辅助功能)

6.1 应力扫描模式

触发方式:

  • 按住特定键切换到"应力视图"
  • 或在UI中选择"应力扫描"工具

6.2 视觉效果

顶点颜色着色(彩虹色谱):

// 蓝色:低应力(< 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 数据结构

顶点属性扩展:

TDynamicMeshVertexAttribute<float>* InternalStress;  // 内部应力值
TDynamicMeshVertexAttribute<uint8>* CrackState;      // 裂纹状态(0=无, 1=有)

裂纹数据结构:

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. 引用