我用DynamicLOD创建了一个二十面体。这个很好用。现在我想用一张地图来增加地形。首先,我尝试了GrayScale HeightMap。但结果只是随机位移。我试着用下面的B/W图像,得到了以下信息:

在测试中,我使用了B/W图像。

如您所见,没有任何数据显示差距。首先,我认为我在阅读图片时犯了一些错误。但是当我将内存中的数据写回一个文件时,我有相同的图像。
我就是这样读图片的:
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;我将网格导出到搅拌机中,并在那里使用HeightMap,没有任何问题。现在我没有主意了:
编辑:正如Azarus所说,我得到高度值的方式是错误的。现在我用这个:
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];发布于 2019-07-20 23:52:30
你的身高取样似乎是错误的:
heightMap[(point.X * imageWidth) * (point.Y * imageHeight)]这是基本的数学。
答案是一样的,这就是问题1*0=0,0*1=0也是
而你显然想要不同的意见。
假设您正确地读取了图像,然后将2D坐标压缩为1D,下面的公式应该可以工作:
将二维阵列坐标压缩到一维:
Index=(X*RowSize)+Y将此应用于您的代码:
heightMap[(point.X * imageWidth) + point.Y]https://stackoverflow.com/questions/57118229
复制相似问题