UE5 蓝图节点:C++ 实现一维 Perlin 噪声生成
UE5 蓝图节点:C++ 实现一维 Perlin 噪声生成
本示例展示如何在 UE5 中使用 C++ 编写一个可以集成到 Actor 蓝图中的节点,用于生成一维 Perlin 噪声。
代码实现
头文件 (PerlinNoiseLibrary.h)
#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 代码 (PerlinNoiseLibrary.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;
}
使用方法
- 将以上代码添加到你的项目中。
- 在你的蓝图中,添加一个名为 “PerlinNoiseLibrary” 的自定义节点。
- 在该节点中,添加一个名为 “GeneratePerlinNoise” 的函数。
- 该函数接受两个浮点数输入(X 和 Y)并输出一个浮点数(噪声值)。
注意
- 本示例提供的是一个基本的 Perlin 噪声生成器,你可以根据需要对其进行调整和扩展。
- 为了提高性能,建议在游戏启动时初始化噪声数据,并在游戏运行过程中复用它们。
- 你可以根据需要修改
Octaves,Persistence和Scale的值,以调整噪声的细节程度和频率。 - 该代码示例使用的是一维 Perlin 噪声,你可以将其扩展为二维或三维噪声。
原文地址: https://www.cveoy.top/t/topic/jvFS 著作权归作者所有。请勿转载和采集!