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

 

posted @ 2019-07-05 16:28  Jom  阅读(2824)  评论(0编辑  收藏  举报