diff --git a/docs/design/04-物理模拟-加工硬化与晶粒演化设计.md b/docs/design/04-物理模拟-加工硬化与晶粒演化设计.md new file mode 100644 index 0000000..7c3072b --- /dev/null +++ b/docs/design/04-物理模拟-加工硬化与晶粒演化设计.md @@ -0,0 +1,792 @@ +# 物理模拟-加工硬化与晶粒演化设计 + +**项目**: BladeSmith +**文档类型**: 技术设计(专题) +**版本**: 2.0 +**最后更新**: 2026-08-11 +**状态**: 整合自原 `2026-01-22-物理模拟架构细节.md` + +> 本文档描述加工硬化与晶粒演化的技术实现。需求见 [../requirements/04-加工硬化与晶粒演化需求.md](../requirements/04-加工硬化与晶粒演化需求.md)。总体架构见 [00-锻造系统总体技术架构.md](00-锻造系统总体技术架构.md)。 +> +> **注意**: 应力分布系统的详细技术内容见 [06-应力累积系统设计.md](06-应力累积系统设计.md)。淬火退火相变系统的详细技术内容见 [05-淬火退火相变系统设计.md](05-淬火退火相变系统设计.md)。本文档仅简要引用这两部分。 + +--- + +## 1. 技术背景 + +加工硬化(Work Hardening)和晶粒演化是锻造过程中的核心物理现象: + +- **加工硬化**: 金属在塑性形变后变硬,屈服强度提高,机理是位错密度增加、晶格畸变。加热到再结晶温度(约600°C)后可软化。 +- **晶粒演化**: 温度和应变影响微观组织。细晶粒高强度高韧性(Hall-Petch关系),粗晶粒高温下更容易形变。 + +--- + +## 2. 数据结构 + +### 2.1 扩展体素结构 + +```cpp +USTRUCT(BlueprintType) +struct FTemperatureVoxel +{ + GENERATED_BODY() + + // ===== 已有字段(保留) ===== + UPROPERTY() + float Temperature; // 温度(°C) + + UPROPERTY() + float PlasticityCoefficient; // 塑性系数(0-1) + + UPROPERTY() + uint8 Flags; // 标志位(bit 0: 表面体素) + + // ===== 新增字段 ===== + + // 平均应变率(记录形变活跃度) + UPROPERTY() + float AverageStrainRate; // 0-1范围,归一化的应变率 + + // 冷却速率(用于淬火判断,详见设计文档05) + UPROPERTY() + float CoolingRate; // °C/s + + // 相态标记(详见设计文档05) + UPROPERTY() + EPhaseState PhaseState; // 奥氏体/马氏体/珠光体 + + // 淬火标记(是否经历过快速冷却,详见设计文档05) + UPROPERTY() + bool bHasBeenQuenched; // 淬火状态 + + FTemperatureVoxel() + : Temperature(20.0f) + , PlasticityCoefficient(0.0f) + , Flags(0) + , AverageStrainRate(0.0f) + , CoolingRate(0.0f) + , PhaseState(EPhaseState::Austenite) // 初始为奥氏体 + , bHasBeenQuenched(false) + {} +}; +``` + +### 2.2 相态枚举 + +```cpp +/** + * 相态枚举 + * 相变系统详细内容见设计文档05 + */ +UENUM(BlueprintType) +enum class EPhaseState : uint8 +{ + Austenite UMETA(DisplayName = "奥氏体"), // 高温软相(>800°C) + Martensite UMETA(DisplayName = "马氏体"), // 淬火硬相 + Pearlite UMETA(DisplayName = "珠光体"), // 缓冷软相 + Bainite UMETA(DisplayName = "贝氏体"), // 中间相 + Cracked UMETA(DisplayName = "开裂") // 永久缺陷 +}; +``` + +### 2.3 顶点属性结构 + +```cpp +class ADynamicIronBlock +{ +private: + // ===== 顶点自定义属性层 ===== + + // 初始位置(用于无漂移纹理采样) + TDynamicMeshVertexAttribute* InitialPositions; + + // 累积塑性应变(0-1,归一化) + TDynamicMeshVertexAttribute* AccumulatedStrain; + + // 当前硬度系数(0-1,0=最软,1=最硬) + TDynamicMeshVertexAttribute* HardnessCoefficient; + + // 打磨度(表面状态,0=生锈,1=光亮) + TDynamicMeshVertexAttribute* PolishAmount; + + // 晶粒尺寸(0-1,归一化,0=细晶粒,1=粗晶粒) + TDynamicMeshVertexAttribute* GrainSize; + + // 应力值(简化标量,0-1,0=无应力,1=高应力) + // 应力系统详细内容见设计文档06 + TDynamicMeshVertexAttribute* StressValue; + + // 应力方向(可选,三维向量) + TDynamicMeshVertexAttribute* StressDirection; + +public: + // 初始化所有顶点属性 + void InitializeVertexAttributes(); +}; +``` + +--- + +## 3. 加工硬化模型 + +### 3.1 物理原理 + +加工硬化(Work Hardening): +- **现象**: 金属在塑性形变后变硬,屈服强度提高 +- **机理**: 位错密度增加,晶格畸变 +- **可逆性**: 加热到再结晶温度(约600°C)后软化 + +### 3.2 应变-硬度映射 + +```cpp +/** + * 应变-硬度映射(简化经验公式) + * 基于真实钢的应力-应变曲线拟合 + */ +float CalculateHardnessFromStrain(float AccumulatedStrain) +{ + // 参数(可调) + const float InitialHardness = 0.2f; // 初始硬度 + const float MaxHardness = 1.0f; // 最大硬度 + const float SaturationStrain = 0.5f; // 饱和应变 + + // Ludwik方程简化版:σ = σ₀ + k·εⁿ + float HardnessIncrease = MaxHardness - InitialHardness; + float StrainEffect = FMath::Pow(AccumulatedStrain / SaturationStrain, 0.5f); + + return InitialHardness + HardnessIncrease * FMath::Min(StrainEffect, 1.0f); +} +``` + +### 3.3 温度软化因子 + +高温下硬度降低(模拟动态回复)。 + +```cpp +/** + * 温度软化因子 + * 高温下硬度降低(模拟动态回复) + */ +float CalculateThermalSoftening(float Temperature, float Hardness) +{ + // 再结晶温度(简化) + const float RecrystallizationTemp = 600.0f; // °C + + if (Temperature < RecrystallizationTemp) + return Hardness; // 低温:无软化 + + // 高温:软化 + float Overheating = Temperature - RecrystallizationTemp; + float SofteningFactor = FMath::Clamp(Overheating / 400.0f, 0.0f, 0.8f); + + return Hardness * (1.0f - SofteningFactor); +} +``` + +### 3.4 锤击时更新硬度和应变 + +```cpp +/** + * 锤击时更新硬度和应变 + */ +void ADynamicIronBlock::OnHammerImpact( + FVector HitLocation, + float ImpactRadius, + float ImpactForce) +{ + FVector LocalHitPos = GetTransform().InverseTransformPosition(HitLocation); + + DynamicMesh->EditMesh([&](FDynamicMesh3& Mesh) + { + for (int32 VID : Mesh.VertexIndicesItr()) + { + FVector VertexPos = Mesh.GetVertex(VID); + float Distance = FVector::Dist(VertexPos, LocalHitPos); + + if (Distance < ImpactRadius) + { + // 1. 计算局部形变量(简化) + float DistanceRatio = Distance / ImpactRadius; + float LocalDeformation = FMath::Pow(1.0f - DistanceRatio, 2.0f); + float StrainIncrease = LocalDeformation * ImpactForce * 0.0001f; + + // 2. 累积应变 + float CurrentStrain = AccumulatedStrain->GetValue(VID); + float NewStrain = FMath::Min(1.0f, CurrentStrain + StrainIncrease); + AccumulatedStrain->SetValue(VID, NewStrain); + + // 3. 从温度体素采样温度 + FVector VoxelPos = VertexPos / VoxelSize; + float Temperature = SampleTemperatureFromVoxel(VoxelPos); + + // 4. 计算硬度(应变硬化) + float StrainHardness = CalculateHardnessFromStrain(NewStrain); + + // 5. 温度软化 + float FinalHardness = CalculateThermalSoftening(Temperature, StrainHardness); + + // 6. 更新硬度 + HardnessCoefficient->SetValue(VID, FinalHardness); + + // 7. 硬度影响形变阻力(可选:反馈到形变计算) + // 下一锤击时,高硬度区域形变小 + } + } + }); +} +``` + +--- + +## 4. 晶粒演化模型 + +### 4.1 物理原理 + +晶粒尺寸影响材料特性: +- **细晶粒**: 高强度、高韧性(Hall-Petch关系) +- **粗晶粒**: 高温下更容易形变 + +晶粒演化因素: +- **再结晶**: 高温+应变 → 新晶粒形成 +- **晶粒长大**: 高温下晶粒合并 +- **晶粒细化**: 大应变+低温 → 细化 + +### 4.2 晶粒尺寸演化 + +```cpp +/** + * 晶粒尺寸演化(简化标量模型) + */ +float EvolveGrainSize( + float CurrentGrainSize, // 当前晶粒尺寸(归一化0-1) + float Temperature, // 当前温度(°C) + float Strain, // 累积应变 + float DeltaTime) // 时间步长 +{ + const float RecrystallizationTemp = 600.0f; + const float GrainGrowthTemp = 900.0f; + + // 1. 再结晶:大应变+高温 → 晶粒细化 + if (Temperature > RecrystallizationTemp && Strain > 0.3f) + { + float RecrystallizationRate = 0.1f; // 可调 + return CurrentGrainSize * (1.0f - RecrystallizationRate * DeltaTime); + } + + // 2. 晶粒长大:高温 → 晶粒粗化 + if (Temperature > GrainGrowthTemp) + { + float GrowthRate = 0.05f * (Temperature - GrainGrowthTemp) / 300.0f; + return FMath::Min(1.0f, CurrentGrainSize * (1.0f + GrowthRate * DeltaTime)); + } + + // 3. 晶粒细化:大应变 → 晶粒细化 + if (Strain > 0.5f) + { + float RefinementRate = 0.02f; + return FMath::Max(0.1f, CurrentGrainSize * (1.0f - RefinementRate * DeltaTime)); + } + + return CurrentGrainSize; +} +``` + +### 4.3 更新顶点晶粒尺寸 + +```cpp +/** + * 更新顶点晶粒尺寸 + */ +void ADynamicIronBlock::UpdateGrainStructure(float DeltaTime) +{ + DynamicMesh->EditMesh([&](FDynamicMesh3& Mesh) + { + for (int32 VID : Mesh.VertexIndicesItr()) + { + float CurrentGrainSize = GrainSize->GetValue(VID); + float Strain = AccumulatedStrain->GetValue(VID); + + // 采样温度 + FVector Pos = Mesh.GetVertex(VID); + float Temperature = SampleTemperatureFromVoxel(Pos); + + // 演化晶粒尺寸 + float NewGrainSize = EvolveGrainSize(CurrentGrainSize, Temperature, Strain, DeltaTime); + + GrainSize->SetValue(VID, NewGrainSize); + } + }); +} +``` + +### 4.4 大马士革花纹模拟 + +```cpp +/** + * 初始化层状材料(用于大马士革钢) + */ +void InitializeLayeredMaterialStructure() +{ + DynamicMesh->EditMesh([&](FDynamicMesh3& Mesh) + { + TDynamicMeshVertexAttribute* MaterialLayerID = + new TDynamicMeshVertexAttribute(&Mesh); + + for (int32 VID : Mesh.VertexIndicesItr()) + { + FVector Pos = Mesh.GetVertex(VID); + + // 简单层状分布:沿Z轴 + // 每层厚度2mm + int32 LayerID = (int32)FMath::Floor(Pos.Z / 2.0f) % 2; + + MaterialLayerID->SetValue(VID, LayerID); + } + }); +} +``` + +### 4.5 大马士革花纹材质HLSL + +```hlsl +// 材质中基于MaterialLayerID采样不同颜色 +float LayerID = MaterialLayerAttribute; // 从顶点属性读取 + +float3 HighCarbonColor = float3(0.15, 0.1, 0.08); // 深色层 +float3 LowCarbonColor = float3(0.75, 0.7, 0.65); // 浅色层 + +float3 BaseColor = lerp(HighCarbonColor, LowCarbonColor, LayerID); + +// 添加扭曲(基于形变) +float Distortion = length(AccumulatedStrain) * 5.0; +float3 WarpedPattern = WarpedNoise(BaseColor, Distortion); + +FinalColor = BaseColor * (0.8 + WarpedPattern * 0.2); +``` + +--- + +## 5. GPU Compute Shader集成 + +### 5.1 Shader结构 + +``` +MiceShaders/Source/MiceShaders/Private/ +├── MetallurgyComputeShader.usf +├── MetallurgyComputeShader.h +└── MetallurgyComputeShader.cpp +``` + +### 5.2 Metallurgy Compute Shader HLSL + +```hlsl +// MetallurgyComputeShader.usf + +#define VOXEL_SIZE 50 +#define THREAD_COUNT 32 + +// 输入/输出缓冲区 +RWStructuredBuffer TemperatureBufferA; // 温度 + 塑性系数 +RWStructuredBuffer TemperatureBufferB; // Ping-Pong + +RWStructuredBuffer MetallurgyBuffer; // 应变率 + 冷却速率 + 相态 + 淬火标记 + +// 参数 +cbuffer MetallurgyParams +{ + float DeltaTime; + float3 VoxelWorldMin; + float VoxelSize; + float3 Padding; +}; + +/** + * 计算 Metallurgy Shader 主函数 + */ +[numthreads(THREAD_COUNT, THREAD_COUNT, 1)] +void MetallurgyComputeShader(uint3 ThreadId : SV_DispatchThreadID) +{ + uint VoxelIndex = ThreadId.x + ThreadId.y * VoxelSize; + + // 读取温度 + float Temperature = TemperatureBufferA[VoxelIndex].r; + float Plasticity = TemperatureBufferA[VoxelIndex].g; + + // 读取应变率 + float StrainRate = MetallurgyBuffer[VoxelIndex].r; + + // 1. 应变率衰减(模拟时效) + StrainRate *= 0.99; + + // 2. 计算冷却速率(相变判断基础,详见设计文档05) + float3 WorldPos = VoxelToWorldPosition(VoxelIndex); + float SurfaceFactor = IsSurfaceVoxel(WorldPos) ? 1.0 : 0.1; + float CoolingRate = SurfaceFactor * (Temperature - 20.0) * 0.1; + + // 3. 相态判断(详细相变逻辑见设计文档05) + uint PhaseState = 0; // 奥氏体 + if (CoolingRate > 100.0 && Temperature > 800.0) + { + PhaseState = 1; // 马氏体(淬火) + } + else if (Temperature < 600.0) + { + PhaseState = 2; // 珠光体(缓冷) + } + + // 写回 + MetallurgyBuffer[VoxelIndex] = float4(StrainRate, CoolingRate, PhaseState, 0.0); +} + +/** + * 辅助函数:体素索引转世界坐标 + */ +float3 VoxelToWorldPosition(uint Index) +{ + uint X = Index % VoxelSize; + uint Y = (Index / VoxelSize) % VoxelSize; + uint Z = Index / (VoxelSize * VoxelSize); + + return VoxelWorldMin + float3(X, Y, Z) * VoxelSize; +} + +/** + * 辅助函数:判断是否为表面体素 + */ +bool IsSurfaceVoxel(float3 WorldPos) +{ + // 简化:边界体素为表面 + // 实际应使用法线判断 + return false; +} +``` + +### 5.3 C++ Shader封装 + +```cpp +// MetallurgyComputeShader.h +class FMetallurgyComputeShader +{ +public: + static void Dispatch( + FRHICommandListImmediate& RHICmdList, + FStructuredBufferRHIRef TemperatureBufferA, + FStructuredBufferRHIRef TemperatureBufferB, + FStructuredBufferRHIRef MetallurgyBuffer, + float DeltaTime, + FIntVector VoxelResolution); +}; +``` + +### 5.4 C++ Shader调用 + +```cpp +// MetallurgyComputeShader.cpp +void FMetallurgyComputeShader::Dispatch( + FRHICommandListImmediate& RHICmdList, + FStructuredBufferRHIRef TemperatureBufferA, + FStructuredBufferRHIRef TemperatureBufferB, + FStructuredBufferRHIRef MetallurgyBuffer, + float DeltaTime, + FIntVector VoxelResolution) +{ + // 设置Shader + TShaderMapRef ComputeShader(GetGlobalShaderMap(GMaxRHIFeatureLevel)); + + // 设置参数 + RHICmdList.SetComputeShader(ComputeShader.GetComputeShader()); + ComputeShader->SetParameters(RHICmdList, TemperatureBufferA, TemperatureBufferB, + MetallurgyBuffer, DeltaTime, VoxelMin, VoxelSize); + + // Dispatch + int32 ThreadGroupCount = (VoxelResolution.X + 31) / 32; + RHICmdList.DispatchComputeShader(ThreadGroupCount, ThreadGroupCount, 1); +} +``` + +### 5.5 异步Dispatch模式 + +```cpp +ENQUEUE_RENDER_COMMAND(FMetallurgyComputeDispatch)( + [this, DeltaTime](FRHICommandListImmediate& RHICmdList) + { + FMetallurgyComputeShader::Dispatch( + RHICmdList, + TemperatureBufferA, + TemperatureBufferB, + MetallurgyBuffer, + DeltaTime, + TemperatureResolution + ); + + bMetallurgyComputeComplete = true; + } +); +// CPU 继续其他工作,不等待GPU +``` + +--- + +## 6. 材质可视化 + +### 6.1 硬度可视化 + +```hlsl +// 材质中:基于硬度调整颜色 +float Hardness = SampleHardnessFromVoxel(WorldPos); + +float3 SoftColor = float3(0.6, 0.5, 0.4); // 软:棕色 +float3 HardColor = float3(0.8, 0.8, 0.85); // 硬:银白色 + +float3 HardnessColor = lerp(SoftColor, HardColor, Hardness); +``` + +### 6.2 应力可视化 + +**注意**: 应力分布系统的详细可视化见 [06-应力累积系统设计.md](06-应力累积系统设计.md)。此处为简要引用。 + +```hlsl +// 顶点颜色.A通道存储应力 +float Stress = VertexColor.a; + +float3 LowStressColor = float3(0.3, 0.5, 0.7); // 低应力:蓝色 +float3 HighStressColor = float3(1.0, 0.3, 0.1); // 高应力:红色 + +float3 StressColor = lerp(LowStressColor, HighStressColor, Stress); + +// 混合到基础颜色 +BaseColor = lerp(BaseColor, StressColor, Stress * 0.5); +``` + +### 6.3 相态可视化 + +**注意**: 淬火相变系统的详细可视化见 [05-淬火退火相变系统设计.md](05-淬火退火相变系统设计.md)。此处为简要引用。 + +```hlsl +// 从体素采样相态 +float PhaseState = SamplePhaseStateFromVoxel(WorldPos); + +float3 AusteniteColor = float3(1.0, 0.8, 0.6); // 奥氏体:浅橙色 +float3 MartensiteColor = float3(0.9, 0.85, 0.8); // 马氏体:银白色 +float3 PearliteColor = float3(0.7, 0.6, 0.5); // 珠光体:深灰色 + +float3 PhaseColor; +if (PhaseState < 0.5) + PhaseColor = AusteniteColor; +else if (PhaseState < 1.5) + PhaseColor = MartensiteColor; +else + PhaseColor = PearliteColor; + +// 根据温度过渡 +float Temp = SampleTemperatureFromVoxel(WorldPos); +float MixFactor = smoothstep(600.0, 800.0, Temp); + +BaseColor = lerp(PhaseColor, AusteniteColor, MixFactor); +``` + +--- + +## 7. 性能优化 + +### 7.1 GPU优化策略 + +```cpp +// 1. 使用共享内存(GroupShared) +groupshared float SharedTemperature[THREAD_COUNT * THREAD_COUNT]; + +// 2. 波前优化(Wave Intrinsics) +uint WaveSize = GetWaveSize(); +float WaveSum = WaveActiveSum(StrainRate); + +// 3. 避免分支 divergence +if (CoolingRate > 100.0) // 差:条件跳转 + PhaseState = 1.0; +PhaseState = step(100.0, CoolingRate); // 好:无分支 +``` + +### 7.2 CPU-GPU异步 + +```cpp +// 异步Dispatch +ENQUEUE_RENDER_COMMAND(FMetallurgyComputeDispatch)( + [this, DeltaTime](FRHICommandListImmediate& RHICmdList) + { + FMetallurgyComputeShader::Dispatch( + RHICmdList, + TemperatureBufferA, + TemperatureBufferB, + MetallurgyBuffer, + DeltaTime, + TemperatureResolution + ); + + // 标记完成 + bMetallurgyComputeComplete = true; + } +); + +// CPU继续其他工作,不用等待GPU +``` + +### 7.3 LOD策略 + +```cpp +// 根据摄像机距离调整计算频率 +float DistanceToCamera = FVector::Dist(GetActorLocation(), CameraLocation); + +int32 ComputeFrequency; +if (DistanceToCamera < 200.0f) + ComputeFrequency = 1; // 每帧计算 +else if (DistanceToCamera < 500.0f) + ComputeFrequency = 2; // 每2帧计算 +else + ComputeFrequency = 5; // 每5帧计算 + +static int32 FrameCounter = 0; +if (++FrameCounter % ComputeFrequency == 0) +{ + DispatchMetallurgyComputeShader(); +} +``` + +--- + +## 8. 参数配置示例 + +### 8.1 碳钢(C105) + +```cpp +// 加工硬化参数 +InitialHardness = 0.25f; +SaturationStrain = 0.6f; +WorkHardeningExponent = 0.55f; + +// 相变参数(详见设计文档05) +AustenitizingTemp = 800.0f; +QuenchingCriticalRate = 120.0f; +MartensiteHardness = 0.95f; + +// 晶粒参数 +InitialGrainSize = 0.5f; +RecrystallizationTemp = 650.0f; +``` + +### 8.2 高碳钢(C150) + +```cpp +// 更容易硬化 +InitialHardness = 0.35f; +SaturationStrain = 0.4f; + +// 淬火更敏感(详见设计文档05) +QuenchingCriticalRate = 80.0f; // 更容易淬火 +MartensiteHardness = 1.0f; // 更硬 +``` + +### 8.3 低碳钢(C20) + +```cpp +// 难硬化 +InitialHardness = 0.15f; +SaturationStrain = 0.8f; + +// 难淬火(详见设计文档05) +QuenchingCriticalRate = 200.0f; // 很难淬火 +MartensiteHardness = 0.7f; +``` + +--- + +## 9. 调试工具 + +### 9.1 体素数据可视化 + +```cpp +void ADynamicIronBlock::DebugDrawVoxelData() +{ + for (int32 Z = 0; Z < TemperatureResolution.Z; ++Z) + { + for (int32 Y = 0; Y < TemperatureResolution.Y; ++Y) + { + for (int32 X = 0; X < TemperatureResolution.X; ++X) + { + FIntVector Coord(X, Y, Z); + int32 Index = GetTemperatureIndex(Coord); + const FTemperatureVoxel& Voxel = TemperatureGrid[Index]; + + // 只绘制表面体素 + if (!(Voxel.Flags & VOXEL_FLAG_SURFACE)) + continue; + + FVector WorldPos = VoxelCoordToWorldPos(Coord); + + // 颜色:温度 + FLinearColor Color = FLinearColor( + FMath::Clamp(Voxel.Temperature / 1200.0f, 0.0f, 1.0f), + 0.0f, + 1.0f - FMath::Clamp(Voxel.Temperature / 1200.0f, 0.0f, 1.0f) + ); + + DrawDebugPoint(GetWorld(), WorldPos, 3.0f, Color.ToFColor(), false, 0.1f); + } + } + } +} +``` + +### 9.2 应力热图 + +**注意**: 应力热图的详细实现见 [06-应力累积系统设计.md](06-应力累积系统设计.md)。此处为简要引用。 + +```cpp +void ADynamicIronBlock::DebugDrawStressHeatmap() +{ + if (!DynamicMesh->HasMesh()) + return; + + for (int32 VID : DynamicMesh->VertexIndicesItr()) + { + if (VID % 50 != 0) // 稀疏采样 + continue; + + float Stress = StressValue->GetValue(VID); + FVector WorldPos = GetActorTransform().TransformPosition(DynamicMesh->GetVertex(VID)); + + // 蓝色(低应力)→ 红色(高应力) + FColor HeatColor = FLinearColor::LerpUsingHSV( + FColor::Blue, + FColor::Red, + Stress + ).ToFColor(); + + DrawDebugPoint(GetWorld(), WorldPos, 5.0f, HeatColor, false, 5.0f); + } +} +``` + +--- + +## 10. 已知限制与未来改进 + +### 10.1 当前限制 + +1. **简化模型**: 所有物理模型均为经验公式,非严格物理计算 +2. **无热-力耦合**: 温度场和应力场独立计算,未考虑形变生热 +3. **无磁-电效应**: 忽略了电磁场对相变的影响 +4. **各向同性**: 假设材料各向同性,真实钢有晶粒取向 +5. **晶粒模型极度简化**: 真实晶粒有复杂3D形状与取向,当前用标量GrainSize + +### 10.2 适用场景 + +游戏娱乐级,足够真实感但非科研级精度。 + +--- + +## 11. 引用 + +- 对应需求: [../requirements/04-加工硬化与晶粒演化需求.md](../requirements/04-加工硬化与晶粒演化需求.md) +- 总体架构: [00-锻造系统总体技术架构.md](00-锻造系统总体技术架构.md) +- 原始设计文档(归档): [../_archive/plans/2026-01-22-物理模拟架构细节.md](../_archive/plans/2026-01-22-物理模拟架构细节.md) +- 相关专题(淬火系统): [05-淬火退火相变系统设计.md](05-淬火退火相变系统设计.md) +- 相关专题(应力系统): [06-应力累积系统设计.md](06-应力累积系统设计.md) \ No newline at end of file diff --git a/docs/design/05-淬火退火相变系统设计.md b/docs/design/05-淬火退火相变系统设计.md new file mode 100644 index 0000000..551ff61 --- /dev/null +++ b/docs/design/05-淬火退火相变系统设计.md @@ -0,0 +1,470 @@ +# 淬火退火相变系统设计 + +**项目**: BladeSmith +**文档类型**: 技术设计(专题) +**版本**: 2.0 +**最后更新**: 2026-08-11 +**状态**: 整合自原 `2026-01-23-淬火退火相变系统设计.md` + +> 本文档描述淬火退火相变系统的技术实现。需求见 [../requirements/05-淬火退火相变需求.md]。总体架构见 [00-锻造系统总体技术架构.md](00-锻造系统总体技术架构.md)。 + +--- + +## 1. 技术背景 + +淬火退火相变系统模拟热处理过程中的相变行为,基于温度和冷却速率计算材料状态变化。系统通过温度区间判定、冷却速率计算、相态判定、硬度/脆性计算以及三阶段可视化,实现真实的热处理效果模拟。 + +--- + +## 2. 温度区间判定 + +### 2.1 温度阈值定义 + +**三个关键温度阈值**: + +| 阈值名称 | 温度范围 | 效果 | +|---------|---------|------| +| 临界下限 | < 800°C | 淬火无效,硬度无提升 | +| 黄金区间 | 900-1100°C | 最佳淬火,硬度最大提升 | +| 临界上限 | > 1200°C | 材料开裂风险,硬度提升低 | + +### 2.2 温度区间修正系数 + +**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, 温度过高且可能开裂) +``` + +--- + +## 3. 冷却速率计算 + +### 3.1 基础冷却速率公式 + +``` +CoolingRate = |T_current - T_previous| / Δt +``` + +**参数说明**: +- `T_current`: 当前帧体素温度 +- `T_previous`: Δt时间前的体素温度 +- `Δt`: 采样时间窗口(推荐0.5-1.0秒) + +### 3.2 滑动平均平滑 + +**平滑公式**: +``` +CoolingRate_smoothed = Σ(CoolingRate_i) / N (i=1 to N, N=10) +``` + +使用过去10帧的平均值,消除瞬时波动。 + +--- + +## 4. 硬度映射系统 + +### 4.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`: 曲线陡峭度(可调节) + +### 4.2 冷却速率分类 + +| 冷却速率 | 范围 | 淬火方式 | 硬度表现 | +|---------|------|---------|---------| +| 快速冷却 | > 50°C/s | 水淬 | 硬度最高 | +| 中速冷却 | 20-50°C/s | 油淬 | 硬度适中 | +| 慢速冷却 | < 20°C/s | 空冷 | 硬度低(退火) | + +### 4.3 最终硬度计算 + +**综合硬度公式**: +``` +FinalHardness = InitialHardness × HardnessMultiplier × TemperatureFactor +``` + +### 4.4 硬度对形变的影响 + +**形变阻力公式**: +``` +HardnessFactor = 1.0 + (Hardness / MaxHardness) × 2.0 +``` + +硬度越高,形变阻力越大(最大3倍阻力)。 + +--- + +## 5. 脆性计算系统 + +### 5.1 脆性系数公式 + +**基础脆性公式**: +``` +Brittleness = BaseBrittleness + BrittlenessIncrease × CoolingRate_normalized +``` + +**参数说明**: +- `BaseBrittleness = 0.1`: 基准脆性(未经淬火的钢) +- `BrittlenessIncrease = 0.6`: 最大脆性增加量 +- `CoolingRate_normalized`: 归一化冷却速率 + +**归一化公式**: +``` +CoolingRate_normalized = clamp(CoolingRate / 80°C/s, 0, 1) +``` + +### 5.2 脆性对开裂的影响 + +脆性系数与开裂概率直接相关,详见应力系统文档。 + +### 5.3 脆性可视化阈值 + +| 脆性范围 | 颜色 | 含义 | +|---------|------|------| +| < 0.3 | 绿色 | 韧性良好 | +| 0.3 - 0.6 | 黄色 | 中度脆性 | +| ≥ 0.6 | 红色 | 高度脆性 | + +--- + +## 6. 内部应力公式 + +### 6.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) +``` + +### 6.2 总应力 + +**综合应力公式**: +``` +InternalStress = StressThermal + StressPhase +``` + +### 6.3 应力松弛机制 + +**温度驱动的松弛公式**: +``` +RelaxationFactor = + 0.99 (T < 100°C, 常温慢松弛) + 0.90 (200°C ≤ T < 400°C, 回火快松弛) + 0.85 (T ≥ 400°C, 快速松弛) +``` + +**每帧更新**: +``` +InternalStress = InternalStress × RelaxationFactor +``` + +--- + +## 7. 相态系统 + +### 7.1 相态枚举 + +**EPhaseState 定义**: +```cpp +UENUM(BlueprintType) +enum class EPhaseState : uint8 +{ + Austenite = 0, // 奥氏体(软) + Martensite = 1, // 马氏体(硬) + Pearlite = 2, // 珠光体(中) + Cracked = 3 // 开裂(永久缺陷) +}; +``` + +### 7.2 相变判定规则 + +**奥氏体→马氏体(淬火)**: +```cpp +if (Temperature > 800°C && CoolingRate > 20°C/s) +{ + PhaseState = EPhaseState::Martensite; + // 硬度和脆性提升 +} +``` + +**奥氏体→珠光体(退火)**: +```cpp +if (Temperature > 800°C && CoolingRate < 20°C/s) +{ + PhaseState = EPhaseState::Pearlite; + // 硬度适中,脆性低 +} +``` + +**重置相态**: +```cpp +if (Temperature > 800°C && TimeAbove800C > 5.0s) +{ + PhaseState = EPhaseState::Austenite; + // 材料回到软态,可重新淬火 +} +``` + +--- + +## 8. 三阶段可视化设计 + +### 8.1 阶段1:淬火过程(临时高辨识度) + +**顶点颜色强制覆盖**: +```hlsl +// 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(镜面反光) + +### 8.2 阶段2:冷却过渡(逐步恢复正常) + +**颜色过渡公式**(0.5-1.0秒): +```hlsl +// 插值因子 +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=开裂 +``` + +**材质过渡**: +```hlsl +// 自发光:指数衰减至0 +Emissive = TemporaryEmissive × exp(-Alpha × 5.0) + +// 金属度/粗糙度:恢复到打磨度驱动 +Metallic = 0.5 + PolishAmount × 0.5 +Roughness = 0.6 - PolishAmount × 0.4 +``` + +### 8.3 阶段3:最终真实表现(永久保留) + +#### 8.3.1 回火色系统 + +**回火色映射表**: + +| 回火温度 | 颜色 | 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属性。 + +#### 8.3.2 氧化层表现 + +**OxidationLevel 属性定义**(0-1): + +| 冷却介质 | OxidationLevel | 视觉效果 | +|---------|---------------|---------| +| 水淬 | 0.8-1.0 | 深色氧化层 | +| 油淬 | 0.4-0.6 | 浅棕色氧化层 | +| 空冷 | 0.1-0.3 | 轻微氧化 | + +#### 8.3.3 最终材质组合 + +**基础颜色公式**: +```hlsl +BaseColor = OxidationColor × (1 - PolishAmount) + TemperColor × PolishAmount +``` + +**参数说明**: +- `OxidationColor`: 基于OxidationLevel的深灰色 +- `TemperColor`: 基于TemperColor的回火色 +- `PolishAmount`: 打磨度(打磨后露出金属底色) + +#### 8.3.4 相态的微妙影响 + +虽然马氏体组织肉眼不可见,但通过细微色调表现: +- 马氏体区域: 略微更冷色调(蓝灰倾向) +- 珠光体区域: 略微更暖色调(棕灰倾向) +- 奥氏体区域: 中性灰调 + +--- + +## 9. 实现架构 + +### 9.1 GPU-CPU分工 + +**GPU Compute Shader职责**: +- 体素层面热力学计算 +- 温度场更新 +- 冷却速率计算(滑动平均) +- 相态判定 +- 热应力计算 + +**CPU职责**: +- 顶点属性更新 +- 硬度/脆性公式应用 +- 相态采样到顶点 +- 三阶段可视化逻辑 +- 材质参数更新 + +### 9.2 数据流 + +``` +温度更新(GPU) + ↓ +冷却速率计算(GPU) + ↓ +相态判定(GPU) + ↓ +硬度/脆性公式(CPU) + ↓ +顶点属性更新(CPU) + ↓ +材质可视化(CPU) +``` + +### 9.3 性能优化 + +**冷却速率计算**: +- 使用Ping-Pong双缓冲避免冲突 +- 滑动平均使用历史缓冲,减少计算量 + +**相态判定**: +- 只在温度变化时重新计算 +- 使用标志位避免重复判定 + +**可视化**: +- 临时效果使用简单着色器 +- 最终效果复用现有材质系统 + +--- + +## 10. 参数配置 + +### 10.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 | 回火松弛时间 | + +### 10.2 调试工具 + +- 体素可视化:显示温度、冷却速率、相态 +- 顶点属性检查:硬度、脆性、应力值 +- 时间线:记录淬火-回火过程 +- 统计面板:覆盖率、平均硬度、最大脆性 + +--- + +## 11. 实施计划 + +### 11.1 第一阶段:核心公式(1天) + +- 冷却速率计算 +- 硬度/脆性公式 +- 相态判定逻辑 +- 单元测试 + +### 11.2 第二阶段:顶点属性(1天) + +- 顶点属性扩展 +- 公式应用到顶点 +- 材质参数更新 +- 基础可视化 + +### 11.3 第三阶段:三阶段可视化(1-2天) + +- 淬火过程临时效果 +- 冷却过渡动画 +- 回火色系统 +- 氧化层表现 +- UI辅助工具 + +### 11.4 第四阶段:集成测试(0.5天) + +- 完整流程测试 +- 性能Profiling +- 参数调优 +- 文档更新 + +--- + +## 12. 已知限制 + +1. **相变模型经验化**: 真实马氏体转变需要CCT曲线,当前用冷却速率阈值近似 +2. **各向同性假设**: 真实钢有晶粒取向,当前材料各向同性 +3. **简化热力学**: 忽略形变生热、磁性等二次效应 + +--- + +## 13. 引用 + +- 对应需求: [../requirements/05-淬火退火相变需求.md](../requirements/05-淬火退火相变需求.md) +- 总体架构: [00-锻造系统总体技术架构.md](00-锻造系统总体技术架构.md) +- 原始设计文档(归档): [../_archive/plans/2026-01-23-淬火退火相变系统设计.md](../_archive/plans/2026-01-23-淬火退火相变系统设计.md) +- 相关专题(物理模拟): [04-物理模拟-加工硬化与晶粒演化设计.md](04-物理模拟-加工硬化与晶粒演化设计.md) \ No newline at end of file