[英]Spherical Terrain generated from HeightMap has Gaps
我用 DynamicLOD 創建了一個二十面體。 這很好用。 現在我想使用高度圖來添加地形。 首先,我嘗試使用 GrayScale HeightMap。 但結果只是隨機位移。 比我嘗試使用下面的黑白圖像並得到這個:
如您所見,沒有顯示差距的數據。 首先,我以為我在閱讀圖像時遇到了一些錯誤。 但是當我將內存中的數據寫回文件時,我有相同的圖像。
這就是我閱讀圖像的方式:
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,沒有任何問題。 現在我沒有想法了:(
編輯:正如 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];
您的高度采樣似乎是錯誤的:
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.