【发布时间】:2019-07-19 18:55:02
【问题描述】:
我使用 DynamicLOD 创建了一个二十面体。这更有效。现在我想使用高度图来添加地形。首先我尝试了灰度高度图。但结果只是随机位移。比我尝试使用下面的黑白图像并得到这个:
如您所见,没有显示差距的数据。 首先,我认为我在阅读图像时遇到了一些错误。但是当我将内存中的数据写回文件时,我有相同的图像。
这就是我阅读图像的方式:
TArray<uint8> TempData;
if (!FFileHelper::LoadFileToArray(TempData, TEXT("../../../../../UnrealProjects/LODTest/Content/Materials/nocompression.png") , FILEREAD_Silent))
{
UE_LOG(LogTemp, Warning, TEXT("Could not load File"));
}
else
{
IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>("ImageWrapper");
TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);
if (!ImageWrapper->SetCompressed(TempData.GetData(), TempData.Num()))
{
UE_LOG(LogTemp, Warning, TEXT("Compress Error"));
}
if (ImageWrapper->GetFormat() != ERGBFormat::Gray)
{
UE_LOG(LogTemp, Warning, TEXT("Not GrayScale"));
}
if (ImageWrapper->GetBitDepth() != 16)
{
UE_LOG(LogTemp, Warning, TEXT("Not 16Bit"));
}
const TArray<uint8>* RawData = nullptr;
if (!ImageWrapper->GetRaw(ERGBFormat::Gray, 16, RawData))
{
UE_LOG(LogTemp, Warning, TEXT("Could not get Raw Data"));
}
else
{
heightValues.SetNum(ImageWrapper->GetWidth() * ImageWrapper->GetHeight());
FMemory::Memcpy(heightValues.GetData(), RawData->GetData(), ImageWrapper->GetWidth() * ImageWrapper->GetHeight() * 2);
UE_LOG(LogTemp, Warning, TEXT("Success"));
}
}
这里是我如何读取值:(点是 UV 坐标)
uint16 heightValue = heightMap[(point.X * imageWidth) * (point.Y * imageHeight)];
float value = heightValue / 65535.f;
return value;
我将网格导出到 Blender 并在那里使用 HeightMap 没有任何问题。 现在我没有想法了:(
编辑: 正如阿扎鲁斯所说,我得到高度值的方式是错误的。现在我用这个:
int32 locX = UKismetMathLibrary::MapRangeClamped(point.X, 0.f, 1.f, 0.f, imageWidth);
int32 locY = UKismetMathLibrary::MapRangeClamped(point.Y, 0.f, 1.f, 0.f, imageHeight);
uint16 heightValue = heightMap[imageWidth * locY + locX];
【问题讨论】:
-
看来我的 UV 是错误的。我会尽快更新问题
-
不是 100% 你的问题是什么?
-
我已经发布了一个答案,请检查这是否是您的数学错误的问题。另外,如果不是,请澄清这里的确切问题,以便我们能够提供更多帮助
标签: c++ unreal-engine4 heightmap