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;
}

使用方法

  1. 将以上代码添加到你的项目中。
  2. 在你的蓝图中,添加一个名为 “PerlinNoiseLibrary” 的自定义节点。
  3. 在该节点中,添加一个名为 “GeneratePerlinNoise” 的函数。
  4. 该函数接受两个浮点数输入(X 和 Y)并输出一个浮点数(噪声值)。

注意

  • 本示例提供的是一个基本的 Perlin 噪声生成器,你可以根据需要对其进行调整和扩展。
  • 为了提高性能,建议在游戏启动时初始化噪声数据,并在游戏运行过程中复用它们。
  • 你可以根据需要修改 Octaves, PersistenceScale 的值,以调整噪声的细节程度和频率。
  • 该代码示例使用的是一维 Perlin 噪声,你可以将其扩展为二维或三维噪声。
UE5 蓝图节点:C++ 实现一维 Perlin 噪声生成

原文地址: https://www.cveoy.top/t/topic/jvFS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录