Unity中利用柏林噪聲(perlinnoise)制作搖擺效果


perlinnoise是unity中Mathf下的一個函數,需要兩個float參數x和y進行采樣,返回一個0-1的float型。

項目里經常要隨機搖擺某些東西,比如攝像機,某個隨機運動的目標等等,都可以用這個函數來搞定。

下面是代碼,掛載到對象上即可使用,目前返回值是一個Vector2,需要的話可以在方法里可以多加一個返回V3

 

using UnityEngine;

public class wiggle : MonoBehaviour
{
    [Range(0, 100)]
    public float amplitude = 1; //搖擺的幅度
    [Range(0.00001f, 0.99999f)]
    public float frequency = 0.98f; //頻率
    [Range(1, 4)]
    public int octaves = 2; //頻程迭代次數
    [Range(0.00001f, 5)]
    public float hold = 0.2f;  //保持(限制)效果

    void Update()
    {
        transform.position = Shake2D(amplitude, frequency, octaves, hold, Time.time);
    }



    public static Vector2 Shake2D(float amplitude, float frequency, int octaves, float holding, float time)
    {
        float valX = 0;
        float valY = 0;

        float iAmplitude = 1;
        float iFrequency = frequency;
        float maxAmplitude = 0;
        float lacunarity = 20;

        for (int i = 0; i < octaves; i++)
        {
            //計算頻率
            float noiseFrequency = time / (1 - iFrequency) / 10;

            //采樣x和y的值
            float perlinValueX = Mathf.PerlinNoise(noiseFrequency, 0.5f);
            float perlinValueY = Mathf.PerlinNoise(0.5f, noiseFrequency);

            //*2 - 1 是為了保持參數范圍是從 -1 到 1.
            perlinValueX = perlinValueX * 2 - 1;
            perlinValueY = perlinValueY * 2 - 1;

            valX += perlinValueX * iAmplitude;
            valY += perlinValueY * iAmplitude;

            //振幅,計算最大振幅以便歸一化
            maxAmplitude += iAmplitude;

            iAmplitude *= holding;
            iFrequency *= lacunarity;
        }


        //歸一化
        valX /= maxAmplitude;
        valY /= maxAmplitude;

        //擴大幅度
        valX *= amplitude;
        valY *= amplitude;

        return new Vector2(valX, valY);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM