顶点色设置成功,顶点从热力体素采样逻辑需要检查,部分热力区域没有采样到顶点
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user