原 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>
11 KiB
应力累积系统设计
项目: 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)
实现步骤:
-
计算应力梯度:
∇Stress = Stress_neighbor - Stress_center -
应用顶点位移:
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 裂纹视觉表现
几何表现:
-
裂缝开口:
CrackVertex.Position += Normal × CrackOpeningWidth其中
CrackOpeningWidth为裂缝开口宽度(可配置) -
边缘抖动: 裂纹边缘顶点位置随机抖动,模拟粗糙断裂
材质表现:
-
锈迹:
- 裂纹区域显示RustTexture
- 锈迹深度基于裂纹时间
-
内部氧化:
- 裂缝深处更暗
- 模拟内部氧化
-
纹理扰动: 使用顶点法线扰动模拟裂纹纹理
物理影响:
- 裂纹区域的硬度系数降为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 数据结构
顶点属性扩展:
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; // 创建时间
};
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 状态: 设计完成,待评审