顶点色设置成功,顶点从热力体素采样逻辑需要检查,部分热力区域没有采样到顶点
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -25,6 +25,7 @@
|
|||||||
#include "RHIStaticStates.h"
|
#include "RHIStaticStates.h"
|
||||||
#include "ShaderCompilerCore.h"
|
#include "ShaderCompilerCore.h"
|
||||||
#include "ShaderCore.h"
|
#include "ShaderCore.h"
|
||||||
|
#include "GeometryScript/MeshVertexColorFunctions.h"
|
||||||
|
|
||||||
ADynamicIronBlock::ADynamicIronBlock()
|
ADynamicIronBlock::ADynamicIronBlock()
|
||||||
{
|
{
|
||||||
@@ -831,62 +832,74 @@ void ADynamicIronBlock::UpdateVertexColors()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改网格以设置顶点颜色
|
// 准备颜色列表和调试信息
|
||||||
DynMesh->EditMesh([&](FDynamicMesh3& EditMesh)
|
TArray<FLinearColor> VertexColors;
|
||||||
{
|
int32 VertexCount = 0;
|
||||||
// 确保网格启用了顶点颜色属性
|
|
||||||
if (!EditMesh.HasVertexColors())
|
|
||||||
{
|
|
||||||
EditMesh.EnableVertexColors(FVector3f::Zero()); // 初始化为黑色
|
|
||||||
}
|
|
||||||
|
|
||||||
// 遍历所有顶点
|
|
||||||
int32 ColoredVertices = 0;
|
|
||||||
float MinTemp = FLT_MAX;
|
float MinTemp = FLT_MAX;
|
||||||
float MaxTemp = -FLT_MAX;
|
float MaxTemp = -FLT_MAX;
|
||||||
FVector3f FirstVertexColor = FVector3f::Zero();
|
FLinearColor FirstVertexColor = FLinearColor::Black;
|
||||||
float FirstVertexTemp = 0.0f;
|
float FirstVertexTemp = 0.0f;
|
||||||
FVector FirstVertexPos = FVector::ZeroVector;
|
FVector FirstVertexPos = FVector::ZeroVector;
|
||||||
|
|
||||||
for (int32 VertexID : EditMesh.VertexIndicesItr())
|
// 读取网格以获取顶点信息并计算颜色
|
||||||
|
DynMesh->ProcessMesh([&](const FDynamicMesh3& ReadMesh)
|
||||||
{
|
{
|
||||||
|
VertexCount = ReadMesh.MaxVertexID();
|
||||||
|
|
||||||
|
// 预分配颜色数组大小
|
||||||
|
VertexColors.Reserve(VertexCount);
|
||||||
|
|
||||||
|
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);
|
FVector VertexPosFloat(VertexPos.X, VertexPos.Y, VertexPos.Z);
|
||||||
|
|
||||||
// 采样该位置的温度
|
// 采样该位置的温度
|
||||||
float Temperature = SampleTemperatureAtPosition(VertexPosFloat);
|
//float Temperature = SampleTemperatureAtPosition(VertexPosFloat);
|
||||||
|
float Temperature = 900;
|
||||||
// 统计温度范围
|
// 统计温度范围
|
||||||
MinTemp = FMath::Min(MinTemp, Temperature);
|
MinTemp = FMath::Min(MinTemp, Temperature);
|
||||||
MaxTemp = FMath::Max(MaxTemp, Temperature);
|
MaxTemp = FMath::Max(MaxTemp, Temperature);
|
||||||
|
|
||||||
// 将温度转换为黑体辐射颜色
|
// 将温度转换为黑体辐射颜色
|
||||||
FLinearColor TempColor = TemperatureToColor(Temperature);
|
FLinearColor TempColor = TemperatureToColor(Temperature);
|
||||||
|
VertexColors.Add(TempColor);
|
||||||
|
|
||||||
// 设置顶点颜色(FDynamicMesh3使用FVector3f表示颜色,范围0-1)
|
// 记录第一个有效顶点的信息用于调试
|
||||||
FVector3f VertexColor = FVector3f(TempColor.R, TempColor.G, TempColor.B);
|
if (VertexID == 0)
|
||||||
EditMesh.SetVertexColor(VertexID, VertexColor);
|
|
||||||
|
|
||||||
// 记录第一个顶点的信息用于调试
|
|
||||||
if (ColoredVertices == 0)
|
|
||||||
{
|
{
|
||||||
FirstVertexColor = VertexColor;
|
FirstVertexColor = TempColor;
|
||||||
FirstVertexTemp = Temperature;
|
FirstVertexTemp = Temperature;
|
||||||
FirstVertexPos = VertexPosFloat;
|
FirstVertexPos = VertexPosFloat;
|
||||||
}
|
}
|
||||||
|
|
||||||
++ColoredVertices;
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 创建 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("=== UpdateVertexColors Debug Info ==="));
|
||||||
UE_LOG(LogTemp, Warning, TEXT(" Total vertices: %d"), ColoredVertices);
|
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(" 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)"),
|
UE_LOG(LogTemp, Warning, TEXT(" First vertex: Pos=(%.1f, %.1f, %.1f), Temp=%.1f°C, Color=(%.3f, %.3f, %.3f)"),
|
||||||
FirstVertexPos.X, FirstVertexPos.Y, FirstVertexPos.Z,
|
FirstVertexPos.X, FirstVertexPos.Y, FirstVertexPos.Z,
|
||||||
FirstVertexTemp,
|
FirstVertexTemp,
|
||||||
FirstVertexColor.X, FirstVertexColor.Y, FirstVertexColor.Z);
|
FirstVertexColor.R, FirstVertexColor.G, FirstVertexColor.B);
|
||||||
}, EDynamicMeshChangeType::GeneralEdit, EDynamicMeshAttributeChangeFlags::Unknown, false);
|
|
||||||
|
|
||||||
// 通知组件网格已更新
|
// 通知组件网格已更新
|
||||||
DynMeshComp->NotifyMeshUpdated();
|
DynMeshComp->NotifyMeshUpdated();
|
||||||
|
|||||||
Reference in New Issue
Block a user