首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由HeightMap生成的球面地形有空隙

由HeightMap生成的球面地形有空隙
EN

Stack Overflow用户
提问于 2019-07-19 18:55:02
回答 1查看 317关注 0票数 1

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

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

如您所见,没有任何数据显示差距。首先,我认为我在阅读图片时犯了一些错误。但是当我将内存中的数据写回一个文件时,我有相同的图像。

我就是这样读图片的:

代码语言:javascript
复制
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坐标)

代码语言:javascript
复制
uint16 heightValue = heightMap[(point.X * imageWidth) * (point.Y * imageHeight)];

float value = heightValue / 65535.f;

return value;

我将网格导出到搅拌机中,并在那里使用HeightMap,没有任何问题。现在我没有主意了:

编辑:正如Azarus所说,我得到高度值的方式是错误的。现在我用这个:

代码语言:javascript
复制
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];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-20 23:52:30

你的身高取样似乎是错误的:

代码语言:javascript
复制
heightMap[(point.X * imageWidth) * (point.Y * imageHeight)]

这是基本的数学。

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

答案是一样的,这就是问题1*0=00*1=0也是

而你显然想要不同的意见。

假设您正确地读取了图像,然后将2D坐标压缩为1D,下面的公式应该可以工作:

将二维阵列坐标压缩到一维:

代码语言:javascript
复制
Index=(X*RowSize)+Y

将此应用于您的代码:

代码语言:javascript
复制
heightMap[(point.X * imageWidth) + point.Y]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57118229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档