docs: 添加物理模拟与淬火系统技术设计
design/04 仅保留加工硬化与晶粒演化,应力/淬火部分引用 design/05、design/06。design/05 涵盖温度区间、冷却速率、Sigmoid 硬度映射、相态系统、三阶段可视化(过程高辨识→冷却过渡→真实回火色)。 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -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<FVector>* InitialPositions;
|
||||||
|
|
||||||
|
// 累积塑性应变(0-1,归一化)
|
||||||
|
TDynamicMeshVertexAttribute<float>* AccumulatedStrain;
|
||||||
|
|
||||||
|
// 当前硬度系数(0-1,0=最软,1=最硬)
|
||||||
|
TDynamicMeshVertexAttribute<float>* HardnessCoefficient;
|
||||||
|
|
||||||
|
// 打磨度(表面状态,0=生锈,1=光亮)
|
||||||
|
TDynamicMeshVertexAttribute<float>* PolishAmount;
|
||||||
|
|
||||||
|
// 晶粒尺寸(0-1,归一化,0=细晶粒,1=粗晶粒)
|
||||||
|
TDynamicMeshVertexAttribute<float>* GrainSize;
|
||||||
|
|
||||||
|
// 应力值(简化标量,0-1,0=无应力,1=高应力)
|
||||||
|
// 应力系统详细内容见设计文档06
|
||||||
|
TDynamicMeshVertexAttribute<float>* StressValue;
|
||||||
|
|
||||||
|
// 应力方向(可选,三维向量)
|
||||||
|
TDynamicMeshVertexAttribute<FVector>* 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<int32>* MaterialLayerID =
|
||||||
|
new TDynamicMeshVertexAttribute<int32>(&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<float4> TemperatureBufferA; // 温度 + 塑性系数
|
||||||
|
RWStructuredBuffer<float4> TemperatureBufferB; // Ping-Pong
|
||||||
|
|
||||||
|
RWStructuredBuffer<float4> 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<FMetallurgyComputeShader> 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)
|
||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user