使用C++编写一个可以在UE5的Actor蓝图中使用的节点功能如下:1、具有两个浮点数输入2、根据这两个浮点数生成一维perlin噪声值3、输出噪声值请提供完整的cpp代码和头文件代码
头文件代码:
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "PerlinNoiseLibrary.generated.h"
UCLASS()
class MYPROJECT_API UPerlinNoiseLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "PerlinNoise")
static float GeneratePerlinNoise(float X, float Y);
};
cpp代码:
#include "PerlinNoiseLibrary.h"
float UPerlinNoiseLibrary::GeneratePerlinNoise(float X, float Y)
{
const int32 NoiseWidth = 256;
const int32 NoiseHeight = 256;
static float Noise[NoiseHeight][NoiseWidth];
static bool bNoiseInitialized = false;
if (!bNoiseInitialized)
{
for (int32 YIndex = 0; YIndex < NoiseHeight; ++YIndex)
{
for (int32 XIndex = 0; XIndex < NoiseWidth; ++XIndex)
{
Noise[YIndex][XIndex] = FMath::FRand();
}
}
bNoiseInitialized = true;
}
const int32 Octaves = 4;
const float Persistence = 0.5f;
const float Scale = 0.1f;
float TotalAmplitude = 0.0f;
float TotalNoise = 0.0f;
for (int32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex)
{
float Frequency = powf(2.0f, OctaveIndex);
float Amplitude = powf(Persistence, OctaveIndex);
TotalAmplitude += Amplitude;
float SampleX = X * Frequency * Scale;
float SampleY = Y * Frequency * Scale;
int32 X0 = FMath::FloorToInt(SampleX);
int32 Y0 = FMath::FloorToInt(SampleY);
int32 X1 = X0 + 1;
int32 Y1 = Y0 + 1;
float FracX = SampleX - X0;
float FracY = SampleY - Y0;
float TopLeft = Noise[Y0 % NoiseHeight][X0 % NoiseWidth];
float TopRight = Noise[Y0 % NoiseHeight][X1 % NoiseWidth];
float BottomLeft = Noise[Y1 % NoiseHeight][X0 % NoiseWidth];
float BottomRight = Noise[Y1 % NoiseHeight][X1 % NoiseWidth];
float TopInterp = FMath::Lerp(TopLeft, TopRight, FracX);
float BottomInterp = FMath::Lerp(BottomLeft, BottomRight, FracX);
float InterpValue = FMath::Lerp(TopInterp, BottomInterp, FracY);
TotalNoise += InterpValue * Amplitude;
}
return TotalNoise / TotalAmplitude;
}
原文地址: http://www.cveoy.top/t/topic/bO6k 著作权归作者所有。请勿转载和采集!