头文件代码:

#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;
}
使用C++编写一个可以在UE5的Actor蓝图中使用的节点功能如下:1、具有两个浮点数输入2、根据这两个浮点数生成一维perlin噪声值3、输出噪声值请提供完整的cpp代码和头文件代码

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

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