- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 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;
我将 Mesh 导出到 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]
关于c++ - 从 HeightMap 生成的球形地形有间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57118229/
我用 DynamicLOD 创建了一个二十面体。这很管用。现在我想使用高度图来添加地形。首先,我尝试使用 GrayScale HeightMap。但结果只是随机位移。比我尝试使用下面的黑白图像并得到这
我想在建模为高度图的世界地面上的 OpenGL 场景中跟踪鼠标坐标。目前没有像硬件镶嵌这样的花哨的东西。注意这个问题是不是 关于物体拾取。 目前我正在执行以下操作,由于回读操作,这显然会降低性能: 渲
我想渲染地形并根据高度应用颜色。 我正在编写一个 Qt 项目,所以使用 QGlShaderProgram。 我的地形网格从 (0,0,0) 到 (1000,0,1000),顶点每隔 100 个长度单位
我是一名优秀的程序员,十分优秀!