簡體   English   中英

從 HeightMap 生成的球形地形有間隙

[英]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)]

這真的是基礎數學。

  • 如果 X 是 0 而 Y 是 1 呢?
  • 如果 X 是 1 而 Y 是 0 呢?

答案是一樣的,這就是問題1*0=00*1=0

雖然您顯然想要不同的輸入。

假設您已正確讀取圖像,那么只需將 2D 坐標壓縮為 1D,以下公式就可以工作:

將二維數組坐標壓縮為一維:

Index=(X*RowSize)+Y

將此應用於您的代碼:

heightMap[(point.X * imageWidth) + point.Y]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM