顶点色设置成功,顶点从热力体素采样逻辑需要检查,部分热力区域没有采样到顶点

This commit is contained in:
zhangqing
2025-12-22 18:45:49 +08:00
parent 511f43f2c0
commit de8b523c3d
3 changed files with 48 additions and 35 deletions
Binary file not shown.
Binary file not shown.
+48 -35
View File
@@ -25,6 +25,7 @@
#include "RHIStaticStates.h"
#include "ShaderCompilerCore.h"
#include "ShaderCore.h"
#include "GeometryScript/MeshVertexColorFunctions.h"
ADynamicIronBlock::ADynamicIronBlock()
{
@@ -831,62 +832,74 @@ void ADynamicIronBlock::UpdateVertexColors()
return;
}
// 修改网格以设置顶点颜色
DynMesh->EditMesh([&](FDynamicMesh3& EditMesh)
// 准备颜色列表和调试信息
TArray<FLinearColor> VertexColors;
int32 VertexCount = 0;
float MinTemp = FLT_MAX;
float MaxTemp = -FLT_MAX;
FLinearColor FirstVertexColor = FLinearColor::Black;
float FirstVertexTemp = 0.0f;
FVector FirstVertexPos = FVector::ZeroVector;
// 读取网格以获取顶点信息并计算颜色
DynMesh->ProcessMesh([&](const FDynamicMesh3& ReadMesh)
{
// 确保网格启用了顶点颜色属性
if (!EditMesh.HasVertexColors())
{
EditMesh.EnableVertexColors(FVector3f::Zero()); // 初始化为黑色
}
VertexCount = ReadMesh.MaxVertexID();
// 遍历所有顶点
int32 ColoredVertices = 0;
float MinTemp = FLT_MAX;
float MaxTemp = -FLT_MAX;
FVector3f FirstVertexColor = FVector3f::Zero();
float FirstVertexTemp = 0.0f;
FVector FirstVertexPos = FVector::ZeroVector;
// 预分配颜色数组大小
VertexColors.Reserve(VertexCount);
for (int32 VertexID : EditMesh.VertexIndicesItr())
for (int32 VertexID = 0; VertexID < VertexCount; ++VertexID)
{
if (!ReadMesh.IsVertex(VertexID))
{
// 对于无效顶点,使用默认颜色
VertexColors.Add(FLinearColor::Black);
continue;
}
// 获取顶点位置(局部坐标)
FVector3d VertexPos = EditMesh.GetVertex(VertexID);
FVector3d VertexPos = ReadMesh.GetVertex(VertexID);
FVector VertexPosFloat(VertexPos.X, VertexPos.Y, VertexPos.Z);
// 采样该位置的温度
float Temperature = SampleTemperatureAtPosition(VertexPosFloat);
//float Temperature = SampleTemperatureAtPosition(VertexPosFloat);
float Temperature = 900;
// 统计温度范围
MinTemp = FMath::Min(MinTemp, Temperature);
MaxTemp = FMath::Max(MaxTemp, Temperature);
// 将温度转换为黑体辐射颜色
FLinearColor TempColor = TemperatureToColor(Temperature);
VertexColors.Add(TempColor);
// 设置顶点颜色(FDynamicMesh3使用FVector3f表示颜色,范围0-1)
FVector3f VertexColor = FVector3f(TempColor.R, TempColor.G, TempColor.B);
EditMesh.SetVertexColor(VertexID, VertexColor);
// 记录第一个顶点的信息用于调试
if (ColoredVertices == 0)
// 记录第一个有效顶点的信息用于调试
if (VertexID == 0)
{
FirstVertexColor = VertexColor;
FirstVertexColor = TempColor;
FirstVertexTemp = Temperature;
FirstVertexPos = VertexPosFloat;
}
++ColoredVertices;
}
});
UE_LOG(LogTemp, Warning, TEXT("=== UpdateVertexColors Debug Info ==="));
UE_LOG(LogTemp, Warning, TEXT(" Total vertices: %d"), ColoredVertices);
UE_LOG(LogTemp, Warning, TEXT(" Temperature range: %.1f°C - %.1f°C"), MinTemp, MaxTemp);
UE_LOG(LogTemp, Warning, TEXT(" First vertex: Pos=(%.1f, %.1f, %.1f), Temp=%.1f°C, Color=(%.3f, %.3f, %.3f)"),
FirstVertexPos.X, FirstVertexPos.Y, FirstVertexPos.Z,
FirstVertexTemp,
FirstVertexColor.X, FirstVertexColor.Y, FirstVertexColor.Z);
}, EDynamicMeshChangeType::GeneralEdit, EDynamicMeshAttributeChangeFlags::Unknown, false);
// 创建 FGeometryScriptColorList 并关联颜色数组
FGeometryScriptColorList ColorList;
ColorList.List = MakeShared<TArray<FLinearColor>>(MoveTemp(VertexColors));
// 使用 GeometryScript 设置顶点颜色
UGeometryScriptLibrary_MeshVertexColorFunctions::SetMeshPerVertexColors(
DynMesh,
ColorList
);
UE_LOG(LogTemp, Warning, TEXT("=== UpdateVertexColors Debug Info ==="));
UE_LOG(LogTemp, Warning, TEXT(" Total vertices: %d"), VertexCount);
UE_LOG(LogTemp, Warning, TEXT(" Temperature range: %.1f°C - %.1f°C"), MinTemp, MaxTemp);
UE_LOG(LogTemp, Warning, TEXT(" First vertex: Pos=(%.1f, %.1f, %.1f), Temp=%.1f°C, Color=(%.3f, %.3f, %.3f)"),
FirstVertexPos.X, FirstVertexPos.Y, FirstVertexPos.Z,
FirstVertexTemp,
FirstVertexColor.R, FirstVertexColor.G, FirstVertexColor.B);
// 通知组件网格已更新
DynMeshComp->NotifyMeshUpdated();